_
Nginx 무료 SSL/TLS 인증서 적용, 갱신 퀵가이드

Nginx 무료 SSL/TLS 인증서 적용, 갱신 퀵가이드

2023-04-17

Nginx SSL 적용하기 퀵 가이드

nginx-https를 쓰고싶니? 무료로?
이 글에서는 Certbot, Let's Encrypt를 사용해서 인증서를 발급받고 nginx에 적용, 지속적 자동 갱신을 시키는 과정을 확인한다. 시간이 없는 상황이거나 한국인이면 급할테니 깊이보다 주요개념만 빠르게 핥아보자. 바로 적용할 사람들은 설명 제끼고 명령 부분만 보면된다.
CentOS 7 기준으로 진행한다.

설정만 보려면 Nginx conf 설정하기를 확인 해봅시다.

주요 개념 요약

  • Let's Encrypt : 무료로 SSL/TLS 인증서를 발급해주는 인증서 기관, 비영리기관.
  • Cerbot : Let's Encrypt 인증서를 사용을 자동으로 할 수 있게 해주는 HTTPS를 사용하도록 하는 오픈 소스 소프트웨어.
  • SSL/TLS 인증서 : 아직까지도 SSL인증서라는 용어를 많이 쓰지만 SSL스펙은 폐기된지 오래됨 SSL발급해준다는 곳에서도 발급받으면 모두 TLS로 발급됨, 하지만 요즘 SSL 인증서라는 용어를 언급한다고 정확하지 않다는 식으로 발작하지는 말자. SSL인증서라고 하면 아 TLS인증서 이야기하는구나... 하고 넘어가면된다.

과정

cerbot 설치, cerbot을 이용한 인증서 발급, 갱신 nginx에 설정 적용 순서로 진행된다.

Certbot 설치

Let's Encrypt를 통해 인증서를 발급받고 갱신을 도와주는 소프트웨어로 설치를 해야한다. yum install 로 설치해야하는데 추가 패키지 리포지토리가 반영되어있지 않으면 설치가 되지 않는다.
sudo 혹은 root 계정으로 진행한다.

추가 패키지 리포지토리 설치

# yum install epel-release

certbot 설치

# yum install certbot

인증서 생성

nginx가 80포트와 443포트를 사용중이라면 nginx를 잠시 내려야 에러가 발생하지 않는다. --standalone은 certbot자체 서버로 80 443으로 Let's Encrypt와 통신해서 인증서를 발급받는 과정으로 nginx가 해당 포트를 점유하고 있으면 에러가 발생한다. 또한 443포트를 개방해야 한다. (80은 이미 개방되었다고 가정, 이미 개방되었으면 패스해도 무방)

nginx stop

# service nginx stop

443포트 개방

# firewall-cmd --permanent --add-service=https
# firewall-cmd --reload

certbot을 통한 인증서 발급 본인의 경우 도메인이 figure.kim이므로 아래와 같이 실행 ( -d는 도메인 옵션)
기존에 서브도메인 등으로 생성한 이력이 없다면 이메일 주소 등 정보 등을 물어보는데 대답을 다 하고 나면 생성이 완료된다.

# certbot certonly --standalone -d figure.kim
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Requesting a certificate for figure.kim
Performing the following challenges:
http-01 challenge for figure.kim
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/figure.kim/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/figure.kim/privkey.pem
   Your certificate will expire on 2023-06-03. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

생성된 인증서는 /etc/letsencrypt/live/ 에 위치한다.

Nginx설정에 인증서 정보 반영

종료했던 nginx를 실행시킨다. (서비스에 문제가 없다면 나중에 실행시켜도 무방하다 어짜피 나중에 발급한 인증서를 conf에 적용후 재시작 과정이 수반된다.)

nginx start

# service nginx start

nginx.conf또는 기존 설정 파일을 수정한다. 본인은 figure.kim.conf 파일을 수정한다.

