nginx에 ssl 인증서 설정하는 방법을 알아보자.
들어가기 전 사전에 준비를 해야하는 것들이 있다.
1. 도메인 구입
2. 80 , 442 port 열기
-> (80은 http, 443은 https 기본 포트이다) 만약 설정하려는 서버가 aws면 aws console에 들어가서 해당 포트를 열고 필자처럼 개인 서버용 컴퓨터로 설정을 하면 포트포워딩 설정을 했던 페이지에서 포트를 열자
3.docker , docker compose 설치
SSL 인증서 발급
1. docker_nginx 디렉토리 생성
먼저 nginx를 설치할 서버에 ssh 접속을 한다. 그리고 원하는 위치에서
sudo mkdir docker_nginx -> docker_nginx 파일생성
2. docker-compose.yml 생성
다음은 docker-compose.yml 파일을 생성해보자
volumes에 존재하는 경로는 docker-compose가 실행되면서 해당 위치에 생성되니 원하는 경로를 입력하자
그게 아니라면 그대로 사용해도 상관없다.
cd docker_nginx
sudo vi docker-compose.yml
아래 복사
esc -> :wq
//docker-compose.yml
version: "3.9"
services:
nginx:
image: "nginx:latest"
ports:
- "80:80"
- "443:443"
restart: always
volumes:
- ./conf/nginx.conf:/etc/nginx/nginx.conf
- ./file/certbot/conf:/etc/letsencrypt
- ./file/certbot/www:/var/www/certbot
command: '/bin/sh -c ''while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g "daemon off;"'''
certbot:
image: "certbot/certbot"
restart: unless-stopped
volumes:
- ./file/certbot/conf:/etc/letsencrypt
- ./file/certbot/www:/var/www/certbot
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
cerbot에 있는 entrypoint는 Certbot을 사용하여 SSL 인증서를 갱신하는 작업을 무한 루프로 반복한다 12시간마다 certbot renew 명령을 실행하여 인증서를 갱신하고, 이 과정을 계속 반복한다 이렇게 하면 인증서 만료 전에 자동으로 갱신되도록 설정하기 위한 코드이다.
(letsencrypt는 90일 만료이고 30일부터 갱신이 가능하다)
3. conf 폴더 및 nginx.conf 생성
cd docker_nginx
sudo mkdir config
cd config
sudo vi nginx.conf
//nginx.conf
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name #자신의 domain
server_tokens off;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
}
여기까지 만들었으면 docker-compose.yml 파일을 실행해주자.
(docker-compose 는 v1xx, docker compose 는 v2.xx 2023년 6월을 마지막으로 V1 docker-compose 에 대한 지원이 만료되기 때문에 자신이 다운받은 docker 버전에 따라 docker compose, docker-compose 명령어를 사용하도록 하자)
// V1
docker-compose -f docker-compose.yml up -d
// V2
docker compose -f docker-compose.yml up -d
아래 명령어로 docker-compose.yml이 잘 돌아가는지 확인해보자
docker ps
4.init-letsencrypt.sh 생성
docker_nginx 폴더에 init-letsencrypt.sh 파일을 생성해보자
생성하는 방법은 2가지가 있다.
- script를 통한 방법
curl -L <https://raw.githubusercontent.com/wmnnd/nginx-certbot/master/init-letsencrypt.sh> > init-letsencrypt.sh
chmod +x init-letsencrypt.sh
2.직접 파일을 만드는 방법
vi init-letsencrypt.sh
chmod +x init-letsencrypt.sh
생성을 하고 #email, #domain에 값을 넣어주고 저장한다
//init-letsencrypt.sh
#!/bin/bash
if ! [ -x "$(command -v docker-compose)" ]; then
echo 'Error: docker-compose is not installed.' >&2
exit 1
fi
domains=(#domain)
rsa_key_size=4096
data_path="./data/certbot"
email="#email" # Adding a valid address is strongly recommended
staging=0 # Set to 1 if you're testing your setup to avoid hitting request limits
if [ -d "$data_path" ]; then
read -p "Existing data found for $domains. Continue and replace existing certificate? (y/N) " decision
if [ "$decision" != "Y" ] && [ "$decision" != "y" ]; then
exit
fi
fi
if [ ! -e "$data_path/conf/options-ssl-nginx.conf" ] || [ ! -e "$data_path/conf/ssl-dhparams.pem" ]; then
echo "### Downloading recommended TLS parameters ..."
sudo mkdir -p "$data_path/conf"
curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf > "$data_path/conf/options-ssl-nginx.conf"
curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem > "$data_path/conf/ssl-dhparams.pem"
echo
fi
echo "### Creating dummy certificate for $domains ..."
path="/etc/letsencrypt/live/$domains"
sudo mkdir -p "$data_path/conf/live/$domains"
docker compose run --rm --entrypoint "\
openssl req -x509 -nodes -newkey rsa:$rsa_key_size -days 1\
-keyout '$path/privkey.pem' \
-out '$path/fullchain.pem' \
-subj '/CN=localhost'" certbot
echo
echo "### Starting nginx ..."
docker compose up --force-recreate -d nginx
echo
echo "### Deleting dummy certificate for $domains ..."
docker compose run --rm --entrypoint "\
rm -Rf /etc/letsencrypt/live/$domains && \
rm -Rf /etc/letsencrypt/archive/$domains && \
rm -Rf /etc/letsencrypt/renewal/$domains.conf" certbot
echo
echo "### Requesting Let's Encrypt certificate for $domains ..."
#Join $domains to -d args
domain_args=""
for domain in "${domains[@]}"; do
domain_args="$domain_args -d $domain"
done
# Select appropriate email arg
case "$email" in
"") email_arg="--register-unsafely-without-email" ;;
*) email_arg="--email $email" ;;
esac
# Enable staging mode if needed
if [ $staging != "0" ]; then staging_arg="--staging"; fi
docker compose run --rm --entrypoint "\
certbot certonly --webroot -w /var/www/certbot \
$staging_arg \
$email_arg \
$domain_args \
--rsa-key-size $rsa_key_size \
--agree-tos \
--force-renewal" certbot
echo
echo "### Reloading nginx ..."
docker compose exec nginx nginx -s reload
실행을 해보자
./init-letsencrypt.sh
아래처럼 나오면 ssl 인증서 발급 성공이다!
Nginx SSL 인증서 설정
nginx.conf 수정
docker_nginx -> conf -> nginx.conf 파일을 수정하자.
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name #domain_name;
server_tokens off;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
server {
listen 443 ssl;
server_name #domain_name;
ssl_certificate /etc/letsencrypt/live/my.domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/my.domain/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://my.domain:8080;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
docker compose down
docker compose -f docker-compose.yml up -d
docker compose를 내리고 다시 실행시키자
2024/10/18 00:50:03 [emerg] 8#8: BIO_new_file("/etc/letsencrypt/ssl-dhparams.pem") failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/etc/letsencrypt/ssl-dhparams.pem, r) error:10000080:BIO routines::no such file)
nginx: [emerg] BIO_new_file("/etc/letsencrypt/ssl-dhparams.pem") failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/etc/letsencrypt/ssl-dhparams.pem, r) error:10000080:BIO routines::no such file)
만약 nginx 에서 위와 같은에러가 발생하면 cd docker_nginx/data/cerbot/conf 위치에서 아래 명령어를 입력하여 다시 실행하자.
sudo openssl dhparam -out ssl-dhparams.pem 2048
'Programming > Back-end Language' 카테고리의 다른 글
여기로 모여라 회고-2 (web socket을 이용한 실시간 위치공유 개발) (0) | 2024.10.18 |
---|---|
여기로 모여라 회고-1 (0) | 2024.10.18 |
K6를 이용한 서버 성능 테스트 이슈 (0) | 2024.09.06 |
Apache Tomcat과 JAVA (0) | 2024.05.16 |
트랜잭션 (0) | 2024.04.19 |