반응형

Docker-Compose로 Nginx, Certbot이미지를 사용하여, LetsEncrypt SSL인증서를 발급받는 방법을 알아보도록 하죠

 

certbot으로 ssl 인증서를 발급받는 방법은 다양하게 있지만,

 

저는 dns를 이용하여 발급받도록 하겠습니다.

 

dns를 이용하여 발급받을때는, certbot에서 제공해주는 문자열 제 DNS주소에 TXT레코딩을 입력하면, certbot에서 레코딩이 입력되었는지 확인 후 인증서를 발급해줍니다 !

 

저는 nginx라는 디렉토리 생성 후 작업을 하도록 하겠습니다.

 

디렉터리 구조는 아래와 같습니다.

 

디렉터리 구조

nginx

  ㄴ certbot

     ㄴ conf

     ㄴ www

  ㄴ conf
     ㄴ nginx.conf

     ㄴ test.bigdragon.shop.conf

     ㄴ data.bigdragon.shop.conf

  ㄴ cert.sh

  ㄴ docker-compose.xml

 

도메인

저는 DNS를 이용하여 인증서를 발급받을 것입니다.

서브도메인마다 인증서를 받지않고 와일드카드(*)를 사용해 인증서를 발급받도록 하겠습니다.

*.domain.com 식으로 인증서를 발급받으면 서브도메인 인증서를 받지않아도 다 같이 사용할 수 있습니다.

 

nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for" -- $host';
    #access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

nginx.conf는 있는 그대로 복사하셔도 무방합니다 :)

test.Exampledomain.shop.conf ( 사용할 서브도메인.conf)

upstream myWeb {
    server 118.67.123.51:443; #리버스 프록시 사용을 위해
}
log_format  main  '$sent_http_X_DEBUG_MESSAGE';

server {
        listen 80; #리스닝 포트
        server_name test.bigdragon.shop; #접근 도메인
        #letsencrypt 도메인 확인
        location /.well-known/acme-challenge/ { 
            root /var/www/certbot;
        }

        # path
        location / {
            return 301 https://$server_name$request_uri;
        }
}
server {

    listen 443 ssl;
    server_name test.exampledomain.shop; #사용할 서브도메인을 입력
    ssl_certificate /etc/letsencrypt/live/exampledomain.shop/fullchain.pem; #사용할 메인도메인 입력
    ssl_certificate_key /etc/letsencrypt/live/exampledomain.shop/privkey.pem; #사용할 메인도메인 입력

    location / {
        add_header X_DEBUG_MESSAGE "test.exampledomain.shop";
        proxy_pass https://myWeb;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
    access_log  /var/log/nginx/access.log  main;
}

server_name : 호스트를 보고 자기 호스트에 맞는곳으로 연결된다 위 기준 test.exapledomain.shop 으로 접속 시 위 server가 리스닝 하고있다가 통신함 !

 

pullchain.pem : letsencrypt인증서를 발급받으면 자동 생성됨 docker-compose.yml에서 볼륨 마운트 되어있으니, 서브도메인만 신경써주도록하죠 !

 

privkeykey.pem : letsencrypt인증서를 발급받으면 자동 생성됨 docker-compose.yml에서 볼륨 마운트 되어있으니, 서브도메인만 신경써주도록하죠 !

 

 

data.bigragon.shop.conf

log_format  data  '$sent_http_X_DEBUG_MESSAGE';

server {
    listen 80;
    server_name data.exampledomaim.shop;
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://data.exampledomaim.shop$request_uri;
    }
}
server {
    listen 443 ssl;
    server_name data.example.shop;

    ssl_certificate /etc/letsencrypt/live/exampledomaim.shop/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/exampledomaim.shop/privkey.pem;

    location / {
        add_header X_DEBUG_MESSAGE "data.example.shop";
        root /usr/share/nginx/html;
        index index.html;
        try_files $uri $uri/ /index.html;
    }
    access_log  /var/log/nginx/access.log  data;
}

 

cert.sh

docker-compose run --rm --entrypoint "\
    certbot certonly \
    -d *.exampledomaim.shop \
    --email example@gmail.com \
    --manual --preferred-challenges dns \
    --server https://acme-v02.api.letsencrypt.org/directory \
    --force-renewal" certbot
echo

echo "### Reloading nginx ..."
docker-compose exec nginx nginx -s reload

Letsencrypt인증서를 발급받는 ssh 입니다

 

인증서 발급 후 nginx를 재시작 하는 부분이 재일 아래쪽입니다.

 

