今回は Cloudflare ( クラウドフレア ) で DNS-01 方式 ワイルドカード証明書を取得・自動更新 ( CRON JOB ) する方法を紹介します。クラウドフレアへアカウント登録および DNS ネームサーバの変更とdns-cloudflare プラグインをインストールが必要です。OS は CentOS7 です。
事前準備
- 事前準備1Cloudflare ( クラウドフレア ) 側
遷移されたページをそのまま開いておいてください。
- 事前準備2ドメイン登録機関側
仮に、example.com のドメイン登録は Freenom で行ったと前提します。Freenom にアクセスして先ほどメモった DNS ネームサーバに書き換えます。変更方法は こちら をご参考ください。
# 例: norm.ns.cloudflare.com (173.245.59.134) ulla.ns.cloudflare.com (173.245.58.233) # ping コマンドでIPアドレスを取得 [root@centos7 named]# ping norm.ns.cloudflare.com PING norm.ns.cloudflare.com (173.245.59.134) 56(84) bytes of data. 64 bytes from norm.ns.cloudflare.com (173.245.59.134): icmp_seq=1 ttl=58 time=7.42 ms [root@centos7 named]# ping ulla.ns.cloudflare.com PING ulla.ns.cloudflare.com (173.245.58.233) 56(84) bytes of data. 64 bytes from ulla.ns.cloudflare.com (173.245.58.233): icmp_seq=1 ttl=58 time=7.27 ms
- 事前準備3Cloudflare ( クラウドフレア ) 側
終わったら先ほどのクラウドフレア側の画面に戻って、Re-check now をクリックして連動を完了します。
ログイン後初期画面には、追加したサイトリストがあります。そこに example.com に Active 表示が出ていたら OK です。
サーバ環境 ( CentOS 7.6 / Apache 2.4.39 / BIND 9.9.4)
[root@centos7 ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [root@centos7 ~]# /usr/local/apache2/bin/httpd -v Server version: Apache/2.4.39 (Unix) Server built: May 26 2019 16:03:35 [root@centos7 ~]# named -v BIND 9.9.4-RedHat-9.9.4-74.el7_6.1 (Extended Support Version) [root@centos7 named]# certbot --version certbot 0.34.2 [root@centos7 named]#
Certbot と dns-cloudflare プラグインをインストール
(選択) 既に設置されたパッケージがあれば /etc/letsencrypt をバックアップし、全て削除してからインストールするのが楽です。
# 削除 [root@centos7 named]# mv /etc/letsencrypt /etc/letsencrypt-bak [root@centos7 named]# yum remove -y `yum list installed | cut -d " " -f 1 | grep certbot` # インストール [root@ centos7〜]#yum install epel-release [root@ centos7〜]#yum install certbot python2-certbot-dns-cloudflare # 確認 [root@centos7 named]# yum list installed | grep certbot certbot.noarch 0.34.2-3.el7 @epel python2-certbot.noarch 0.34.2-3.el7 @epel python2-certbot-dns-cloudflare.noarch 0.34.2-1.el7 @epel [root@centos7 named]#
Certbot 用 Cloudflare API credentials を作成
クラウドフレアのアカウントページ から Global API Key を取得できます。
[root@centos7 ~]# mkdir -p ~/.secrets/certbot/ [root@centos7 ~]# chmod 600 ~/.secrets/certbot/cloudflare.ini [root@centos7 ~]# vi ~/.secrets/certbot/cloudflare.ini # Cloudflare API credentials used by Certbot dns_cloudflare_email = admin@example.com dns_cloudflare_api_key = 8345692e953e123456de118bfe478054b8b8a [root@centos7 ~]#
ワイルド証明書の発行テスト
ここからは、
tail -f /var/log/message 又は、journalctl -fu named でエラーがないことを確認しながら進みましょう。–dry-run と –debug オプションを追加して実行します。
certbot certonly \ --dry-run \ --debug \ --dns-cloudflare \ --dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini \ --dns-cloudflare-propagation-seconds 5 \ -d example.com \ -d "*.example.com"
実行すると、The dry run was successful. と、表示されれば OK です。
[root@centos7 named]# certbot certonly --dry-run --debug --dns-cloudflare --dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini --dns-cloudflare-propagation-seconds 5 -d example.com -d "*.example.com" --server https://acme-v02.api.letsencrypt.org/directory Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator dns-cloudflare, Installer None Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org Obtaining a new certificate Performing the following challenges: dns-01 challenge for example.com dns-01 challenge for example.com Starting new HTTPS connection (1): api.cloudflare.com Starting new HTTPS connection (1): api.cloudflare.com Waiting 5 seconds for DNS changes to propagate Waiting for verification... Cleaning up challenges Starting new HTTPS connection (1): api.cloudflare.com Starting new HTTPS connection (1): api.cloudflare.com IMPORTANT NOTES: - The dry run was successful. [root@centos7 named]#
発行テストが通れたら Certbot アカウント を登録して 実際のワイルドカード証明書を発行 します。
Certbot アカウントを登録 ( 選択 )
登録済みであれば、スキップしてください。
# メールアドレスをシェアしないで登録する certbot register --email admin@example.org --agree-tos --no-eff-email
ワイルドカード証明書を発行
–dns-cloudflare-propagation-seconds オプションはデフォルトで 60秒、長いと思ったら調整します。
certbot certonly \
–dns-cloudflare \
–dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini \
–dns-cloudflare-propagation-seconds 5 \
-d example.com \
-d “*.example.com”
[root@centos7 named]# certbot certonly --dns-cloudflare --dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini --dns-cloudflare-propagation-seconds 5 -d example.com -d "*.example.com" Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator dns-cloudflare, Installer None Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org Obtaining a new certificate Performing the following challenges: dns-01 challenge for example.com dns-01 challenge for example.com Waiting 5 seconds for DNS changes to propagate Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/example.com/privkey.pem Your cert will expire on 2019-09-15. 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 [root@centos7 named]#
/etc/letsencrypt/live/ドメイン名 以下に保存されます。
[root@centos7 named]# ls /etc/letsencrypt/live/example.com/ cert.pem chain.pem fullchain.pem privkey.pem README [root@centos7 named]#
証明書の更新テスト
Congratulations, all renewals succeeded. と、表示されたら OK です。
[root@centos7 named]# certbot renew --dry-run Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/example.com.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator dns-cloudflare, Installer None Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org Renewing an existing certificate - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed without reload, fullchain is /etc/letsencrypt/live/example.com/fullchain.pem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/example.com/fullchain.pem (success) ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates above have not been saved.) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - [root@centos7 named]#
自動更新設定 ( CRON JOBへ登録 )
自動更新をテストしてエラーがなければ CRON JOB へ登録します。
毎日2回(正午、真夜中)更新するように設定
[root@centos7 named]# crontab -e #下記の内容を追加 0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 60)' && certbot renew [root@centos7 named]#
これから https の設定をするなら、こちら をご参考ください。
デバッグ
All authorizations were not finalized by the CA.
LISTENポートを確認する
[root@centos7 named]# netstat -pant | grep -E ':80|:443' tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 11501/httpd tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 8998/java tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 11501/httpd tcp 0 0 123.123.123.10:443 192.0.102.40:44695 TIME_WAIT -
参考文献
Certbot: Apache on CentOS/RHEL 7
Certbot-dns-cloudflare’s documentation
How does Cloudflare work?
コメント