Ubuntu 18.04에서 acme-dns-certbot을 사용하여 Let’s Encrypt Cerificate를 DNS 인증으로 발급 받는 方法

著者は、COVID-19 救援基金写作用於捐赠プログラムの一部として寄付を受け取るために選択しました。

導言

Let’s Encrypt Cerificate のほとんどは HTTP 検証を使用して発行されています。これにより、証明書を单一のサーバーに簡単にインストールすることができます。しかし、HTTP 検証は負荷分散されたウェブサイトに使用する証明書の発行には常に適していませんし、ワイルドカード証明書の発行も可能ではありません。

DNS 検証により、証明書の発行要求は HTTP を介してコンテンツを提供する代わりに DNS 記録を使用して検証されることができます。これは、負荷バランサーの背後に運営されている複数のウェブサーバークラスタに同時に証明書が発行されるか、インターネットから直接アクセスできないシステムに証明書が発行されることを意味します。DNS 検証を使用してもワイルドカード証明書をサポートします。

acme-dns-certbot 도구는 Certbot과 타사 DNS 서버를 연결하여 인증서 유효성 검사 레코드를 API를 통해 자동으로 설정할 수 있습니다. 이 방식의 장점은 Certbot을 DNS 제공업체 계정에 직접 통합할 필요가 없고, 전체 DNS 구성에 대한 무제한 액세스 권한을 부여할 필요가 없어 보안에 유리합니다.

위임된 DNS 영역을 사용하여 인증서 확인 레코드에 대한 조회를 타사 DNS 서비스로 리디렉션하므로, 초기 설정이 완료되면 수동 검증 없이 원하는 만큼의 인증서를 요청할 수 있습니다.

acme-dns-certbot의 또 다른 주요 장점은 로드 밸런서 뒤에서 실행되거나 HTTP를 통해 직접 접근할 수 없는 개별 서버에 대한 인증서를 발급할 수 있다는 것입니다. 이 경우 전통적인 HTTP 인증서 검증을 사용할 수 없으며, 각 서버에 검증 파일을 설정해야 합니다. acme-dns-certbot 도구는 내부 시스템이나 스테이징 환경과 같이 인터넷에 액세스할 수 없는 서버에 대한 인증서를 발급하는 데에도 유용합니다.

이 자습서에서는 Certbot의 acme-dns-certbot 후크를 사용하여 DNS 검증을 통해 Let’s Encrypt 인증서를 발급합니다.

이전 요구 사항

이 튜토리얼을 완료하기 위해서는 다음과 같은 것이 필요합니다.

  • Ubuntu 18.04 서버를 Ubuntu 18.04 기본 서버 설정을 따라 구성한 것과 sudo Non-root 사용자를 포함하는 것입니다.

  • TLS Cerificate를 인 shore 할 수 있는 도메인 이름과 DNS 레코드를 추가 할 수 있는 기능을 포함하는 것입니다. 이 특정 예에서는 your-domainsubdomain.your-domain, 그리고 *.your-domain로 와이어 스탠드 Cerificate를 얻을 수 있습니다. 그러나 이 것은 필요하다면 다른 도메인, 하위 도메인 또는 와이어 스탠드에 적용할 수 있습니다.

이 것을 준비하고 나면, 시작하기 전에 Non-root 사용자로 서버에 로그인하십시오.

Step 1 — Certbot 설치

이 단계에서, Let’s Encrypt cerificate를 발급하고 관리하기 위해 사용되는 Certbot 프로그램을 설치할 것입니다.

Certbot은 공식 Ubuntu Apt 仓储에서 사용 가능하나, Certbot 개발자들이 유지하는 仓储을 사용하는 것이 좋습니다. 왜냐하면 이러한 仓储은 Sofware의 最新版을 总是 가지고 있기 때문입니다.

Certbot仓储을 추가하기 시작합니다:

sudo apt-add-repository ppa:certbot/certbot

Enter キー를 press하여 모달을 허용하고 仓储을 시스템에 추가하는 것입니다.

次に, Certbot パッケージ을 설치합니다:

sudo apt install certbot

설치가 완료되면, Certbot가 성공적으로 설치되었는지 확인할 수 있습니다:

certbot --version

이것은 다음과 같이 나타낼 것입니다:

Output
certbot 0.31.0

이 단계에서 Certbot을 설치했습니다. 次に, acme-dns-certbot 훅을 다운로드하고 설치하십시오.

Step 2 — acme-dns-certbot 설치

