ポンコツエンジニアのごじゃっぺ開発日記。

いろいろポンコツだけど、気にするな。プログラム&ロボット大好きなポンコツが日々の記録を残していきます。 自動で収入を得られるサービスやシステムを作ることが目標!!

Let's EncryptでSSL証明書を自動で更新するようにしてみた

このブログをGCP上で運用していて、無料で使えるSSL証明をLet's Encryptを利用しています。

ただ、Let's Encryptの期限が3ヶ月とちょうど忘れた頃に更新しないといけない期間です。

そこで、このSSL証明書の更新を自動化させてみたので、この記事で紹介したいと思います。

 

はじめに

まずはこのブログの構成を知ってもらわないといけないですね。

こちらの記事にも書いてあります: GCP上でWordPressを動かしてみた。

f:id:ponkotsu0605:20190418010226p:plain

ざっくりとポイントだけ書きますと

  • 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時になったので、こうしてみました。(テキトーな理由)

f:id:ponkotsu0605:20190418010446p:plain

 

さいごに

このようにして、SSL証明書の更新を自動化することができました。これで証明書の期限を気にする必要がなくなりましたね。