본문 바로가기
IT이야기

Certbot으로 인증서 발급시 방화벽 오류 문제 해결

by ◖♪♩♫◗ 2023. 3. 17.
반응형

Ubuntu에서 Certbot으로 https 인증서 발급 시 방화벽 오류 문제로 여러 종류의 인증 방법을 시도해 보았으나, 매번 방화벽 오류일 것이라는 오류만 뿜어내고 해결을 하지 못하고 있다가 우연찮게 다른 처리 방법을 찾게 되어 게시하게 되었습니다.

직접 찾은 방법은 도메인 연결 작업 시 TXT 레코드를 도메인 서버에 등록하는 방법입니다.

인증서 발급 받을 서버에 도메인 연결 시 호스팅 서버에서 A 레코드와 발급받은 도메인을 등록해 주고, 추가로 HTTPS 인증을 위한  TXT 레코드를 등록해 주는 방법입니다.

 

Certbot으로 manual로 dns를 통한 인증서 발급 방법

1. 일반적인 발급 방법

일반적으로 인증서 발급 시 정상적이면 아래 명령어로 정상적으로 발급이 됩니다. 다만, 아래와 같이 방화벽 오류라는 메시지와 함께 발급이 중단되는 경우가 있습니다. 

root@ry:/home/ssi# certbot certonly --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log

Which names would you like to activate HTTPS for?
We recommend selecting either all domains, or all domains in a VirtualHost/server block.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: ry.com
2: www.ry.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):
Requesting a certificate for realtykr.shop and www.ry.com

Certbot failed to authenticate some domains (authenticator: nginx). The Certificate Authority reported these problems:
  Domain: ry.com
  Type:   connection
  Detail: 1**.2**.1**.2**: Fetching http://ry.com/.well-known/acme-challenge/4_LVG1354dsdgsdgdgdggdgdnuVb1Y: Timeout during connect (likely firewall problem)

  Domain: www.ry.com
  Type:   connection
  Detail: 1**.2**.1**.2**: Fetching http://www.ry.com/.well-known/acme-challenge/u2g0dgdgdgdgas23323tgsegb1nKM_EANy6fg0E: Timeout during connect (likely firewall problem)

Hint: The Certificate Authority failed to verify the temporary nginx configuration changes made by Certbot. Ensure the listed domains point to this nginx server and that it is accessible from the internet.

Some challenges have failed.
Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.

각각의 통신사의 조건은 달라 비교하기 힘들지만, 분명 내 서버는 방화벽에는 문제가 없다는 것이 확실하다면, 99% 이상은 대부분 통신사에서 차단이나 딜레이로 인한 문제가 생기는 것으로 보입니다. 그래서, 도메인 서버에서 TXT 레코드에 인증값을 등록하여 인증 시 정상적으로 발급되는 것으로 직접 확인이 되어 설명드립니다.

 

2. Manual로 DNS 연결을 통한 인증서 발급 방법

1번 방법과 같이 "certbot certonly --nginx" 명령으로 발급 시 방화벽 문제가 없는데도 불구하고, 방화벽 오류라는 메시지를 출력하며 인증서 발급이 중단된다면, 아래와 같이 manual로 dns연결을 통해 인증서를 발급받으면 됩니다.

 

root@ry:/home/ssi# certbot certonly -d "*.ry.com" --manual --preferred-challenges dns
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for *.ry.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name:

_acme-challenge.ry.com.

with the following value:

CvqiPNMLrdXU88329846486328922AR7CnV-mI   : 값은 변조함. ^^;

 

명령어 :  #certbot certonly -d "*.ry.com" --manual --preferred-challenges dns

 

위 명령 실행 시 인증 값이 나타나면 <Enter키> 입력하지 말고, 먼저 도메인 관리 사이트로 가서 도메인 연결 시 A 레코드 등록하고, TXT 레코드를 추가로 등록, 호스트에 _acme-challenge 입력 value에 생성된 값 "CvqiPNMLrdXU88329846486328922 AR7 CnV-mI" 입력합니다.

 

그다음, 새로운 터미널 하나를 더 열어 다음과 같이 입력 후 정상적으로 DNS와 연결이 되었는지 확인합니다.

 

#nslookup -q=TXT _acme-challenge.ry.com

명령어 : #nslookup -q=TXT _acme-challenge.ry.com

 

정상적으로 조회가 된다면, 인증키 발급 터미널로 가서, <Enter키> 입력하고 마무리합니다.

Before continuing, verify the TXT record has been deployed. Depending on the DNS
provider, this may take some time, from a few seconds to multiple minutes. You can
check if it has finished deploying with aid of online tools, such as the Google
Admin Toolbox: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.ry.com.
Look for one or more bolded line(s) below the line ';ANSWER'. It should show the
value(s) you've just added.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/ry.shop/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/ry.shop/privkey.pem

 

인증키가 /etc/letsencrypt/live/ry.shop/ 위치에 두 개가 저장이 됩니다.

이 인증키를 /etc/nginx/sites-available/{도메인}. conf에 등록해 주면 됩니다.

 

아래 shell 창은 도메인.conf 샘플입니다. 본인의 사이트 설정에 맞게 고쳐 쓰면 되겠습니다.

## http://ry.com and http://www.ry.com redirect to https://www.ry.com
server {
listen 80;
listen [::]:80;
server_name ry.com www.ry.com;

include /etc/nginx/snippets/letsencrypt.conf;

location / {
return 301 https://www.ry.com$request_uri;
}
}

 

## Serves https://www.ry.com
server {
server_name www.ry.com;
listen 443 ssl http2;
listen [::]:443 ssl http2;

ssl_certificate /etc/letsencrypt/live/ry.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ry.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/ry.com/fullchain.pem;
include /etc/nginx/snippets/ssl.conf;

root /var/www/ry.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}

## https://ry.com redirects to https://www.ry.com
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name ry.com;

ssl_certificate /etc/letsencrypt/live/ry.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ry.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/ry.com/fullchain.pem;
include /etc/nginx/snippets/ssl.conf;

location / {
return 301 https://www.ry.com$request_uri;
}
}

이상 포스팅을 마치겠습니다. 감사합니다.

반응형

댓글