이제 기본 Certbot 프로그램이 설치되었으므로, Certbot이 DNS 인증 모드로 작동하게 해줄 acme-dns-certbot을 다운로드하고 설치할 수 있습니다.

스크립트의 한 副本을 다운로드하는 것을 시작합니다:

주의: ベストプracticeとして、このGithubリポジトリを確認し、スクリプトを実行する前にそれを読んでください。また、このリポジトリをフorkし、そしてacme-dns-certbot.pyスクリプトを使用することもできます。このフォークは、スクリプトが私たちのコントロール下にあり、未確認の変更に対する影響を受ける可能性が低いように、追加の安全保障レイヤーを提供します。

wget https://github.com/joohoi/acme-dns-certbot-joohoi/raw/master/acme-dns-auth.py

下载が完了したら、スクリプトを実行可能にする:

chmod +x acme-dns-auth.py

そして、お好みのテキストエディタを使用してファイルを編集し、スクリプトをPython 3を強制して使用するために最初の行を調整します:

nano acme-dns-auth.py

最初の行の末尾に3を追加します:

acme-dns-certbot.py
#!/usr/bin/env python3
. . .

これは、スクリプトが最新のサポートされているPython 3を使用し、古いPythonバージョン2を使用するのを強制する必要があります。

完了したら、ファイルを保存して閉じます。

最後に、Certbot Let’s Encryptディレクトリにスクリプトを移動して、Certbotがそれを読み取ることができるようにします:

sudo mv acme-dns-auth.py /etc/letsencrypt/

このステップで、acme-dns-certbot钩りを下载してインストールしました。次に、セットアッププロセスを開始し、最初の証明書を発行するための作业を進めます。

STEP 3 — ACME-DNS-CERTBOT 설정

ACME-DNS-CERTBOT을(를) 사용하기 시작하려면, 최초의 설정 과정을 완료하고 至少 한 개의 cerificate를 발급해야 합니다.

Certbot을 실행하여 DNS 인증 방식을 사용하여 cerificate를 발급하도록 강제하십시오. 이这将 acme-dns-certbot 스크립트를 실행하고 초기 설정 과정을 시작합니다:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain -d your-domain

이번 경우에는 raw certificate를 발급하고자 하며, 서비스에 자동으로 설치하는 것이 아닌 Certbot의 자동화된 인tegration 기능을 사용하지 않기 위해 --manual 인자를 사용합니다.

Certbot을 acme-dns-certbot 훅을 사용하도록 설정하기 위해 --manual-auth-hook 인자를 사용하고, --preferred-challenges 인자를 사용하여 Certbot이 DNS 인증을 우선 시키게 합니다.--debug-challenges 인자를 사용하여 Certbot이 cerificate를 인증하기 전에 일시 정지하도록 지시합니다. 이는 이 단계 뒷부분에서 다룹니다. DNS CNAME 레코드(들)를 설정하기 위한 시간을 얻게 합니다. --debug-challenges 인자를 사용하지 않으면, Certbot은 일시정지하지 않으므로, 필요한 DNS 변경을 할 수 있는 시간을 얻을 수 없습니다.

-d 인자로 사용하고자 하는 도메인 이름을 대체하기 memo.

표준 Certbot 단계를 따라가면 결국 다음과 같은 메시지가 나올 것입니다.

Output
... Output from acme-dns-auth.py: Please add the following CNAME record to your main DNS zone: _acme-challenge.your-domain CNAME a15ce5b2-f170-4c91-97bf-09a5764a88f6.auth.acme-dns.io. Waiting for verification... ...

DNS CNAME 레코드를 필요한 것을 도메인의 DNS 구성에 추가해야 합니다. 이것은 ACME DNS 서비스에게 _acme-challenge サブ도메인의 관리를 위임하게 됩니다. 이렇게 하면 acme-dns-certbot이 인증 요청을 VALIDATE하기 위해 必要한 DNS 레코드를 설정할 수 있습니다.

DigitalOcean를 DNS 제공업체로 사용하고 있다면, DNS 레코드를 コントロール パネル 내에서 설정할 수 있습니다.

TTL(시간-to-live)를 约 300 초로 설정하는 것이 推奨されます. 이렇게 하면 레코드의 변경이 빠르게 퍼지는 것을 위한 도움이 됩니다.

DNS 레코드를 구성한 후, Certbot로 돌아가 ENTER을 눌러 인증 요청을 VALIDATE하고 발급 과정을 완료하십시오.

