본문 바로가기

카테고리 없음

Certbot으로 SSL 인증서 발급하기

기존에 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:

  1. chrome://net-internals/#hsts로 이동합니다.
  2. "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