기존에 쓰던 인증서 스크립트가 정상작동하지 않아서 좀 더 편하게 인증서 갱신할 수 있는지 찾아봤더니 acme.sh라는 let’s encrypt 인증서 자동 갱신 도구를 누군가 만들어뒀다. 먼저, 아래와 같은 명령어를 입력해서 acme.sh를 설치하자.
curl https://get.acme.sh | sh
설치가 완료되었다면 . ~/.bashrc
또는 . ~/.zshrc
를 입력한 이후, acme.sh를 입력하면 다음과 같이 help 가 나오면 된다.
위와 같이 정상적으로 나온다면, 인증서를 생성해야하는데 mkdir -p /etc/nginx/ssl
와 같이 인증서를 관리할 폴더를 먼저 만들어야한다.
인증서를 생성하기에 앞서 route53에 접근할 수 있는 iam계정을 생성해야한다.
링크에 접속해서 위의 그림과 같이 사용자 추가 버튼을 눌러 사용자 추가를 해야한다.
acme.sh는 액세스키와 시크릿키를 사용해서 도메인 설정을 하므로 위의 그림처럼 프로그래밍 방식 액세스를 허용해야한다.
그리고 route53에 접근할 수 있도록 DomainsFullAccess, FullAccess 권한을 허용하도록 체크해야한다.
그리고 마지막으로 이동해서 액세스키와 시크릿키를 메모해두고 아래와 같이 환경변수를 설정해야한다.
# export AWS_ACCESS_KEY_ID="A??????????????????X"
# export AWS_SECRET_ACCESS_KEY="5?????????????????????????????S"
이제 아래의 명령어를 입력해서 인증서를 생성할 수 있게됐다.
acme.sh --issue --dns dns_aws -d '[domain]' --yes-I-know-dns-manual-mode-enough-go-ahead-please
acme.sh --installcert -d 'domain' \
--key-file /etc/nginx/ssl/[domain].key \
--fullchain-file /etc/nginx/ssl/[domain]-fullchain.cer \
--reloadcmd "service nginx force-reload"
위와 같이 입력하면 해당 이전에 만들어둔 폴더에 복사가 진행되므로, 인증서 관련 작업은 모두 끝났다. 이제부터는 이 인증서를 이용해서 웹 서버에 설정을 해줘야하는데, 아래와 같이 설정해주면 된다.
# dhparam.pem 생성
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
# /etc/nginx/sites-enabled/[domain]에 아래의 설정 추가
server {
...
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/[domain]-fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/[domain].key;
include /etc/nginx/ssl/options-ssl-nginx.conf;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
...
}
# vi /etc/nginx/ssl/options-ssl-nginx.conf 파일 생성
ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA";
위와 같이 모두 설정한 이후에, service nginx restart
를 실행해서 정상적으로 재시작되는지 확인하면 된다. 그리고 acme.sh의 편리한 점이 재발급을 위해서 따로 crontab을 설정해둘 필요가 없다. 인증서를 생성한 시점에서 사용한 route53 iam계정의 액세스, 시크릿키를 내부적으로 저장해두고 있다가 acme.sh를 설치할때 crontab이 자동으로 만들어지는데 이때, 저장된 키를 사용해서 인증서를 재발급해준다.