본문 바로가기
Sever/Tools

[Nginx+Certbot+Let's encrpyt+Docker]https 통신을 위한 ssl(tls)인증서 등록하기

by seeker00 2023. 9. 5.
  • 도메인의 호스팅이 완료된 이후, https 프로토콜을 활용하기 위한 설정을 진행합니다.

아직 도메인 네임 서버에 도메인을 등록하지 않았다면?

Letsencrpyt 와 Certbot을 이용한 SSL(TSL) 설정

Certbot

  • https://certbot.eff.org/instructions?ws=nginx&os=ubuntufocal
    • 공식 사이트에서 소개하는 nginx 와 ubuntu 20 에서의 사용방법
  • https://eff-certbot.readthedocs.io/en/stable/install.html#alternative-1-docker
    • 그외 문서, 도커를 활용하는 방식 소개
  • Let's encrpyt 인증 서버와 통신하고 인증서를 받는 단계를 자동화 해주는 클라이언트 봇
  • Certbot을 이용한 인증 방식 세가지를 소개한다.
    • 기본
      • 80 포트가 프리해야 함. nginx 서버가 실행 중이라면 잠깐 멈추고 Certbot을 실행해줘야 한다.
  • certbot certonly 로 실행하는 경우 (아래 외 옵션이 더 있는지는 잘 모르겠다.)
    • webroot 방식
      • 특정 url(/.well-known/acme-challenge)을 매핑하는 디렉토리를 지정하고, 이 디렉토리를 이용해서 인증을 수행한다.
    • DNS TXT record 방식
      • 역시나 특정한 url을 활용해 인증을 수행하는데, DNS에 고유한 TXT 레코드를 생성하는 방식을 활용한다.

참고

  • Docker Nginx Let’s Encrypt 인증서 발급 및 자동갱신
    • Certbot 과 Let's encrpyt 의 동작 원리 및 도커를 활용하여 webroot 방식으로 인증서를 발급받는 과정을 매우 잘 설명해두었다.
    • 해당 블로그 글도 그렇고 여타 블로그들에서 엔진엑스 설정파일을 관리하는 법을 설명할 때, '/etc/nginx/sites-available' 에 사이트별 설정 파일을 만들고 이를 '/etc/nginx/sites-enabled' 디렉토리에 심볼릭 링크(일종의 바로가기 파일)를 생성하는 방식을 이야기하는 것을 볼 수 있다.
    • 그러나 이러한 디렉토리는 엔진엑스의 설치 버전 및 os에 따라 존재하지 않기도 하므로, 필요하면 적절히 디렉토리를 생성해서 활용한다. 나는 개인적으로 복잡한 설정 파일 구성이 필요한 것이 아니므로 생략한다.
  • Docker, Certbot을 이용한 Let's encrypt 인증서 발급 및 관리
    • DNS TXT record 방식을 이용하여 인증서를 발급받는 과정을 잘 설명해두었다.

명령어

docker run -it --rm --name certbot \
    -v "/etc/letsencrypt:/etc/letsencrypt" \
    -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
    -v "/var/log/letsencrypt:/var/log/letsencrypt" \
    certbot/certbot \
    certonly --webroot -w /var/lib/letsencrypt \
-d dodonenow.com --agree-tos
  • 여기서 세번째 볼륨 설정은 그냥 로그가 궁금해서 넣어봤습니다.(공식 사이트 문서를 보면 위 두 개 디렉토리만 볼륨을 설정한다.)
    • 저기다가 로그를 찍어준대서 추가해보았다. certbot의 로그는 잘 찍혔다. 하지만, 생략 가능하다.
  • 도커는 실행 후 바로 삭제가 되도록 --rm 옵션을 준다.
  • -it 도커를 인터랙티브 모드로 실행시켜서 바로 certbot 명령어를 수행하도록 한다.
  • certbot은 certonly 모드로 실행하고, webroot 방식을 활용한다.
  • 그 외 몇가지 Argument를 전달한다. 그 중 -w 인수는 webroot 모드에서 사용할 디렉토리를 지정한다.
  • --agree-tos 는 기타 동의 질문에 항상 y를 던져주도록 하는 옵션

재발급 크론 설정

  • 참고1 블로그 에서 확인한 재발급 명령어를 나열한 간단한 실행파일 생성
docker run --rm --name certbot -v "/var/log/letsencrypt:/var/log/letsencrypt" -v "/etc/letsencrypt:/etc/letsencrypt" -v "/var/lib/letsencrypt:/var/lib/letsencrypt" certbot/certbot renew >> /{적당한 위치}/nginx/certbot_renew.log

docker restart nginx # 컨테이너명
  • https://eff-certbot.readthedocs.io/en/stable/using.html#renewing-certificates

    • renew 명령에 훅 옵션이 있었다! (도커 컨테이너를 사용하므로 패스)

    • renew 명령어는 인증서 만료기간이 30일 남았을 때부터 동작한다.

        # 갱신기간이 남은 경우 로그
        Certificate not yet due for renewal
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        The following certificates are not due for renewal yet:
    • --force-renewal 옵션을 통해서 만료기간이 남은 경우에도 강제로 갱신하게 할 수는 있다.

        INFO:certbot._internal.renewal:Non-interactive renewal: random delay of 245.10606920633938 seconds
  • 크론 탭으로 등록

Nginx

참고

설정

# nginx/conf.d/default.conf 혹은 도메인명.conf 파일
server {
    server_name {도메인명};
    listen 80;
    listen  [::]:80;

    # http로 들어오면 https로 redirect
    location / {
      return 301 https://$host$request_uri;
    }

    # certbot webroot 방식 인증
    location /.well-known/acme-challenge {
      root /var/lib/letsencrypt/;
    }
}

server {
    server_name {도메인명};
    listen 443 ssl;

    # Certificate
    ssl_certificate /etc/letsencrypt/live/{도메인명}/fullchain.pem;
    # Private Key
    ssl_certificate_key /etc/letsencrypt/live/{도메인명}/privkey.pem;

    # 빌드된 프론트 데이터 매핑
    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
        try_files $uri  $uri/ /index.html;
    }

    location /api {
        proxy_pass http://api도커컨테이너:포트번호;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
  • 엔진엑스의 url 매핑 우선순위는 상세하고 정확할수록 높다고 한다.

'Sever > Tools' 카테고리의 다른 글

Git Submodule 활용  (0) 2025.02.26
Git 활용  (0) 2021.01.31