AWS 설정들

EP05. AL2023 SSL 적용

나는야리코더 2024. 9. 26. 11:48

* Let's Encrypt에서 발행해 주는 무료 SSL 증명서 사용

> 무료이기 때문에 인증서의 유효기간은 3개월.

> 자동으로 3개월마다 갱신할 수 있도록 할거임.

> Let's Encrypt를 사용하기 위해서 설치해야 하는 프로그램 = Certbot

> 쉘에서 Certbot을 설치하고 도메인에 연결하면 Let's Encrypt에서 발행한 SSL 인증서를 사용할 수 있는 것임.

 

1. 쉘로 내 서버에 접속하여 관리자 권한 실행

> sudo su

 

2. 오픈 ssl 설치를 위해 아래 명령어 실행

> dnf install openssl mod_ssl

> [y/N] : 선택하는 입력란 나오면 y 치고 enter

 

3. certbot이 python에 의존해서 돌아가는 프로그램이기 때문에 python과 함께 라이브러리 pip 설치 -> python 환경이 만들어진 것

> sudo dnf install -y python3 augeas-libs pip

 

4. python 가상 환경을 조금 더 설정해야 함. 아래 명령어 실행

> sudo python3 -m venv /opt/certbot/

> ls /opt/certbot 

> 파일 디렉토리가 보이면 정상적으로 설치된 것.

 

5. pip 최신 버전으로 업그레이드 (pip는 python의 패키지 관리프로그램임)

> sudo /opt/certbot/bin/pip install --upgrade pip

 

6. certbot 설치

> sudo /opt/certbot/bin/pip install certbot

 

7. certbot 설치 후 내 서버에 certbot이 어디에 있는지 경로를 알려줘야 certbot실행 가능

> sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot

> 설치가 완료 됐으면 certbot을 이용해서 인증서를 받아야 함.

> 인증서를 받고 내 도메인에 연결만 해주면 끝.

 

8. 웹사이트 멈추기

> sudo systemctl stop httpd 

 

9. certbot 이용해서 인증서 받기

> sudo certbot certonly --standalone

> 이메일입력, Y, N, 도메인입력

 

10. 받은 인증서를 Apache 설정 프로그램에 설정하기 (ssl에 관한 config 파일 수)

> sudo vi /etc/httpd/conf.d/ssl.conf

> 맨 아래로 가서 'i'를 누르고 virtualhost 추가.

> 도메인 수정해서 입력하고 'esc', :wq로 수정 내용 저장 후 에디터 나가기.

 

<VirtualHost *:443>

DocumentRoot "/var/www/html" ServerAlias 도메인

SSLEngine on SSLCertificateFile /etc/letsencrypt/live/도메인/cert.pem

SSLCertificateKeyFile /etc/letsencrypt/live/도메인/privkey.pem

SSLCertificateChainFile /etc/letsencrypt/live/도메인/chain.pem

</VirtualHost>

 

11. Apache 설정 수정 했으니 재실행하기

> sudo systemctl restart httpd

 

