2016년 11월 1일 화요일

Nodejs 서버에 Let's Encrypt 설치해서 https 적용 후기

daag.pe.kr에 https를 적용해달라는 요청이 있어서 그동안 봐두었던 Let's Encrypt를 적용한 후기를 남긴다.

1.
우선 Let's Encrypt에 접속해서 Getting Started를 가보니 shell 접근이 가능하면 certbot을 사용하면 편할거라고 한다. certbot 페이지에 가보면 nodejs는 선택지에 없다. 그리고 난데없이 certonly를 하라고 하고, webroot를 하라고 하는 등... 난 nodejs인데.. 하면서 letsencrypt와 nodejs, express로 검색을 하다보면 letsenrypt-express가 검색이 되서 나오게 된다. 설명을 보면 등록부터 사용, 갱신까지 다 알아서 해주는 것 처럼 보인다. 이렇게 생각하면 여기서 헤매게 된다.

2.
우선 키발급을 먼저 하고, 그 다음에 서버에 적용할 생각을 해야 하는데, 키발급을 인터넷 사이트에서 하려고 생각하는 순간 역시 헤매게 된다. 그러다가 certbot의 문서 중 이곳을 천천히 읽다가 키발급의 원리를 깨닫고 나서야 진행이 쉽게 되었다.

This will carry out the steps needed to validate that you control the domain(s) you are requesting a cert for, obtain a cert for the specified domain(s), and place it in the /etc/letsencryptdirectory on your machine

키발급을 요청하는 사람이 그 도메인에 대한 진짜 주인인지를 판단을 해야 하는데, 그 방법을 해당 도메인의 루트에 특정 파일을 심어 놓고 외부에서 접속해서 그 파일을 확인하는 방법을 사용한다. (아마 그런 것 같다)

3.
그래서 certbot에게 certonly라는 명령으로 키발급만 한다고 알려주고, --standalone으로 직접 80/443 서버를 띄워서 도메인을 확인하거나, --webroot-path 옵션으로 기존에 떠있는 서버를 이용해서 도메인을 확인하는 과정을 거쳐야 /etc/letsencrypt 디렉토리에 pem 파일이 생성된다.

sudo ./certbot-auto certonly --standalone -d 도메인주소

또는

sudo ./certbot-auto certonly --webroot-path 도메인주소로접근시서비스되는디렉토리 -d 도메인주소

이렇게 하고, 이메일 주소를 더 넣거나 하는 등의 과정을 거치면 아래처럼 정상메시지를 볼 수 있다.

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/도메인주소/fullchain.pem. Your cert will
   expire on 2017-01-29. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot-auto again. To
   non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate

   Donating to EFF:                    https://eff.org/donate-le

4.
이 때 standalone으로 하는데, 80이나 443포트를 다른 프로세스에서 사용중이면 안된다. 그리고 443포트가 외부에서 접근이 가능한 상태인지, AWS의 경우 Security Group을 확인해줘야 한다.

5.
이제 nodejs 서버의 express에 letsencrypt-express를 적용하면 된다. 예제코드처럼 express()를 한번 래핑하는 식으로 쉽게 구현이 가능하다. 물론 실제 코드에서는 config 파일을 이용해서 아래처럼 구현한다.

```
var express = require('./config/express');

var app = require('letsencrypt-express').create({
        server: config.https.server,
        email: config.https.email,
        agreeTos: true,
        approveDomains: config.https.domains,
        app: express()
}).listen(config.port, config.https.port);


6.
nodejs 서버는 ubuntu 계정에서 실행하기 때문에 포트포워딩도 해줘야 한다.

```
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3080
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 3443

7.
서버를 띄우면 알아서 /etc/letsencrypt/ 에서 발급된 키파일을 이용해서 서버를 띄워주는 것 같다. 그리고 초반에 server를 'staging'으로 해서 한번 띄우고 나면 다시 운영모드로 server를 바꾸고 서버를 재시작해도 키발급자가 "Fake LE Intermediate X1"으로 뜨면서 인증되지 않은 인증서라고 나오는 경우가 있다. 이럴 때는 ~/letsencrypt 디렉토리를 한번 삭제해주면 된다.

8.
그래서 이 작은 초록색 자물쇠를 결국 얻어냈다. ㅎㅎㅎ


댓글 3개:

  1. 안녕하세요. 저도 letsencrypt로 고생하고 있는데요. 저는 ~/letsencrypt/etc만 있고 /etc/letsencrypt는 없는데 저는 경로를 다 ~/letsencrypt/etc로 하면 되는건가요?

    답글삭제
  2. 안녕하세요. 저도 letsencrypt로 고생하고 있는데요. 저는 ~/letsencrypt/etc만 있고 /etc/letsencrypt는 없는데 저는 경로를 다 ~/letsencrypt/etc로 하면 되는건가요?

    답글삭제