작성 이유
기존에 가비아, 후이즈 처럼 도메인 업체에서는 SSL 인증서를 요청하면 원하는 양식에 맞춰서 발급을 받아서 설정을 했었다. 다만 추가적인 비용이 들기 때문에 개인적으로 사용하기에는 비용 부담이 있었다. 그러다가 찾게된 내용이 무료로 SSL 인증서를 발급해주는 사이트인 Let's Eencrypt 이다. 관련하여 SSL 인증서가 잘 적용되는지 보기 위하여 발급 방법 및 적용방법을 기록!
기본적인 발급 방법
일반적으로 인증서를 발급받는 방법은 크게 2가지로 나눌 수 있다.
1. 쉘을 통해 직접 발급 (이번에 진행 할 내용!)
2. 호스팅 업체에서 제공하는 기능(cPanel 등)
Let's Encrypt SSL 인증서 발급 방법 3가지
1. Webroot
- 사이트 디렉토리 내에 인증서 유효성을 확인할 수 있는 파일을 업로드하여 인증서를 발급하는 방법
(호스팅 업체 인증 방식도 ~~~.txt 파일을 업로드 후, 브라우저에서 접속하여 인증확인을 받는 방법)
- 실제 작동하고 있는 웹서버의 특정 디렉토리의 특정 파일 쓰기 작업을 통해서 인증
- 이 방식의 장점은 웹서버를 중단시킬 필요가 없음
- 이 방법의 단점은 인증 명령에 하나의 도메인 인증서만 발급 가능
2. web Server
- Nginx, Apache 와 같은 웹서버에서 직접 SSL 인증을 실시하고 웹서버에 맞는 SSL 부여
(직접 실시가 무슨 말인지 감이 오지 않는다..)
- 발급이나 갱신을 위해 웹 서버를 중단시킬 필요가 없음
- 인증서 갱신 시 상황에 맞게 세팅을 자동으로 업데이트
- 사용자가 세팅을 변경할 수 있지만 자동 업데이트 시에는 반영되지 않음
3. StandAlone
- 사이트 작동을 멈추고 이 사이트의 네트워킹을 이용해 사이트 유효성을 확인해 인증서를 발급하는 방식
- 80 포트로 가상 standalone 웹서버를 띄워 인증서를 발급
- 이 방식은 동시에 여러 도메인을 발급받을 수 있음
- 인증서 발급 전, 웹서버를 중단해야함
Let's Encrypt 인증서 생성하기
서버 환경
- Amazon Linux 2023
- Apache Tomcat 11


1. certbot 설치
$ sudo dnf install -y certbot
2. certbot으로 SSL 인증서 받기
서버를 잠깐 중단해도 되면
$ sudo certbot certonly --standalone

서버를 잠깐이라도 중단할 수 없으면
$ sudo certbot certonly --webroot
다만 webroot를 사용하려면 letsencrypt 동작 특성 상, 내 도메인 유효성을 검증하기 위해 /.well-known 폴더를 http 상에서 서빙을 해야한다....
그러니 가능하면 standalone으로 사용하는게 편리하다. (또한 SSL 인증서를 적용하지 않으면 서비스 오픈을 하지 않는 경우가 많음..)
이후에 많은 질문들이 나온다.
1. 이메일
2. 동의 여부
3. 이메일 수신 여부
4. 사용할 도메인 (test.slowtuttle.co.kr 이런식으로 다 넣어야하는듯함!)
잠시 기다리면 성공적으로 발급이 된다.
/etc/letsencrypt/live/도메인명/fullchain.pem
/etc/letsencrypt/live/도메인명/privkey.pem
/etc/letsencrypt/live/도메인명/cert.pem
3. Tomcat 설정 변경
server.xml 파일 수정
$ vi tomcat 설치 경로/conf/server.xml
```
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<Certificate certificateKeyFile="/etc/letsencrypt/live/도메인명/privkey.pem"
certificateFile="/etc/letsencrypt/live/도메인명/cert.pem"
certificateChainFile="/etc/letsencrypt/live/도메인명/fullchain.pem"
type="RSA" />
</SSLHostConfig>
```
4. 인증서 갱신
- 해당 작업도 서비스가 중지된 상태에서 진행해야함
$ sudo certbot renew --dry-run
서비스를 중지하지 않고 실행하면 아래와 같은 에러가 나옴

5. 서비스 기동 및 인증서 확인
- 서비스를 기동 후 인증서 정보를 확인

