このブログをGCP上で運用していて、無料で使えるSSL証明をLet's Encryptを利用しています。
ただ、Let's Encryptの期限が3ヶ月とちょうど忘れた頃に更新しないといけない期間です。
そこで、このSSL証明書の更新を自動化させてみたので、この記事で紹介したいと思います。
はじめに
まずはこのブログの構成を知ってもらわないといけないですね。
こちらの記事にも書いてあります: GCP上でWordPressを動かしてみた。
ざっくりとポイントだけ書きますと
- Compute Engine上でWordPressを動かしている
- Cloud Load Balancingを挟んで、LB上でSSLの証明書を配置している
ということなので、ざっくりとした流れは以下のようになります。
- SSL証明書を更新
- ssl-certificatesの再作成
- target-https-proxiesのssl-certificatesを更新
- 古いssl-certificatesを削除
では、これらについて詳しく説明したいと思います。
以下の更新作業についてはすべてWordPressが載っているサーバ(Lunux)上で作業を行っています。
SSL証明書を作成する(1回目の手続き)
Let's Encriptは1度目だけは別の方法で作成してあげないといけません。と言っても、サイト情報などを入力するだけなのですがね。
certbotをインストールする
$ curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto $ chmod 700 /usr/bin/certbot-auto
これでcertbot-autoコマンドが使えるようになりました。
証明書の発行
certbotがインストールできたら、以下のようなコマンドでSSL証明書を自動生成します。
certbot-auto certonly --webroot -w /var/www/html -d blog.pnkts.net --email hoge@fuga.com
--webrootオプションでウェブサーバーモードに設定
-wオプションでドキュメントルートのパスを指定します。
-dオプションで認証対象のドメイン名を指定します。
--emailオプションで連絡用のメールアドレスを指定します。
生成された証明書の確認
以下のように確認できます。
# ls /etc/letsencrypt/live/blog.pnkts.net/
cert.pem chain.pem fullchain.pem privkey.pem README
これらのファイルをGCPのコンソール上でLBに設定してあげると、ちゃんとHTTPSでアクセスすることができます。
GCPコンソール上でなくても、gcloudコマンドを使ってもできるので、好きな方でやってみてください。
SSL証明書を更新する(2回目以降の手続き)
2回目以降は、最初にも書いたように以下の手順で更新することができます。
- SSL証明書を更新
- ssl-certificatesの再作成
- target-https-proxiesのssl-certificatesを更新
- 古いssl-certificatesを削除
さっそく完成したスクリプトを紹介したいと思います。
update_ssl_certificates.sh
BASE_SSL_CERTIFICATES_NAME="wp-blog-pnkts-ssl" OLD_SSL_CERTIFICATES_NAME=`gcloud compute ssl-certificates list | grep $BASE_SSL_CERTIFICATES_NAME | tail -n1 | cut -f1 -d' '` echo "old:"$OLD_SSL_CERTIFICATES_NAME TODAY=$(date "+%Y%m%d%H%M%S") NEW_SSL_CERTIFICATES_NAME=$BASE_SSL_CERTIFICATES_NAME"-"$TODAY echo "new:"$NEW_SSL_CERTIFICATES_NAME # 証明証の更新 certbot-auto renew --force-renewal # ssl-certificatesの再作成 gcloud compute ssl-certificates create $NEW_SSL_CERTIFICATES_NAME \ --certificate /etc/letsencrypt/live/blog.pnkts.net/cert.pem \ --private-key /etc/letsencrypt/live/blog.pnkts.net/privkey.pem \ --description "blog.pnkts.net certification." # target-https-proxiesのssl-certificatesを更新 gcloud compute target-https-proxies update wordpress-blog-pnkts-target-proxy-4 \ --ssl-certificates $NEW_SSL_CERTIFICATES_NAME # ssl-certificatesの削除 gcloud compute ssl-certificates delete $OLD_SSL_CERTIFICATES_NAME \ --quiet
各処理を簡単に説明します。
SSL証明書を更新
certbot-auto renewというコマンドを叩くことで証明書を更新することができます。cerbotコマンドって優秀ですね。
--force-renewalというオプションをつけないと以下のように、期限が切れるまでは更新ができないのです。
The following certs are not due for renewal yet: /etc/letsencrypt/live/blog.pnkts.net/fullchain.pem expires on 2018-08-09 (skipped) No renewals were attempted.
ssl-certificatesの再作成
ssl-certificatesのドキュメントはこちらになります→https://cloud.google.com/sdk/gcloud/reference/compute/ssl-certificates/
このドキュメントをみてわかるように、作成(create)、削除(delete)はできるのですが、更新はすることができません。
そこで、作成(create)して、ターゲットをそちらに変更することで実現しています。
命名規則としては、「BASE_SSL_CERTIFICATES_NAME-%Y%m%d%H%M%S」という感じで、重複しないようにタイムスタンプをサフィックスにつけています。
target-https-proxiesのssl-certificatesを更新
そのターゲットの変更というのがこちらになります。
target-https-proxiesのドキュメントはこちらになります→https://cloud.google.com/sdk/gcloud/reference/compute/target-https-proxies/
こちらはちゃんと更新(update)が用意されていますね。
古いssl-certificatesを削除
不要になったssl-certificatesを削除します。
上の処理でターゲットを変更して、参照されてない状態じゃないと実行できないので、この処理はスクリプトの最後に実行しています。
定期実行するように設定する
crontabなどに設定することで、定期実行するようにして、証明書の更新を忘れないようにします。
crontab -l
0 1 * * 1 /home/user/update_ssl_certificates.sh >/dev/null 2>&1
毎週月曜日の1時0分に実行するようにすると、証明書がこのようにちょうど日曜日の0時になったので、こうしてみました。(テキトーな理由)
さいごに
このようにして、SSL証明書の更新を自動化することができました。これで証明書の期限を気にする必要がなくなりましたね。