티스토리 뷰

기본 출처는 다음과 같고 내 상황에 맞게 이런저런 수정과 코멘트를 추가했다.

https://github.com/Entware-ng/Entware-ng/wiki/Using-Let's-Encrypt


먼저 필요한 package를 설치한다. 대상 기기(예를 들어 공유기)에 optware/entware가 이미 설치되어 있다고 가정.

opkg install bash ca-certificates coreutils-mktemp curl diffutils grep nginx openssl-util


let's encrypt 공식 툴은 python 기반으로 되어 있는데 리눅스 쉘 환경에서 가능하게 해주는 스크립트를 다운로드 한다. (프로젝트 이름이 바뀌어서 파일 이름이 letsencrypt.sh에서 dehydrated로 바뀌었다.)

cd /opt/etc/nginx

curl -O https://raw.githubusercontent.com/lukas2511/dehydrated/master/dehydrated


어차피 수동으로 일일이 실행할 것이라면 모르겠는데, cron을 이용하여 인증서 자동 갱신을 하려면 chmod +x /opt/etc/nginx/dehydrated을 이용해서 실행 권한을 주는 것이 좋을 듯...


다음은 도메인 소유권 확인(ACME-challenge)을 위한 서버 설정 추가. 아래 명령어로 수정하면 되고...

vi /opt/etc/nginx/nginx.conf


여기서는 이렇게 간단하게 나와있고,

server {

  [...]

  location /.well-known/acme-challenge {

    alias /var/www/dehydrated;

  }

  [...]

}


여기서는 조금 더 자세하고,

server {

  listen              80;

  listen              [::]:80;

  server_name         example.net example.org;

  location '/.well-known/acme-challenge' {

  default_type "text/plain";

    root        /tmp/letsencrypt-auto;

  }


  location / {

    return              301 https://$server_name$request_uri;

  }

}


여기서는 location block을 include하는 방식.

location ^~ /.well-known/acme-challenge/ {

  default_type "text/plain";

  root         /usr/share/nginx/html;

}


location = /.well-known/acme-challenge/ {

    return 404;

}


나는 마지막을 참고했다. root는 일종의 dummy인데, nginx 기본 경로이지만 안쓰는 /opt/share/nginx/html로 설정했다.


서버 재시작을 하고,

/opt/etc/init.d/S80nginx start


dehydrated 설정 파일 생성하고 WELLKNOWN 디렉토리도 생성해둔다. 여기 경로는 아마 앞서 설정한 location block의 root 경로와 같아야 할 것이다.

echo WELLKNOWN="/opt/share/nginx/html/.well-known/acme-challenge" > config

mkdir -p /opt/share/nginx/html/.well-known/acme-challenge


이제 스크립트를 이용해서 SSL 인증서를 발급한다.

bash ./dehydrated --domain my.domain.com --cron


여러 도메인이 있으면 --domain domain.com --domain my1.domain.com --domain my2.domain.com 이런 식으로 옵션을 준다. nginx를 reverse proxy로 사용하려고 하는데, let's encrypt는 아직 wildcard를 지원하지 않아서 모든 subdomain을 일일이 등록하는 수 밖에 없는 듯 하다. 어떤 도메인에 대한 인증서인지 그리고 추후 갱신을 위해 renew_certs.sh와 같은 스크립트를 만들어서 진행하는 것이 좋다.


그 다음은 DH parameter 생성. 잘은 모르겠지만 서버 단에서 추가적인 key를 생성하는 것 같다. 더 나은 보안 등급을 위해서는 필수인 듯. 참고로 꽤 오래 걸린다.

openssl dhparam -out dhparams.pem 2048


SSL 관련 서버 설정을 별도의 폴더(미관상의 이유로)에 저장한다.

vi /opt/etc/nginx/conf.d/ssl.conf


ssl_certificate /opt/etc/nginx/certs/my.domain.ru/fullchain.pem;

ssl_certificate_key /opt/etc/nginx/certs/my.domain.ru/privkey.pem;

ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

ssl_prefer_server_ciphers on;

ssl_dhparam /opt/etc/nginx/dhparams.pem;


ssl_session_cache shared:SSL:10m;

ssl_session_timeout 5m;

# ssl_stapling on;


add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";


HSTS를 적용하지 않으려면 맨 마지막 줄을 주석처리한다. 도메인에 연결된 모든 서버가 적절하게 준비되지 않은 상태에서 HSTS enable할 경우 많은 서비스가 접속 불능에 빠질 수 있다. (경험담...) 모질라의 자동 서버 설정을 통해서도 할 수 있다.


3개월까지만 유효하고 1개월 전부터 갱신이 가능하다. 갱신은 발급과 같은 명령어로 하면 나머지는 스크립트가 알아서 해 준다. 인증 받을 도메인이 추가/제거되어 변경이 생기면 자동으로 탐지해서 다시 발급하고, 동일하다면 갱신을 시도하는데 가능한 기간이 아니면 자동으로 skip한다.





저작자 표시 비영리 동일 조건 변경 허락
신고
댓글
댓글쓰기 폼
공지사항
Total
801,211
Today
13
Yesterday
185
«   2017/11   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
글 보관함