# pwd
/etc/nginx/conf.d
# vi figure.kim.conf

figure.kim.conf

server {
    listen 80;
    server_name figure.kim;
    #80접속시 https로 리다이렉트 시키는 옵션
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl;

    server_name  figure.kim;
    access_log  /var/log/nginx/management/host.access.log  main;
    
    #인증서 위치
    ssl_certificate /etc/letsencrypt/live/figure.kim/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/figure.kim/privkey.pem;

    root /home/site/target-dir;
    index index.html;
    location / {
        try_files $uri $uri.html /index;
    }


    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

저장했으면 설정 파일 검사를 시행한다.

# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

nginx를 재시작한다. 앞서 시작하지 않았으면 restart대신 start입력

# service nginx restart

인증서 갱신 배치 설정 (Certbot, crontab)

/etc/letsencrypt/renewal 경로에 도메인명.conf에 해당하는 파일이 생성되어있을 것이다.

# pwd
/etc/letsencrypt/renewal
# ls
figure.kim.conf

certbot renew 명령시 인증서가 갱신되는데 위에서 본 것 처럼 Nginx가 80,443을 점유하고 있으면 인증서 갱신시 오류가 발생하므로 갱신 앞 뒤로 Nginx를 멈추고 시작하는 명령을 추가해야한다.

# vi figure.kim

[renewalparams] 에 pre_hook과 post_hook을 아래와 같이 추가한다.

# renew_before_expiry = 30 days
version = 1.11.0
archive_dir = blabla
cert = blabla
privkey = blabla
chain = blabla
fullchain = blabla

# Options used in the renewal process
[renewalparams]
authenticator = standalone
account = blabla
manual_public_ip_logging_ok = None
server = https://acme-v02.api.letsencrypt.org/directory
pre_hook = systemctl stop nginx
post_hook = systemctl start nginx

위와같이 설정한 경우 certbot renew명령시 nginx를 멈추고 인증서를 갱신하고 다시 실행하는 과정이 진행된다.
30일마다 직접 명령을 입력할 수 없으니 crontab에 배치를 입력한다.
아래의 명령 실행 시 배치 작업을 입력할 입력기가 실행된다.

# crontab -e

매월 1일에 certbot-renew명령을 수행하도록 다음과같이 입력한다.

0 0 1 * * /bin/bash -l -c 'certbot renew --quiet'

-l은 로그인된 shell을 열고 -c 뒤에 따라오는 명령을 수행한다는 의미이다. --quite 옵션은 로그출력 없이 결과값만 반환하도록 한다.

이제 매달 1일에 갱신 작업이 수행되면서 자동으로 Nginx를 멈추고 실행할 것이다.

Tag


Category


Related Posts

Spring AI란 (feat. 개발자에게 필요한 AI 기본 개념)

Spring AI란 (feat. 개발자에게 필요한 AI 기본 개념)

Spring AI란 무엇이며 무엇을 할 수 있는가.

let's encrypt. certbot 오류로 인해 발급제한이 걸려 인증서 갱신을 못할 때 (내 사이트를 살)

let's encrypt. certbot 오류로 인해 발급제한이 걸려 인증서 갱신을 못할 때 (내 사이트를 살)

let's encrypt. certbot 오류로 인해 발급제한이 걸려 인증서 갱신을 못할 때 로그파일과 임시 파일로 해결 할 수도 있다.

2024-07-04 Development
현장에서 꼭 필요한 애자일 핵심 개념 (K-애자일은 그만! 대표님, 팀장님 제발 이것 좀 보세요ㅠㅠ)

현장에서 꼭 필요한 애자일 핵심 개념 (K-애자일은 그만! 대표님, 팀장님 제발 이것 좀 보세요ㅠㅠ)

현장에서 꼭 필요한 애자일 핵심 개념, 한국에서 자행되는 K-애자일의 폭력성과 문제점을 진단하고 해결책을 제시한다.