본문 바로가기

main/Node.js

[Node] API 통신용 포트에도 SSL 적용시키기

일반 유저가 접속하는 80, 443 포트 외에 정보를 받아와야 하는 API 주소(다른 포트번호)에는 SSL이 적용되지 않아서

ERR_SSL_PROTOCAL_ERROR를 받았다.

 

처음에는 임시로 프론트에서 해결해보고자 React에

<meta httpEquiv="Content-Security-Policy" content="upgrade-insecure-requests" />

이 meta 태그를 입력했는데 일단 임시방편이기도 하지만 이렇게 넣어줘도 통신이 되지는 않았다.

 

 

Node.js의 구동 코드에 SSL인증서 파일을 입력해주면 된다.

var app = require('../app');

// HTTPS
const https = require('https');
const fs = require('fs');

const options = {
  key: fs.readFileSync('privkey.pem'),
  cert: fs.readFileSync('fullchain.pem')
}


var port = normalizePort(process.env.PORT);
app.set('port', port);

var server = https.createServer(options, app);

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

인증서 파일은 복사해서 같은 경로에 두었는데 이 경우 나중에 갱신되었을 때 복사도 같이 해줘야 할 것 같은 느낌이다.

원래 경로를 참조하게 만드는 게 좋을지 어떨지 생각을 좀 해봐야겠다.

 

let's encrypt를 사용하였고

options의 key:에는 privkey, cert:에는 fullchain을 입력했다.

 

 

-발생했던 에러

error:0909006C:PEM routines:get_name:no start line

https://stackoverflow.com/questions/63030755/error-error0909006cpem-routinesget-nameno-start-line-node

-----BEGIN CERTIFICATE----- 잘 되어있고 /n 문제는 아닌 것 같아 보였는데

자세히 보니 key와 cert에 들어갈 인증서가 뒤바껴 있었다.. 제대로 넣어주니 바로 해결됨 ㅎㅎ..

 

unable to verify the first certificate

npm config set registry http://registry.npmjs.org/ --global

구글링 해보니 이거 해보래서 해봤는데 위 명령어로는 해결이 안 되었고

https://www.npmjs.com/package/ssl-root-cas

cert 부분에는 fullchain이 들어가야 하나보다. 고쳤더니 해결.

 

request to https://IP주소 failed, reason: Hostname/IP does not match certificate's altnames: IP: IP주소 is not in the cert's list

https://discourse.nodered.org/t/hostname-ip-does-not-match-certificates-alternates/48195

let's encrypt는 공개 인증 기관이라 쉽게 스푸핑되기 때문에 IP주소에 대한 인증서 생성을 허용하지 않는다고 함.

IP주소로 API를 부르고 있었어서 DNS네임으로 바꿔주었더니 해결되었다.

 

이제 잘 됨!