보안 도구 사용방법

무선WiFi(OTA)를 이용한 IoT 인증서 업로드 및 통신

Security_Info 2020. 2. 6. 00:56

현재 무선 IoT 보안실험에 사용하고 있는 IoT 프로젝트의 Mqtt를 활용한 보안 셋팅을 위한 절차를 적고자합니다.

 

목표는 다음과 같습니다.

 

1. 브로커 겸 인증서 발급 서버에서 클라이언트 인증서 자동 갱신 및 단말기로의 자동 전송 진행

2. 전송된 인증서는 로드하여 브로커<->단말기 간 'MQTT기반 TLS/SSL' 통신 진행

3. TLS/SSL 통신중인 상태에서 특정 토픽으로 추후 사용할 대칭키를 각 단말기에 전송

*이때 각 단말기는 이미  인증서 로드 후, MQTT연결 진행과정에서 특정 토픽을 SUBSCRIBE

4. 브로커 겸 인증서 발급 서버가 다운될 시, 단말기들은 '재연결 실패횟수'를 통해 서버의 다운을 감지하게되며 이후

단말 간의 통신 진행

5. 단말 간 통신 진행 시 브로커 겸 인증서 발급 서버로부터 이미 전달받은 대칭키를 이용하여 'LEA암호' 통신 수행

*대칭키는 브로커 겸 인증서 발급 서버로부터 전달받으며 TLS/SSL 통신에 의해 암호화 전송되어 대칭키 노출 방어

 

인증서 유출 시 새로운 인증서 발급을 통해 유출된 인증서 방어, 서버 다운으로 인한 각 단말 간  데이터 전송 시 데이터 유출 방어

 

셋팅 진행은 다음과 같습니다.

 

1. 브로커 겸 인증서 담당 서버에서 단말기(Clinet)의 인증서를 자동으로 갱신한다

2. 갱신된 인증서는 전송은 소켓통신으로 진행한다.

3. 전송에 대한 상세 절차는 WiFi무선기반 TCP/IP(OTA - Over the Air) 절차로 진행하며,

인증서를 받는 단말기(Clinet)는 서버가 되어 IP/PORT 오픈을 하여 브로커 겸 인증서 발급 서버로부터 인증서를 받을 준비를 한다.

4. 브로커 겸 인증서 발급 서버는 리스닝된 단말기로 소켓연결을 한다.

5. 연결된 단말기로 갱신된 단말기 인증서를 전송한다.

6. 전송된 인증서는 단말기의 SPIFFS에 업로드 한다.

7. 업로드된 인증서는 단말기에서 로드한다.

8. 인증서가 로드된 단말기는 MQTT PUB/SUB 코드에 의해서 PUB/SUB를 진행한다.

9. SUB 진행 시 대칭키 수신을 위해 특정 토픽을 SUB한다. 이때 TLS/SSL로 대칭키는 암호화 처리

10. MQTT통신 중 브로커 겸 인증서 발급 서버 다운 시, 서버 재접속 카운팅을 통하여 다운 여부 확인 진행을 한다.

11. 목표치 카운팅에 도달 시, 각 단말기는 각자의 역할에 맞게 Receive 혹은 Send를 한다.

10. 데이터 Send 시, 8,9에 의해 전달받은 대칭키를 이용하여 전송 데이터를 LEA암호로 암호화 처리하여

상대 단말에 전송

11. 데이터 Receive 시 8,9에 의해 전달받은 대칭키를 이용하여 전송 받은 데이터를 LEA암호로 복호화 처리하여

전송 받은 데이터를 이용하여 이후 자신의 일을 수행

 

 

 

위 셋업을 진행하기위한 하드웨어/소프트웨어 설정 방법입니다.

1. OpenSSL 및 Mosquitto 셋팅

