아,, 

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 수정

아무것도 모를 때 혼자 정리해보겠답시고 쓴 글이라 정보가 부정확할 수 있습니다.

많은 분들이 봐주고 계신지 몰랐네요 ^^

어쩌다 오랜만에 티스토리 들어왔는데 제 글을 보고 계신 분이 꽤 있어 노파심에 첨언합니다.

제 경험을 공유한 글이지, 정확한 정보를 전달하기 위한 글이 아니었다는 점 고려하고 봐주세요.

감사합니다.

'Programming > Node.js / Javascript' 카테고리의 다른 글

[Javascript] prototype 이해하기  (0) 2017.09.19
[Javascript] var 와 let  (0) 2017.09.18
[Javascript] this keyword 이해하기  (1) 2017.09.18

http://soul0.tistory.com/361

#MOTIVATION


한양대학교 내 이곳저곳 무분별하게 뿌려져 미관을 해치는 전단지들을 보며 기획하게 된 앱.

요즘같은 IT 시대에 저런 종이들을 뿌려가며 홍보할 수 밖에 없나 통탄하며 만들게 되었다.



#GOAL


1. 한양대학교 학생들이 보다 편리하게 한양대학교 근처 배달음식들을 접할 수 있도록 하자.

2. 전단지가 사라지는 그날까지!



#ENVIRONMENT


Android 2.2 이상

Android, JAVA / Eclipse



#POSITION


팀장.

기획 및 개발 총괄 & 역할 분담.



#FEATURES


 단위 화면

세부 항목

기능 설명 

 식당 정보

분류

해당 식당의 주력 메뉴를 기준으로 분류 기능 제공

리스트

선택한 분류에 해당하는 식당 리스트 제공

 즐겨찾기

 즐겨찾기 추가 / 삭제 기능

식당 세부정보 

전화번호

 배달 가능한 매장 전화번호 (최대 두개) 제공. 전화 걸기 버튼 포함.

매장 정보

매장 위치를 표시한 지도, 주소, 배달 가능시간 제공 

 메뉴 안내

해당 식당의 메뉴 / 가격 정보 제공 

 평점

1~5점 평점 기능 

 마이페이지

즐겨찾기 확인 

즐겨찾기에 추가된 식당 리스트만 모아서 제공 




#SCREENSHOTS

  

  

  




#SELF-FEEDBACK


너무 뭘 모를 때라, 코드 열어보면 엉망이다.


이제 막 printf("Hello, World!!\n"); 도 처음 찍어봤던 시절인데 뭘 바라겠냐 싶기도 하지만

아직도 생생히 기억나는 잘못들이 있다.



1. Fragment 가 뭐예요?


Fragment 는 커녕 Activity, Activity Life cycle 도 몰랐던 시절이라, 저런 탭들을 어떻게 효율적으로 구성할 수 있을지 알지 못했다.

덕분에 위 스크린샷에 보이는 버튼들을 일일이 모든 Activity 에 복붙했었다.

그저 기능이 돌아가는 걸 보는 것이 우선이었던 시절.


2. 과도한 이미지 활용


있는 코드도 못 쓰는데 지도 API를 어떻게 썼겠어.

저거 다 그냥 이미지다.

심지어 메뉴 정보도 이미지..

아마 정해진 기한 내에 메뉴 뷰를 구성하는 것은 너무 어렵다고 생각했던 것 같다.



사실 다시 만들게 될 일도 없고, 이미 같은 기능의 훌륭한 앱이 있지만

언젠가 이 앱의 코드를 리팩토링할 기회가 생긴다면 위의 두가지를 가장 우선적으로 고치지 않을까.

+ Recent posts