아,,
https://www.npmjs.com/package/mqtt
npm mqtt 페이지인데
가타부타 말 없이
"In case mqtts (mqtt over tls) is required, the options
object is passed through to tls.connect()
. "
라고만 나와있어서 삽질 엄청 했다.
너무 빡쳐서 정리해둬야겠다.
broker 로는 mosquitto 활용
node.js 에서 mqtts connection 을 구현하려면 두가지 단계가 있는데,
일단 mosquitto broker setting 을 해줘야하고
두번째로는 mqtts 로 mosquitto broker 에 접근할 수 있도록 node.js 코드도 수정해줘야한다.
#인증서 생성 및 Mosquitto Setting
http://firstheart.tistory.com/entry/Mosquitto-TLS-%EC%84%A4%EC%A0%95
여기 되게 상세하게 잘 나와있긴한데
굳이 다시 한번 정리해보자면
1. 서버 인증서 생성 (생성할 위치는 마음대로)
> openssl genrsa -des3 -out server.key 2048
> openssl genrsa -out server.key 2048
> openssl req -out server.csr -key server.key -new
까지 하고
원 블로그 글에는 CA directory 를 생성해서 어쩌고 라고 되어있는데, 역시나 path는 그냥 마음대로 하면 되는 것 같다.
> wget https://github.com/owntracks/tools/raw/master/TLS/generate-CA.sh
(Mac의 경우 wget 단계에서 막히면 brew wget 해주면 됨. brew 도 안 깔려 있으면 음.. 깔아서 쓰세요 맥주잔 떠서 귀엽습니다 ㅎㅎ)
> sh ./generate-CA.sh
그렇게 하면 파일들이 주루룩 생성된다.
ca.crt, ca.key, ca.srl, localhost.crt, localhost.csr, localhost.key
이후에는
>openssl x509 -req -in server.csr -CA <ca.crt FILE_PATH> -CAkey <ca.key FILE_PATH> -CAcreateserial -out server.crt -days <duration>
요렇게 해주면 서버키 설정 끝..인 것 같다.
2. Mosquitto Config file 수정
>cp ca.crt /etc/mosquitto
>cp localhost.crt localhost.key /etc/mosquitto
이렇게 파일을 복사해줘야하는데, 저 경로가 골때린다.
나는 Mac을 쓰는데 /etc/mosquitto directory 가 없어..
찾아봤더니 내 경우에는
/usr/local/etc/mosquitto
directory에 mosquitto.conf 파일이 있기에, 저기다가 옮겼다.
이제 mosquitto.conf 파일을 수정해줘야 한다.
port 8883
protocol mqtt
두 줄을 추가하고
cafile <path>/ca.crt
certfile <path>/localhost.crt
keyfile <path>/localhost.key
요렇게 하고 저장 후에 mosquitto 를 -c <config file path> 옵션과 함께 재실행해주면 끝!!
mosquitto 에 설정이 잘 됐는지 테스트 해보려면아래 커맨드를 실행해보자 (돌려보는 거임)
>mosquitto_sub -h localhost -p 8883 --cafile /usr/local/etc/mosquitto/ca.crt -t test
>mosquitto_pub -h localhost -p 8883 --cafile /usr/local/etc/mosquitto/ca.crt -t test -m "TEST~~~~ LALA~"
잘 나온다면 설정이 잘 된 거다.
3. 클라이언트 인증서 생성
> openssl genrsa -des3 -out client.key 2048
> openssl req -out client.csr -key client.key -new
> openssl x509 -req -in client.csr -CA <ca.crt FILE_PATH> -CAkey <ca.key FILE_PATH> -CAcreateserial -out client.crt -days <duration>
#Node.js Code
나는 요거 하다가 너무 화났다.내가 바보라 그런 걸수도 있는데, tls.connect()를 어쩌구 하라는 부분 너무 성의없어.
원래 보통의 mqtt connection을 할 때는
var mqtt = require('mqtt');
var client = mqtt.connect('mqtt://localhost:1883');
뭐 이 정도만 적어도 잘 돌아갔다.
여기에 ssl 을 적용하려면 mqtt.connect 에 넣어주는 파라미터가 좀 바뀐다.
var mqtt = require('mqtt');
var fs = require('fs');
var options = {
host: '127.0.0.1',
port: 8883,
protocol: 'mqtts',
protocolId: 'MQIsdp',
ca: [fs.readFileSync('<path>/ca.crt')],
key: fs.readFileSync('<path>/client.key'),
cert: fs.readFileSync('<path>/client.crt'),
passphrase: 'CLIENT KEY PASSPHRASE',
secureProtocol: 'TLSv1_method',
protocolVersion: 3
};
var client = mqtt.connect(options);
요렇게 해주면 짜잔짜잔 엄청 잘 돌아간다.
휴 삽질 너무 많이 하다 성공해서 빡쳐서 정리용으로 글 하나 쌌다.
저 options 에서 꼭 제대로 반영해줘야 하는 값들은 ca, key, cert, passphrase 이고, 나머지는 위와 동일하게 넣어도 무방하다.
*2022.12 수정
아무것도 모를 때 혼자 정리해보겠답시고 쓴 글이라 정보가 부정확할 수 있습니다.
많은 분들이 봐주고 계신지 몰랐네요 ^^
어쩌다 오랜만에 티스토리 들어왔는데 제 글을 보고 계신 분이 꽤 있어 노파심에 첨언합니다.
제 경험을 공유한 글이지, 정확한 정보를 전달하기 위한 글이 아니었다는 점 고려하고 봐주세요.
감사합니다.