(Mosquitto 셋업 https://secu-lee-ty.tistory.com/entry/Cent-OS%EC%97%90%EC%84%9C-Mosquitto-%EC%85%8B%EC%97%85%ED%95%98%EA%B8%B0)

 

Cent OS에서 Mosquitto 셋업하기

그동안 IOT와 관련 보안 논문을 리딩하며 관련 공부를 하던도중 때마침, IOT 보안 관련 - 박사 논문 실험에 참여하게 되었다.. 그리고 바로 나는 Cent OS에서 Mosquitto를 셋업할 필요가 생겼다. Mosquitto는 MQTT..

secu-lee-ty.tistory.com

(OpenSSL 셋업 https://secu-lee-ty.tistory.com/entry/centOS-openssl-%EC%84%A4%EC%B9%98)

 

CentOS OpenSSL 설치

앞서 Mosquitto에 관한 셋업을 진행 하였으며, 이제 암호화 통신을 위해서는 OpenSSL을 설치하며 통신 간 암호화를 위한 관련 인증서 파일을 추출해야한다. OpenSSL 설치 1. OpenSSL 다운로드 wget wget https://w..

secu-lee-ty.tistory.com

 

2. OpenSSL을 이용하여 사용할 인증서 셋팅

(https://secu-lee-ty.tistory.com/entry/openSSL%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-Mosquitto-%EC%A4%91%EA%B3%84%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-MQTT-%EC%95%94%ED%98%B8%ED%99%94-%ED%86%B5%EC%8B%9C?category=785056 )

 

Mosquitto Broker를 이용한 MQTT 암호화 통신 방법 & OpenSSL 인증서 사용 방법

이전 게시글들에서는 CentOS 상에서 Mosquitto 셋업 방법과 OpenSSL 설치 방법을 알아봤다. 지금 부터는 OpenSSL 인증서를 발급하며, 암호화 통신을 위한 셋업을 할 것이다. openSSL 인증서 셋업 openssl genrsa -..

secu-lee-ty.tistory.com

 

3. Mosquitto.conf 셋팅

인증서 경로 지정
tls 관련 설정 진행

4. 아두이노 셋팅

4-1 아두이노를 설치합니다.

4-2 파일> 환경설정> 추가적인 보드매니저URLs에 밑의 주소를 입력> 확인

http://arduino.esp8266.com/stable/package_esp8266com_index.json

4-3 툴> 보드> 보드매니저> esp8266 검색> 설치

4-4 툴> 보드> NodeMcu1.0 선택

4-5 툴> 포트> 지정포트 선택(필자는 COM4떠서 선택함)

4-6 자신의 아두이노 작업폴더 이동

나의 아두이노 폴더

4-7 data폴더 생성

생성된 data폴더

4-8. 생성된 데이터폴더에 초기 사용할 인증서 .der 셋업

*TIP  초기에는 무조건 수동으로 셋팅 해줘야됩니다.
*TIP  der 생성 방법

openssl x509 -in client.crt -outform der -out clientesp.der (이름은 마음대로)
openssl rsa -in client.key -outform der -out espkey.der (이름은 마음대로)

 

*TIP MQTT서버 Fingerprint 추출

openssl x509 -noout -in server.crt -fingerprint

 

꿀팁 openssl x509 -noout -in server.crt -fingerprint | awk -F = '{print$2}' > hash_file
이렇게 특정 파일에 추출해서 넣을 수도 있습니다.

4-9 data 폴더에 der파일을 올립니다.

4-10 툴> esp8266 sketch data upload> 자동으로 spiffs 인증서 업로드 진행

 

 

5. WIFI통신을 위해 OTA 셋업

5-1 예제> Arduino OTA> Basic OTA

5-2 ssid(자신의 wifi아이디), password(자신의 wifi아이디 비밀번호) 입력> 업로드

5-3 Basic OTA 코드를 복붙해서 자기 작업 코드에 가져옵니다.

(추후 자기 작업코드에서 OTA 적용시키기 위해)

 

여러분 여기까지 현재 data 폴더의 인증서 업로드 및 OTA 업로드를 했습니다. 여기까지 온것도 장합니다.

 

6. OTA 포트 셋업

6-1 툴> 포트> 자기 단말기 IP와 이상한 영어들이 합쳐진것을 선택합니다.

 

 

자 여기까지가 아두이노 하드웨어 셋팅방법이였습니다.

그럼 소스코드로 소켓+자동갱신/업로드+단말간암호화통신+MQTT PUB/SUB를 구현해야합니다.

 

그러나 여러분들의 시간과 저의 시간을 아끼기 위해 이렇게 깃헙에 코드를 올려놓았습니다. 

 

 

자동 갱신은 Bash 스크립트로 구현했습니다.
소켓통신 및 자동 업로드는 리눅스기반의 C로 구현했습니다.
그외 암호화통신/MQTT PUB/SUB는 아두이노에서 구현했습니다.

https://github.com/LeeJuWan/IoT_openSSL_MQTT

 

LeeJuWan/IoT_openSSL_MQTT

Contribute to LeeJuWan/IoT_openSSL_MQTT development by creating an account on GitHub.

github.com

 

* 그리고 자꾸 하다보면 이상한 NoAnwser이 나오는데, 그럴땐 단말기에 Flash를 누른상태에서 RST를 누릅니다.

이후 다시 data폴더에 인증서를 esp8266 sketch data upload 해줍니다.

(주의! 포트를 com포트로 해야 업로드가능합니다.)

이후 다시 5번(WIFI통신을 위해 OTA 셋업)의 과정을 거쳐야합니다. 

마지막으로 다시 포트를 단말기의IP+이상한 영어가 된 포트로 선택합니다.

 

하여간 NoAnwser이거 뜨면 귀찮습니다..