티스토리 뷰
기본 출처는 다음과 같고 내 상황에 맞게 이런저런 수정과 코멘트를 추가했다.
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한다.
'생활 속 > 홈서버' 카테고리의 다른 글
RT-N56U에 Entware-ng (16) | 2016.10.05 |
---|---|
ASUS RT-N56U Cloudflare를 이용한 DDNS (34) | 2016.09.22 |
Plex Media Server (14) | 2016.07.21 |
Synology에 Flexget 설치하기 (25) | 2016.01.19 |
Synology ipkg 환경 설정 (26) | 2016.01.19 |