6. shell 스크립트 및 crontab 등록
유효기간을 보면 약 3개월정도 유효하다. 매번 3개월마다 이 작업을 하는 것도 번거로울 뿐더러, 까먹게 되면 서비스가 정상적으로 작동하지 않는 현상도 발생하게 될 것이다.
그렇기때문에 스크립트를 만들어서 약 8주마다 작동하도록 해놓으면 문제가 생기지 않을 것 같다.
crontab에서는 특정 일수마다 작동하는 스크립트가 없기때문에 스크립트 내부에서 이전에 실행했던 날짜를 기준으로판단해야된다.
6-1. crontab 설치
현재 작업 위치가 ec2 이기때문에 cron으로 설치가 안되고 아래와 같은 명령어로 설치해야한다.
$ sudo systemctl start crond
6-2. 실행 스크립트 등록
- 쉘 스크립트 파일을 톰켓에 따로 만들었다.
$ vi tomcat 설치 경로/refreshSSL/refreshSSL.sh
```
#!/bin/bash
# 파일에 마지막 실행 날짜를 기록
LAST_RUN_FILE="/home/ec2-user/tomcat/apache-tomcat-11.0.0-M20/refreshSSL/last_run_date.txt"
# 현재 날짜를 `yyyy-mm-dd` 형식으로 얻기
CURRENT_DATE=$(date +%Y-%m-%d)
# 로그 파일 경로 설정
LOG_FILE="/home/ec2-user/tomcat/apache-tomcat-11.0.0-M20/refreshSSL/cronlog/cron.log"
# 파일이 존재하지 않으면 현재 날짜로 초기화
if [ ! -f "$LAST_RUN_FILE" ]; then
echo "$CURRENT_DATE" > "$LAST_RUN_FILE"
fi
# 마지막 실행 날짜 읽기
LAST_RUN_DATE=$(cat "$LAST_RUN_FILE")
# 날짜 차이 계산
DAYS_DIFF=$(( ( $(date -ud "$CURRENT_DATE" +'%s') - $(date -ud "$LAST_RUN_DATE" +'%s') )/60/60/24 ))
# 날짜 차이가 85일 이상인 경우에만 실행
if [ "$DAYS_DIFF" -ge 85 ]; then
{
echo "Refreshing SSH configuration at $CURRENT_DATE"
# 1. Tomcat 서버 종료
/home/ec2-user/tomcat/apache-tomcat-11.0.0-M20/bin/shutdown.sh
# 2. Java 프로세스가 종료될 때까지 대기
while [ $(ps -ef | grep java | grep -v grep | wc -l) -ne 1 ]; do
sleep 1
done
# 3. Certbot 갱신 시도
certbot renew --dry-run
# 4. Certbot 갱신 프로세스가 종료될 때까지 대기
while ps -ef | grep -v grep | grep certbot > /dev/null; do
sleep 1
done
# 5. Tomcat 서버 시작
/home/ec2-user/tomcat/apache-tomcat-11.0.0-M20/bin/startup.sh
# 6. SSL 갱신 완료 메시지 출력
echo "End Of Refresh SSL"
} >> "$LOG_FILE" 2>&1
fi
```
6-3 cron 등록
$ crontab -e
```
0 0 * * * /home/ec2-user/tomcat/apache-tomcat-11.0.0-M20/refreshSSL/refreshSSH.sh
```
# :wq로 종료
6-4 cron 확인
$ crontab -l
0 0 * * * /home/ec2-user/tomcat/apache-tomcat-11.0.0-M20/refreshSSL/refreshSSL.sh
6-5 cron 실행
$ sudo systemctl start cron
이렇게하면 매일 00시 00분에 해당 스크립트를 돌면서 85일이 지났는지 확인을 해서 작업을 진행해 줄 것이다.
ps) 혹시나 로그가 쌓이지 않는다면 아래와같이 실행결과파일을 만들어서 확인하면된다
/home/ec2-user/tomcat/apache-tomcat-11.0.0-M20/refreshSSL/refreshSSL.sh >> /home/ec2-user/crontest.log 2>&1
마치며
현재 적용해 놓은 서버는 운영 서버가 아닌 개발 서버로, 서비스가 중단 되더라도 큰 이슈는 발생하지 않는다.
또한 24 365 서비스가 아니기 때문에 밤에 중단하고 재기동해도 큰 문제가 발생하지 않는다.
운영에서는 해당 인증서를 사용하지 않고 조금 더 등급이 높은 인증서를 사용할 것 같아서 당장은 "무중단 갱신" 이 가능한지 확인이 필요하며, 당장은 작성하지 않을 것 같다.
refs
Let's Eencrypt 설명 : https://devlog.jwgo.kr/2019/04/16/what-is-letsencrypt/
SSL인증서가 필요해요. 그런데 Let's Encrypt가 무엇인가요? · Tonic
사이트 운영에 도움을 주실 수 있습니다. 고맙습니다. --> SSL인증서가 필요해요. 그런데 Let's Encrypt가 무엇인가요? 2019년 04월 16일 개요 Let’s Encrypt란? Let’s Encrypt는 SSL 인증서를 무료로 발급해주
devlog.jwgo.kr
부가 설명 : https://www.owl-dev.me/blog/42
[Let's encrypt] 인증서 발급 및 갱신법
CTO 가 되고픈 부엉이 개발자 블로그 입니다
www.owl-dev.me
Apache Tomcat 설정 : https://trend21c.tistory.com/2172
tomcat 에 letsencrypt 적용하기
certbot 홈페이지에 들어가서보았는데 tomcat은 certbot의 software 옵션에서 보이지 않습니다 하지만 걱정마세요 tomcat도 당연히 사용할수 있습니다. 좀 더 자동화되고 편리한 설정이 되지 않는 것일뿐,
trend21c.tistory.com
'infra > 기타' 카테고리의 다른 글
| Rocky Linux 커널 업데이트 방지 (0) | 2024.08.20 |
|---|---|
| SSL/TLS 인증서란? (0) | 2024.07.12 |
| Apache + Tomcat 환경 분리(window) (0) | 2024.07.05 |
| 리눅스 날짜 및 언어 설정 (1) | 2024.07.04 |
| VScode + EC2 SSH, SFTP 연결 (0) | 2024.06.27 |