이 과정은 몇 초의 시간이 소요되며, 인증 발급이 완료되었음을 인former하는 메시지를 볼 수 있습니다.

Output
... Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your-domain/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/your-domain/privkey.pem ...

acme-dns-certbot을 처음 실행하고, 필요한 DNS 레코드를 설정하고, 인증서를 성공적으로 발급하였습니다. 이제 인증서의 자동 수정을 설정할 것입니다.

第四步 – 使用 acme-dns-certbot

이 마지막 단계에서, 您은 acme-dns-certbot을 사용하여 추가적인 인증서를 발급하고 现有인증서를 갱신하게 되ます.

Initially, 您이 acme-dns-certbot을 사용하여 至少한 인증서를 성공적으로 발급하셨다면, 다른 DNS 이름의 인증서를 발급하기 위해서는 또 다른 DNS CNAME 레코드를 추가할 필요가 없습니다. 그러나, 다른 하위 도메인 또는 全新 도메인 이름에 대한 인증서를 收购하고자 하면, 다른 CNAME 레코드를 추가하게 될 것입니다.

例如, 다시 한 번 独立的 와일드 카드 인증서를 발급하는 것은 인증 과정을 다시 실행하지 않고 할 수 있습니다:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain

그러나, 하위 도메인에 대한 인증서를 발급하려고 하면, 하위 도메인용 CNAME 레코드를 추가하는 것을 요구합니다:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d subdomain.your-domain

이것은 단계 3에서 실행한 초기 세팅과 유사한 输出을 보여줍니다:

Output
... Please add the following CNAME record to your main DNS zone: _acme-challenge.subdomain.your-domain CNAME 8450fb54-8e01-4bfe-961a-424befd05088.auth.acme-dns.io. Waiting for verification... ...

이제 acme-dns-certbot을 사용하여 인증서를 발급할 수 있으며, 이를 통해 인증서 갱신 과정도 고려해보시는 것이 좋습니다.

인증서가 만기 가까이에 있으면, Certbot은 자동으로 그것들을 갱신할 수 있습니다:

sudo certbot renew

갱신 과정은 사용자 인터ak션 없이 실행되며, 초기 세팅 시 지정한 모든 설정 옵션을 기억할 것입니다.

만료일에 가까워질 때까지 기다리지 않고도 이것이 제대로 작동하는지 테스트하기 위해 드라이 런을 실행할 수 있습니다. 이것은 실제로 구성을 변경하지 않고 갱신 프로세스를 시뮬레이션합니다.

표준 renew 명령을 사용하되 --dry-run 인수를 추가하여 드라이 런을 실행할 수 있습니다:

sudo certbot renew --dry-run

이는 다음과 유사한 출력을 생성하며, 갱신 프로세스가 올바르게 작동하고 있다는 확신을 제공합니다:

Output
... Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator manual, Installer None Renewing an existing certificate Performing the following challenges: dns-01 challenge for your-domain dns-01 challenge for your-domain Waiting for verification... Cleaning up challenges ...

이 마지막 단계에서 다른 인증서를 발급한 다음 Certbot 내에서 자동 갱신 프로세스를 테스트했습니다.

결론

이 글에서는 DNS 검증을 사용하여 인증서를 발급하기 위해 Certbot과 acme-dns-certbot을 설정했습니다. 이를 통해 와일드카드 인증서를 사용할 수 있으며, 로드 밸런서 뒤에 있을 수 있는 다수의 개별 웹 서버를 관리할 수 있는 가능성이 열립니다.

스크립트의 업데이트를 위해 acme-dns-certbot 리포지토리를 계속 주시하세요. 항상 최신 지원 버전을 실행하는 것이 좋습니다.

acme-dns-certbot에 대해 더 자세히 알고 싶다면 acme-dns-certbot의 서버 측 요소인 acme-dns 프로젝트의 문서를 검토해 보는 것이 좋습니다:

acme-dns 소프트웨어는 자신의 主机에 설치하여도 가능하며, 높은 보안 또는 複雑한 환경에서 운영 중이라면 이를 시행하시는 것이 이익이 있을 수 있습니다.

대신, ACME DNS 인증 과정의 기술적 세부 정보를 연구하기 위해 공식 RFC 문서의 관련 섹션을 复查하여 과정이 어떻게 동작하는지 이를 확인할 수 있습니다:

Source:
https://www.digitalocean.com/community/tutorials/how-to-acquire-a-let-s-encrypt-certificate-using-dns-validation-with-acme-dns-certbot-on-ubuntu-18-04