[Ubuntu 24.04/Nginx/Let's encrypt] 웹 서버에 SSL 인증서 적용
웹 서버에 SSL 인증서 적용
클라우드 운영을 하다보면 웹 서버에 SSL 인증서를 적용하거나 갱신해야 할 일이 생긴다.
Linux VM(OS Ubuntu 24.04)을 생성해서,
Nginx 기반 웹 서버를 올린 뒤
Let's encrypt를 이용하여 인증서를 적용해보자
도메인 생성
먼저 도메인을 생성한다.
가비아에서 .shop 도메인을 1년 500원에 구매 가능하니 구매 하는 것을 추천!
웹을 넘어 클라우드로. 가비아
그룹웨어부터 멀티클라우드까지 하나의 클라우드 허브
www.gabia.com
DNS 영역 생성
# Azure portal > DNS 영역 생성
구독, 리소스 그룹 지정 > 인스턴스 세부 정보 이름 : 내 도메인 (bbiyak.shop) > '검토 + 만들기'
NameServer 변경
*Name Server : 도메인의 네임서버(Name Server)는 도메인 이름과 IP 주소 간의 매핑을 관리하는 서버입니다. 사용자가 웹 브라우저에 도메인 이름을 입력하면, 네임서버는 해당 도메인에 연결된 IP 주소를 찾아서 웹사이트에 접속할 수 있도록 도와줍니다.
도메인을 등록할 때, 도메인 등록 기관에서 제공하는 네임서버를 사용하거나, 자체적으로 설정한 네임서버를 지정할 수 있습니다. 네임서버가 올바르게 설정되지 않으면, 도메인이 제대로 작동하지 않거나 웹사이트에 접근할 수 없는 문제가 발생할 수 있습니다.
# NameServer 변경
생성된 DNS 영역의 NS 레코드 집합 확인 후,
내 도메인의 네임서버 설정 클릭
Azure DNS 영역 레코드 집합에 나와있는 대로 변경
웹 서버 생성
# VM 생성
웹 서버 역할을 할 Linux VM 생성 (OS : Ubuntu 24.04)
기본적으로 인바운드 22(SSH), 80(HTTP), 443(HTTPS) 포트는 열어준다.
# VM에 접속 후 Nginx 설치
# 1. 서버 패키지 목록 업데이트
sudo apt update
# 2. nginx 설치
sudo apt install nginx
# 3. 실행
sudo service nginx start
# 4. 상태 확인
sudo service nginx status
레코드 집합 추가
# DNS 영역에서 레코드 집합 추가
이름 : www
유형 : A 레코드
IP 주소 : 웹 서버 VM의 공인 IP
*A레코드: 도메인 A 레코드(A Record)는 DNS(Domain Name System)에서 가장 기본적인 유형의 레코드 중 하나로, 도메인 이름을 IPv4 주소에 매핑하는 역할을 합니다. A 레코드는 사용자가 입력한 도메인 이름을 해당 도메인에 연결된 서버의 IP 주소로 변환하여 웹사이트에 접근할 수 있도록 합니다.
# 확인
http://내 도메인으로 접속하여, 웹 서버에 접속되는지 확인 (ex. http://www.bbiyak.shop)
정상적으로 접속이 된당.
이제 SSL 인증서를 적용하여 https로 접속 가능하게끔 해보자
SSL 인증서 발급
# 웹 서버 VM에서 SSL 인증서 발급
** 참고링크1: https://velog.io/@juhyeon1114/certbot-%EC%84%A4%EC%B9%98-%EC%82%AC%EC%9A%A9%EB%B2%95-ubuntu
** 참고링크2 :https://minsigi.tistory.com/9
# certbot 설치 (letsencrypt 설치로 갈음)
sudo apt-get install letsencrypt
sudo apt-get install letsencrypt
# 인증서 발급
sudo certbot certonly -d "*.sample.com" --manual --preferred-challenges dns
ex) sudo certbot certonly -d "*.sejinzz.shop" --manual --preferred-challenges dns
sudo certbot certonly -d "*.sample.com" --manual --preferred-challenges dns
ex) sudo certbot certonly -d "*.bbiyak.shop" --manual --preferred-challenges dns
여기서 Enter 누르지 말고,
DNS TXT record와 value를 복사한다.
# TXT 레코드 추가
위에서 복사한 DNS TXT record와 값을 복사하여 추가해준다.
TXT 레코드가 추가된 것을 확인한다.
이후 다시 터미널로 돌아가 Enter를 눌러 인증서를 성공적으로 발급한다.
SSL 인증서 적용
# 설정 파일 수정
sudo vi /etc/nginx/sites-available/default
# 설정 파일 내 코드 추가
server {
listen 443;
listen [::]:443;
ssl on; #ssl 활성화
server_name _;
ssl_certificate /etc/letsencrypt/live/[도메인주소]/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/[도메인주소]/privkey.pem;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}
ex) [도메인 주소] = bbiyak.shop
# nginx 재시작
sudo service nginx restart
https 접속
https://내 도메인 으로 정상적으로 접속이 된다면
SSL 인증서 적용 성공
번외) SSL 인증서 갱신
SSL 인증서 발급 시, manual 방식에서 진행했기때문에 자동 리뉴얼이 안된다.
인증서 발급 당시 아래 문구를 통해 확인할 수 있었다.
NEXT STEPS:
- This certificate will not be renewed automatically. Autorenewal of --manual certificates requires the use of an authentication hook script (--manual-auth-hook) but one was not provided. To renew this certificate, repeat this same certbot command before the certificate's expiry date.
수동 리뉴얼을 crontab을 통해 진행해봅시다.
# SSL 인증서 만료일 확인
root@SSL-VM:~# sudo certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
Certificate Name: bbiyak.shop
Serial Number: 38*********
Key Type: ECDSA
Domains: *.bbiyak.shop
Expiry Date: 2025-04-21 00:56:29+00:00 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/bbiyak.shop/fullchain.pem
Private Key Path: /etc/letsencrypt/live/bbiyak.shop/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# 현재 서버 시간 확인
root@SSL-VM:~# date
Tue Jan 21 02:25:34 UTC 2025
# crontab 등록
sudo crontab -e
번외) 혹시 nano로 열었을 경우 vi 에디터로 crontab 다시 열기
root@SSL-VM:~# export VISUAL=vi; crontab -e
# crontab 파일에 매달 1일 자정에 인증서 갱신 명령어 추가
0 0 1 * * certbot renew --renew-hook="sudo systemctl restart nginx
# crontab 재시작
sudo service cron restart
** 참고링크 : https://blog.pium.life/update-ssl/
만료된 SSL 인증서 갱신하기
이 글은 우테코 피움팀 크루 '주노'가 작성했습니다. 사건의 발단 https 인증서가 만료되어 https로 서비스 접근을 할 수 없게 되었다. 만료된 인증서를 어떻게 관리해야할 지 알아보자. 인증서 갱
blog.pium.life
번외2) SSL 인증서 자동 갱신
SSL 인증서 발급 시, manual 모드가 아닌 auto 모드로 진행하면
해당 명령어만으로 자동 갱신이 가능하다.
sudo certbot renew --dry-run
** 참고링크 : https://elfinlas.github.io/letsencrypt/211105_letscert-fail/