웹사이트의 보안을 강화하는 데 있어 SSL 인증서는 필수적이다. 그런데 인증서의 설치와 관리 방식에 따라 경험이 천차만별일 수 있자. 여기서는 주로 사용되는 세 가지 방식을 비교해보고, 어떤 방법이 가장 효율적인지 알아보겠자.
그래서 이 글에서는 Certbot을 이용하는 과정을 단계별로 기록하고자 한다.
도메인 이름 (예: bellboy.example.com)
해당 도메인 이름으로 작성된 Nginx 설정 파일 (cfg)
설치 과정
Certbot과 Certbot-Nginx 플러그인을 설치한다.
sudo apt update
sudo apt install python3 python3-venv
sudo apt install libaugeas0
pip install certbot
pip install certbot-nginx
sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot
#just in case
#sudo apt-get remove certbot
원하는 도메인 이름으로 인증서를 발급한다.
sudo certbot --nginx -d bellboy.example.com
#혹은 여러 도메인을 지정할 수도 있자.
sudo certbot --nginx -d bellboy.example.com -d bellman.example.com
Certbot은 Nginx 설정 파일을 자동으로 수정하여 아래와 같이 SSL을 설정한다. 설정파일의 위치는 "etc/nginx/sites-available/default" 사용했다. ("/etc/nginx/nginx.conf" 이 파일에도 가능하지만 sites-available 아래에 있는 파일로 하는 것이 복잡한 관리에 더 편리하다)
# common login service
server {
if ($host = bellboy.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
# 기타 설정...
}
server {
listen 443 ssl;
server_name bellboy.example.com;
ssl_certificate /etc/letsencrypt/live/bellboy.example.com/fullchain.pem; # managed by Certbot
# 기타 설정...
}
변경된 설정을 적용하기 위해 Nginx를 재시작한다.
sudo nginx -t && sudo systemctl reload nginx
인증서를 자동으로 갱신하기 위해 crontab에 작업을 추가한다.하루에 두 번 확인해서 만료가 다가온 인증서는 자동으로 갱신되도록 한다.
sudo crontab -e
15 17,0 * * * /usr/local/bin/certbot renew --config-dir /home/<myhome>/letsencrypt/config --work-dir /home/<myhome>/letsencrypt/work --logs-dir /home/<myhome>/letsencrypt/logs --pre-hook "sudo service nginx reload" --post-hook "sudo service nginx reload" >> /home/<myhome>/cron.log 2>&1
certbot 자체가 sudo 권한으로 실행돠어야 하므로 아래와 같이 권한을 부여해 줘야한다.
sudo visudo <loginid> ALL=(ALL) NOPASSWD: /usr/bin/certbot renew --pre-hook "service nginx reload" --post-hook "service nginx reload" --quiet
certbot 실행 중 권한 문제 발생하지 않도록 설정
mkdir -p /home/<myhome>/letsencrypt/{config,work,logs}
sudo certbot certificates
만으로도 전체 내용을 볼 수 있지만 어느 도메인을 위한 인증서가 언제 만료되는 지 보려면 아래와 같은 명령어로 쉽게 확인 가능하다.
sudo certbot certificates | grep -E '(Domains:|Expiry Date:)'
Certbot을 사용하니 복잡했던 인증서 설정 과정이 간단해졌고, 더 이상 돈 걱정도 하지 않아도 되는 것이 놀라운 경험이었자. 이제 누구나 쉽게 보안을 강화할 수 있는 이 방법을 활용하면, 웹사이트 운영이 한층 더 편리해질 것이다. 1분만 투자해보자. 보안 걱정은 Certbot이 해결해줄 것이다!
일하다보면 반복적으로 사용할 수 있는 데 이럴 땐 다음만 참고하자
server {
if ($host = mysvc.example.com) {
return 301 https://$host$request_uri;
}
listen 80;
server_name mysvc.example.com;
#return 404;
}
server {
listen 443 ssl;
server_name mysvc.example.com;
error_page 403 404 500 502 503 504 /errors/$status.html;
location /errors/ {
alias /var/www/errors/;
}
location / {
proxy_pass http://localhost:8080;
proxy_intercept_errors on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
sudo certbot --nginx -d bellboy.example.com
sudo nginx -t && sudo systemctl reload nginx
while true; do echo -e "HTTP/1.1 200 OK\n\n Hello, World!" | nc -l -p 8080 -q 1; done