[Linux] nginx에 certbot으로 SSL(https) 보안 인증서 적용하기
프로젝트를 배포하고 SSL 설정은 급한게 아니라 천천히 하려고 했지만 배포한 http에서 cookie에 저장이 안되는 이슈가 생겼다....이유는 https 적용할 경우 해결된다고 해서 부랴부랴 cerbot으로 SSL 적용을 했다 !
Let's Encrypt이란 ?
Let's Encrypt는 무료 SSL/TLS 인증서를 얻고 설치할 수 있는 인증 기관으로, 웹 서버에서 암호화된 HTTPS를 사용할 수 있도록 해줍니다. 또한 Certbot이라는 자동화 클라이언트를 제공하여 Apache 및 nginx에서 인증서를 획득하고, 설치하는 전체 프로세스가 자동화 되어있습니다.
참고로 Let's Encrypt 인증서의 경우 유효기간은 3개월(90일)로 기간이 짧습니다. 가장 큰 이유로는 짧은 주기의 자동 갱신을 권장하여 인증서가 무력화되더라도 그 피해를 최소화하기 위함이라고 합니다 !
인증서 설치하기
Certbot 설치하기
Certbot을 설치하고 nginx 연동을 위해 puthon2-chertbot-nginx도 설치합니다 !
// certbot 설치하기
$ sudo apt install certbot
// 웹서버(nginx) 플러그인 설치하기
$ sudo apt install certbot python3-certbot-nginx
nginx 중지하기
현재 구동되고 있는 웹 서비스를 잠시 중단하고 진행해야됩니다 !
$ sudo systemctl stop nginx
인증서 생성 및 발급하기
아래의 명령어를 통해 인증서를 설치할 수 있습니다 ! -d 인자 뒤에는 지정할 도메인을 입력해주면 됩니다 !
$ sudo certbot certonly --standalone -d yourdomain.com
인증서 발급을 요청했을 때 몇가지 확인 사항들이 나옵니다 !
1. 도메인 관리자의 이메일 주소를 입력합니다. 해당 메일을 통해 갱신 알림과 주요 소식들이 발송됩니다.
2. 이용에 관한 동의 및 인증 기관에 등록되는 사항에 관한 동의입니다 !
3. 제 3자 정보제공에 관한 동의입니다 (N 입력)
* 내용을 꼭 확인해보시고 다른 내용이 나왔을 경우 알맞게 대응하시면됩니다 !
인증서 발급 내역 조회하기
발급된 인증서의 세부적인 정보를 확인하려면 아래 명령어를 통해 확인할 수 있습니다 :)
$ sudo certbot certificates
nginx 환경설정
마지막으로 발급된 인증서를 통해 nginx에 설정을 해주어야 정상적으로 적용이되겠죠 !?
아래의 정보는 제 기준으로 작성되었고 참고해서 작성해주시면 됩니다 !
server {
if ($host = yourdomain) {
return 301 https://$host$request_uri;
}
listen 80;
server_name yourdomain;
location / {
root /usr/local/my-app/build;
index index.html index.htm;
try_files $uri $uri/ index.html;
}
return 404;
}
server {
server_name yourdomain;
listen 443 ssl http2;
server_name yourdomain www.yourdomain;
location / {
root /usr/local/my-app/build;
index index.html index.htm;
try_files $uri $uri/ index.html;
}
ssl_certificate /etc/letsencrypt/live/yourdomain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain/privkey.pem;
}
설정을 마무리한 뒤 nginx을 실행 시켜주는거 잊으시면 안됩니다 !
$ systemctl start nginx
인증서 자동 갱신하기
인증서의 유효기간은 90일이기 때문에 만료 전 갱신이 필요합니다 !
아래 명령어를 통해 해당 문구를 크론탭 제일 마지막 줄에서 엔터 후 입력하시면됩니다.
$ sudo crontab -e
// 매달 1일 자정에 갱신 시도, 갱신 후 nginx 재시작
0 0 1 * * certbot renew --renew-hook="sudo systemctl restart nginx"
// 인증서 갱신 테스트
$ sudo certbot renew --dry-run
// 인증서 갱신
$ sudo certbot renew
// 인증서 만료일 확인
$ sudo certbot certificates