기존에 zerossl에서 발급받았던 인증서가 만료되어, certbot을 이용해서 letsencrypt 인증서를 발급하려고 한다.
1. cerbot 설치
$ sudo apt update
$ sudo apt install certbot python3-certbot-nginx
2. 인증서 발급
이때 certonly 옵션으로 자동설정이 아닌 인증서 다운만 하게끔 설정한다.
자동설정으로 하는 경우 꼬이는 경우가 있음,..
sudo certbot certonly --nginx -d balpyo.site
--debug 명령어를 주게 되면 문제 발생 시 로그를 확인할 수 있음
에러가 발생하면 도메인을 구매한 호스팅 업체에 dns 설정을 한 번 체크해보세요.
발급 완료가 되었으면 pem 키가 생성된 위치에 키를 확인하고
nginx 설정으로 들어가서
인증서 적용 링크를 해당 위치로 기재해줍니다.
그리고 이렇게 설정은 했는데 도메인에서 적용은 됐지만 불완전한 인증서로 출력되는 경우가 발생할 수 있는데
브라우저에서는 https을 사용할 수 없다고 출력되고 있어. certificate is not valid가 계속 출력되는 경우가 있음
1. 인증서 발급 상태 확인
먼저 인증서가 제대로 설치되었는지 발급된 인증서 목록을 확인해보자
sudo certbot certificates
Certificate Name: balpyo.site
Domains: balpyo.site www.balpyo.site
Expiry Date: 2024-10-26 23:59:59+00:00 (VALID: 90 days)
Certificate Path: /etc/letsencrypt/live/balpyo.site/fullchain.pem
Private Key Path: /etc/letsencrypt/live/balpyo.site/privkey.pem
이렇게 뜨면 정상임
2. Nginx 설정 파일 확인
Nginx 설정 파일에서 올바른 인증서와 키 파일이 사용되고 있는지 다시 한 번 확인합니다. 예를 들어 /etc/nginx/sites-available/balpyo.site
파일에서 다음과 같이 설정되어 있는지 확인합니다:
server {
listen 80;
server_name balpyo.site www.balpyo.site;
location /.well-known/acme-challenge/ {
root /var/www/html;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name balpyo.site www.balpyo.site;
ssl_certificate /etc/letsencrypt/live/balpyo.site/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/balpyo.site/privkey.pem;
root /var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
3. Nginx 재시작
Nginx 설정을 테스트하고 Nginx를 재시작합니다:
sudo nginx -t sudo systemctl restart nginx
4. 브라우저 캐시 및 HSTS 설정 초기화
브라우저 캐시와 HSTS 설정을 초기화합니다. 브라우저에 따라 다음 단계를 따르세요.
Chrome:
chrome://net-internals/#hsts
로 이동합니다.- "Delete domain security policies" 섹션에
www.balpyo.site
를 입력하고 "Delete" 버튼을 클릭합니다.
5. 서버 로그 확인
Nginx 오류 로그를 확인하여 추가적인 정보를 얻습니다:
sudo tail -f /var/log/nginx/error.log
Nginx 설정 파일에 SSL 관련 설정을 추가하는 이유는 보안과 성능을 최적화하고 SSL/TLS 연결 문제를 해결하기 위해서입니다. 각 설정 항목의 역할은 다음과 같습니다:
ssl_protocols TLSv1.2 TLSv1.3;
: 지원할 TLS 프로토콜 버전을 지정합니다. 최신 버전인 TLS 1.2와 TLS 1.3을 사용하여 보안을 강화합니다.ssl_ciphers '...'
: 사용할 암호화 스위트를 지정합니다. 보안에 취약한 암호화 알고리즘을 제외하고 강력한 암호화 알고리즘을 사용하도록 설정합니다.ssl_prefer_server_ciphers on;
: 클라이언트가 아닌 서버에서 암호화 스위트를 선택하도록 합니다. 이를 통해 서버에서 더 강력한 암호화 스위트를 사용할 수 있습니다.ssl_session_cache shared:SSL:10m;
: SSL 세션 캐시를 설정하여 성능을 향상시킵니다.ssl_session_timeout 10m;
: SSL 세션의 타임아웃을 설정합니다.add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
: HTTP Strict Transport Security (HSTS)를 설정하여 브라우저가 항상 HTTPS를 사용하도록 강제합니다.ssl_stapling on;
: OCSP 스테이플링을 활성화하여 인증서 상태를 확인하는 동안 성능을 향상시킵니다.ssl_stapling_verify on;
: OCSP 응답의 유효성을 검사합니다.
OpenSSL 버전은 최신이 아니지만, OpenSSL 3.0.2는 충분히 최신 버전입니다. 설정 파일에 SSL 관련 설정을 추가한 후 Nginx를 재시작하면 SSL/TLS 문제를 해결하는 데 도움이 될 수 있습니다.
이때는 nginx 파일에 아래 설정을 해줘야 정상적으로 진행할 수 있음...!
설정을 완료 했으면
테스트 후 재시작
sudo nginx -t
sudo systemctl restart nginx
https://www.ssllabs.com/ssltest/analyze.html?d=balpyo.site
ssllabs에서 내 인증서 상태를 확인해볼 수도 있음...!
reference
https://velog.io/@hoooons/AWS-EC2-Nginx%EC%97%90-SSL-%EC%84%A4%EC%A0%95-https-%EC%A0%81%EC%9A%A9