--> 웹브라우저에서 [ https://도메인 ] 입력해서 잘 나오면 ssl 인증서 적용 성공! 

 

12. 인증서 자동 갱신 설정하기

> sudo dnf install cronie-noanacron

> y

> sudo vi /etc/crontab

> 추가할 내용 :  30 1 * * 2 root /usr/bin/certbot renew --post-hook "systemctl reload httpd"

> 매주 화요일, 1시 30분에 root 권한으로 명령어 실행하겠다.

( root /usr/bin/certbot renew --post : 리뉴얼 하는 명령어임. 30일 이내에 요청을 한다면 리뉴얼이 되는 것. 나는 자동 갱신임.)


아래 추가 내용


Let's Encrypt 인증서를 얻는 방식에는 크게 2가지가 있습니다:

  1. standalone 방식 (현재 사용 중)
  • 인증 과정에서 certbot이 독립적으로 임시 웹서버를 실행
  • 포트 80을 사용해야 해서 Apache를 중지해야 함
  • 간단하지만 인증서 갱신 시 서비스 중단 필요
  1. webroot 방식
  • Apache가 실행 중인 상태에서 웹 서버의 디렉토리를 통해 인증
  • 웹 서버 중단 없이 인증 가능
  • 지정된 웹 루트 디렉토리(/var/www/html)를 통해 인증

현재는 standalone 방식을 사용 중이므로, 인증서 갱신 때마다:

  1. Apache 중지
  2. 인증서 갱신
  3. Apache 재시작

이 과정이 필요합니다.

기존 설정대로 유지한다면, crontab의 갱신 명령에 Apache 중지/시작 명령을 포함해야 합니다.

 

> 30 1 * * 2 root systemctl stop httpd && /usr/bin/certbot renew && systemctl start httpd

이렇게 하면 매주 화요일 새벽 1시 30분에 잠시 서비스가 중단되긴 하지만, 현재 설정을 크게 바꾸지 않고도 자동 갱신이 가능합니다!

 

하지만 대부분 서비스는 webroot 방식을 많이 사용합니다.

그 이유는:

  1. 서비스 연속성
    • 인증서 갱신 시 서비스 중단 없음
    • 사용자 경험에 영향 없음
  2. 안정성
    • Apache 재시작 과정에서 발생할 수 있는 문제 방지
    • 갱신 실패 시에도 기존 서비스 영향 없음
  3. 유지보수 용이성
    • 자동화가 더 안전함
    • 관리가 더 쉬움

따라서 지금 설정을 webroot 방식으로 변경하는 것을 추천드립니다! 😊

standalone 방식은 주로:

  • 초기 설정 시
  • 테스트 서버에서
  • 개발 환경에서 사용됩니다.

 

standalone 방식에서 webroot 방식으로 변경하는 순서입니다:

1. 현재 Apache가 실행 중인지 확인(webroot는 아파치 실행 중인 상태에서 해야함) sudo systemctl status httpd

 

2. webroot 방식으로 인증서 재설정 sudo certbot certonly --webroot -w /var/www/html -d naranghae.com -d www.naranghae.com

 

3. crontab 설정 수정 sudo vi /etc/crontab

기존 설정을:30 1 * * 2 root /usr/bin/certbot renew --post-hook "systemctl reload httpd"

다음과 같이 수정:30 1 * * 2 root certbot renew --webroot -w /var/www/html --post-hook "systemctl reload httpd"

 

4. 갱신 테스트 (Apache 중지 없이)sudo certbot renew --dry-run

이렇게 하면 서비스 중단 없이 인증서 갱신이 가능해집니다! 👍

 

(현재 내 인증서 상태 확인 명령어 - 만료일 확인 가능: sudo certbot certificates)

 

그래도 안되면,

www.naranghae.com에 대한 인증서가 아직 standalone 방식으로 설정되어 있는 것 같습니다.

이것도 webroot 방식으로 변경해야 합니다.

1. 먼저 기존 www 인증서 설정 삭제:sudo rm /etc/letsencrypt/renewal/www.naranghae.com.conf

2. 다시 한 번 webroot 방식으로 인증서 설정:sudo certbot certonly --webroot -w /var/www/html -d naranghae.com -d www.naranghae.com 

(1 선택)

3. 설정 후 다시 테스트:sudo certbot renew --dry-run

이렇게 하면 두 도메인 모두 webroot 방식으로 설정되어 Apache를 중지하지 않고도 갱신이 가능해질 것입니다! 👍

 

 

인증서 갱신 주기

Let's Encrypt의 인증서는 유효기간이 90일이지만, certbot renew 명령은 다음과 같은 조건에서 작동합니다:

  1. 기존 인증서의 유효기간이 30일 미만일 경우에만 갱신이 수행됩니다.
  2. 30일 이상 유효기간이 남아 있다면 갱신이 이루어지지 않습니다.