docker-compose.yml 

version: '3.8'
services:
    certbot:
        image: certbot/certbot
        container_name: certbot
        volumes:
            - ./nginx/certbot/conf:/etc/letsencrypt
            - ./nginx/certbot/www:/var/www/certbot
        entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
    nginx:
        image: nginx
        container_name: nginx
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - ./nginx/certbot/conf:/etc/letsencrypt
            - ./nginx/certbot/www:/var/www/certbot
            - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
            - ./nginx/conf/test.exampledomaim.shop.conf:/etc/nginx/conf.d/test.exampledomaim.shop.conf
            - ./nginx/conf/data.exampledomaim.shop.conf:/etc/nginx/conf.d/data.exampledomaim.shop.conf
        command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"

 

위 4가지 파일을 만든 후 

 

1. nginx 디렉토리로 이동하여 ./cert.sh 명령어를 통해 인증서를 발급받아준다.

인증서 발급 시 특정 문자열을 TXT레코드에 입력하라고하는데, 본인이 관리하는 DNS서버에 해당 TXT레코드를 작성해준다 !

 

2. docker-compose  run  -p 443:443 -p 80:80  nginx  명령어로 nginx 실행

 

3. https도메인으로 접근하면 잘 접속되는것을 확인 할 수 있습니다 :)

 

반응형

'기록' 카테고리의 다른 글

brew node version 변경  (0) 2023.03.18
[Docker] 도커명령어 정리  (0) 2023.02.02
[Git] Github - GitBash 사용법  (0) 2022.11.22
반응형

작성자의 개인 Study 후  오류 없는 셋팅을 위해  정리 용도로 작성됨을 안내드립니다. 

이번 Step에서는 ssl 적용하는 하는 방법을 작성하겠습니다.

 

 

환경
Naver Cloud Platform centos-7.8-64
OpenJDK 1.8
Apache 2.4.6
Tomcat 8.5.78

 

 

인증서 설치 전 확인사항

인증서 설치 시 SSL관련 설정은 기존 apache 1.x에서는 httpd.conf에서 해주었으나,

Apache 2.x 에서는 ssl.conf, apache 2.2x에서는 httpd-ssl.conf 파일에서 설정해주시면 됩니다.

 

참고1. Apache의 경우 기본적으로 mod_ssl 모듈이 설치되어 있어야 합니다.

 

저는 Apache 2.x기준으로 작성하도록 하겠습니다.

 

mod_ssl 설치
yum -y install mod_ssl

 

mod_ssl 설치 후 443포트와 https서비스를 오픈합니다.

firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-service=https

 

 

certbot 설치
yum install epel-release //저장소 활성화

yum install certbot python2-certbot-apache //인증서설치

 

 

ssl 인증서 발급

인증서 발급을 위해서는 httpd서비스를 정지 후 진행해야 한다.

systemctl stop httpd
certbot certonly --standalone -d sample.bigdragon.com //도메인 샘플

인증서 발급 시 이메일 입력, yes를 입력하고 하면 입력해주면 된다.

 

 

인증서 적용

인증서 발급이 완료되면 /etc/letsencrypt/live/도메인/ 으로 이동하면 인증서가 생성되어 있다. 이 인증서를

 

/etc/httpd/conf.d/ssl.conf에  각각의 pem에 맞춰 입력해주면 된다.

 

또한 톰캣을 이용한다면 server.xml에도 필수로 입력해줘야한다

 

ssl.conf

ssl.conf

 

1. 이전 스탭에서는 mod_jk.conf로 JKmount를 해줬다면, ssl.conf에 설정을 해주거나 Include해주면 된다.

 

 

ssl.conf

2.생성된 인증서를 ssl.conf에 각각에 맞에 입력해준다.

 

server.xml

server.xml

 

톰캣의 server.xml 부분에도 인증서 경로에 맞게 작성을 해주면 된다.

 

 

이러면 https로 정상적으로 접근 되실 거에요 ㅎㅎ

 

안되시는부분 댓글로 남겨주시면 확인 해드리겠습니다

 

감사합니다.

 

 

※개인 참고용  사용코드

yum update ==> 하고 버전업되서 에러 날 수 있음
yum clean all
yum -y install mod_ssl
yum install epel-release
firewall-cmd --permanent --zone=public --add-port=443/tcp
certbot certonly --standalone -d data.bigdragon.shop
vi /etc/httpd/conf.d/ssl.conf
vi /usr/local/instance/apache3/conf/server.xml
반응형

+ Recent posts