nodeMCU Pushbullet HTTPS Handshake Fail Error: 40 나의 경험담 2019.05.01 15:55

nodeMCU로 Pushbullet API를 이용하려 했으나 Error: 40 에러코드를 뱉으면서 연결이 안된다. 이것 저것 검색해봐도, 딱히 왜 안되는지 정확히 나와 있는 곳은 없고 심지어 잘된다는 블로그 글만 있는 것이 아닌가. 답답한 마음에 디버그 바이너리까지 넣어서 다른 서버에도 붙여보면서 테스트 해 보았지만 정확한 이유를 알 수 없어서 Stackoverflow에 글을 올렸고, Marcel Stör로부터 친절한 설명을 들을 수 있었다.

아래는 내 질문 글이며, 결론은 현재 nodeMCU는 SNI를 지원하지 않아서 Handshake 과정에서 서버가 Alert 메세지를 (Error 40) 내려보내고, nodeMCU는 handshake 과정을 종료하여 HTTPS 연결이 실패하게 된다. Why nodeMCU tls mbed library got error 40(handshake fail) from Pushbullet API server?

SNI Server Name Indicator 란?

공교롭게도 최근에 SNI 정보를 활용해서 불법사이트를 차단하는 절차가 이슈가 되어서 국문으로 쉽게 설명된 글이 많다. 아래 블로그에 설명이 잘되어 있는데, 간단하게 설명하자면 단일 서버에서 여러개의 도메인을 서비스 할 수 있도록 클라이언트가 도메인 정보를 서버로 보내면, 서버에서 그에 맞는 인증서를 사용한다는 것이다. 이 케이스에서는, nodeMCU가 SNI를 지원하지 않으므로, 도메인 정보를 안보내고, 서버는 인증서를 결정할 수 없으므로 Alert Message를 보내서 Handshake 과정을 종료시켜버리는 것이다.

SNI(Server Name Indication)

TLS의 확장 표준 중 하나로, 인증서에서 사용하는 방식이다. 이 기술이 나오게 된 큰 이유는 하나의 웹서버가 여러 웹사이트를 서비스하면서 인증서 인증에 문제가 생겼기 때문이다. 기존까지는 대상 서버의 IP 주소와 도메인이 1:1 대응 관계라서 서버의 인증서 제공에 문제가 없었지만, 여러 도메인을 하나의 IP 주소로 연결하는 서비스가 대중화되면서 보낼 인증서를 특정하지 못하게 되었다. 이 때문에 클라이언트가 사이트에 접속하면서 도메인 정보를 보내도록 변경한 것이다. - 나무위키, SNI

대안은?

nodeMCU TLS가 SNI를 지원하지 않는이상 바로 Pushbullet을 사용할 수는 없을 것 같고, proxy server를 거치거나 TLS 모듈을 다른 것으로 바꾸거나 해야 하는데, 둘 다 쉽지 않은 일이라서 썩 내키지가 않는다.ㅠ Pushbullet 이외의 다른 서비스를 고려해 봐야겠다. 어차피 한달에 500건 밖에 안되는 것도 좀 그렇고...