짧은 기간 동안 오픈 되는 이벤트 페이지가 있어서 Let’s Encrypt에서 발급 가능한 무료 SSL(Secure Socket Layer)을 적용시켜보려고 한다. SSL을 왜 사용하고 HTTPS는 무엇일까?
HTTPS를 사용하는 이유
HTTP를 사용하는 것은 서버-클라이언트 간의 트래픽을 암호화 하지 않기 때문에, 해커가 중간에 트래픽을 가로챌 경우 어떤 내용을 보고 있고 입력하였는지 다 알아낼 수 있다. HTTPS는 트래픽을 SSL프로토콜을 이용하게 되면 암호화 하기 때문에 서버와 클라이언트가 암호화된 트래픽을 주고받게 된다. 이 경우에는 해커가 중간에 트래픽을 가로채더라도 무슨 내용인지 알수 없게 된다.
💡 CA(인증기관, Certificate Authority)
CA(인증 기관)는 인증 기관이라고도 하며 웹사이트, 이메일 주소, 회사 또는 개인의 디지털 신원을 확인하는 기관입니다. 예를 들어, 웹 브라우저는 CA와 협력하여 웹 사이트를 인증함으로써 해당 웹 사이트가 해커나 악의적인 행위자에 의해 운영되지 않도록 보장합니다. 인증 기관이 존재하지 않는다면 인터넷을 통해 민감한 정보를 쇼핑하거나 뱅킹하거나 전송하는 것은 안전하지 않습니다.
Let’s Encrypt 사용 이유
Let's Encrypt는 인증서 발급 및 갱신에 대한 비용이 무료이다. Certbot과 같은 자동화 도구를 사용하면 쉽게 발급, 설치, 갱신할 수 있는 장점이 있다. 그렇게 때문에 해당 CA를 사용한다.
Let's Encrypt 인증서 GoDaddy API로 서버에 적용하기
도메인을 GoDaddy에서 구매했기 때문에 Godadday API를 사용하려고 한다. 해당 Github를 참고해서 작업하였다. Certbot을 사용해서 인증서를 발급 받으려고 한다.
1. Certbot 설치
sudo apt install certbot
2. GoDaddy API 키 생성
- GoDaddy 관리자 에 접속해서 계정에 로그인 한다.
- API Keys 탭에서 Create New API Key 버튼을 클릭한다.
- 원하는 옵션을 선택해서 생성된 API Key와 Secret Key를 안전하게 보관한다.
3. python venv 가상 환경 생성 및 GoDaddy DNS API 플러그인 설치
sudo python3 -m venv ~/.certbot
sudo source .certbot/bin/activate
sudo pip install -U certbot-dns-godaddy
- 새로운 가상 환경을 ~/.certbot 위치에 생성한다.
- 현재 세션에 가상 환경을 활성화 한다.
- 플러그인 설치
4. credentials.ini 파일 생성
[godaddy]
dns_godaddy_secret = YOUR API SECRET
dns_godaddy_key = YOUR API KEY
5. 인증서 발급
필수 옵션과 필요한 옵션들을 입력하고 인증서를 생성한다.
sudo certbot certonly \\
--authenticator dns-godaddy \\
--dns-godaddy-credentials ~/.secrets/certbot/credentials.ini \\
--keep-until-expiring --non-interactive --expand \\
--server <https://acme-staging-v02.api.letsencrypt.org/directory> \\
-d bikefestival.kr -d *.bikefestival.kr \\
--agree-tos \\
--email dev@example.com
- --server 옵션을 보게 되면 staging 으로 테스트 할 때 사용하면 된다.
6. 로그 확인
인증서 발급이 문제가 없는지 확인하려면 .log 파일을 확인하면 된다.
로그 파일 위치 : /var/log/letsencrypt/letsencrypt.log
2024-03-27 07:09:00,269:DEBUG:acme.client:Received response:
HTTP 200
Server: nginx
Date: Wed, 27 Mar 2024 07:09:00 GMT
Content-Type: application/pem-certificate-chain
Content-Length: 4131
Connection: keep-alive
Cache-Control: public, max-age=0, no-cache
Link: <https://acme-staging-v02.api.letsencrypt.org/directory>;rel="index", <https://acme-staging-v02.api.letsencrypt.org/acme/cert/2be0582fb14fe0ab8aa5ecc07fd6aef7b7e0/1>;rel="alternate"
Replay-Nonce: V0toffPYAuaSY0q-XnzVDZ4UBs-xp1ZNRzVjbt8-pEHUYmUuJV8
X-Frame-Options: DENY
Strict-Transport-Security: max-age=604800
~
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/domain.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/domain.com/privkey.pem
This certificate expires on 2024-06-25.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
추가로 Web Server로 Nginx을 사용하고 있기 때문에, 인증서와 키 파일을 서버 설정에 적용해야 한다.
Mozilla SSL Configuration Generator 을 활용해서 안전한 SSL/TLS 설정에 대한 최신 권장 사항을 적용 시켜보려고 한다.
'Linux' 카테고리의 다른 글
[Linux] 로컬에서 SSH 키로 리눅스 서버 접속 (3) | 2024.05.28 |
---|