LetsEncrypt 와일드 카드 인증서 업데이트 자동화 (route53에만 해당)

과제·배경·개요



LetsEncrypt 와일드카드 인증서 업데이트에서 certbot renew를 실행하면 다음 오류가 발생합니다.

와일드카드 인증서의 경우 해당 도메인을 소유하고 있음을 증명하기 위해 해당 호스트에 _acme-challenge.nyango.com라는 TXT 레코드를 추가해야 하지만 단순히 renew 설정할 수 없기 때문입니다. (TXT 레코드의 값은 certbot에서 ad hoc로 지정되므로 미리 설정할 수 없습니다)

자동화 스크립트를 작성할 수 있는 것 같습니다만, 사양을 조사하는데 얼마나 시간이 걸리는지 상상도 할 수 없어 신경 쓰지 않습니다. LetsEncrypt 증명서의 유효기간은 3개월이므로 2.5개월에 1회 정도 수동으로 시코시코 갱신하면 됩니다만, 그것은 그것으로 귀찮다.

자동화 할 수 없는지 조사해 보면 방법이 있었으므로 정리했습니다
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/nyango.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Could not choose appropriate plugin: The manual plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.',)
Attempting to renew cert (nyango.com) from /etc/letsencrypt/renewal/nyango.com.conf produced an unexpected error: The manual plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.',). Skipping.
All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/nyango.com/fullchain.pem (failure)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/nyango.com/fullchain.pem (failure)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 renew failure(s), 0 parse failure(s)


자동화 방법



Route53 제한을 사용하는 경우 certbot-dns-route53라는 플러그인을 사용하여 자동화할 수 있습니다.
certbot renew 때때로 옵션으로 이 플러그인을 지정하면 위에서 설명한 TXT 레코드를 동적으로 작성해주는 것 같습니다. (실행 후 확인했는데 TXT 레코드가 존재하지 않았기 때문에 마지막으로 삭제해주는 것 같습니다. 친절!)

route53에 액세스 할 필요가 있으므로, 필요한 최소한의 권한을 가지는 IAM 정책을 IAM 유저에게 할당해, 그 자격 증명을 certbot 를 실행하는 단말(의 실행 유저)에 할당하면 OK입니다.

플러그인 설치


# pip install certbot-dns-route53

IAM 정책 정의


{
    "Version": "2012-10-17",
    "Id": "certbot-dns-route53 policy",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "route53:ListHostedZones",
                "route53:GetChange"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "route53:ChangeResourceRecordSets"
            ],
            "Resource": [
                "arn:aws:route53:::hostedzone/★HOSTZONE ID★"
            ]
        }
    ]
}

호스팅 영역 ID는 Route53에서 확인합니다.



IAM 사용자 생성



IAM 사용자를 만들고 위의 정책을 할당합니다. 자격 증명(액세스 키 및 비밀 키)을 삼가합니다.

IAM 사용자의 자격 증명을 단말기로 설정


certbot renew 를 실행하는 단말(의 실행 유저)에 자격 증명을 설정. 이 경우 루트 사용자로 설정됩니다.
# aws configure

위를 실행하면 ~/.aws/credencials에 등록됩니다.
[default]
aws_secret_access_key = dscyiPgxxxxxxxxxxxxxxxxxxxxxx
aws_access_key_id = AKIAxxxxxxxxxxxxxxxxxxxxxxxx

테스트 실행


certbot renew --force-renewal --no-self-upgrade --server https://acme-v02.api.letsencrypt.org/directory --agree-tos --dns-route53

성공하면 콘솔 끝에 다음 정보가 출력됩니다.
Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/nyango.com/fullchain.pem (success)

스크립트 작성



인증서를 업데이트한 후 http 서버를 다시 시작하는 스크립트를 준비합니다.

/root/update_cert_wildcard.sh
#! /bin/bash

/bin/certbot renew --force-renewal --no-self-upgrade --server https://acme-v02.api.letsencrypt.org/directory --agree-tos --dns-route53

/bin/systemctl restart httpd.service


(2019/09/04 추가)



다음 가져오기 오류가 발생했습니다.ImportError: 'pyOpenSSL' module missing required functionality. Try upgrading to v0.14 or newer.
대처
# pip install --upgrade pip
# pip install requests --ignore-installed
# pip install --upgrade --force-reinstall 'requests==2.6.0'

cron에 할당


0 4 * * 0 /root/update_cert_wildcard.sh

참고 URL


  • 플러그인 공식 문서
  • Route53에서 Let’s Encrypt 인증서 획득 및 업데이트를 위한 최소 단계 - Qiita
  • Let's Encrypt의 와일드카드 SSL 인증서 갱신에 어려움을 겪은 이야기
  • 좋은 웹페이지 즐겨찾기