スタッフダイアリー

CentOS 7で無料SSL証明書 Let's Encrypt をDNS認証で取得して自動更新

システム課 黒田です。

昨今の常時SSL化の流れに沿い、これもまた流行りの
無料SSLサーバ証明書「Let's Encrypt」をDNS認証で取得し、
cronで自動更新する手順を載せます。

冗長構成のサーバやサーバ移管時など、HTTP認証ではなく
DNS認証を用いて証明書を取得する場面で重宝します。

また、復数ドメインを1枚の証明書に含められるので
今回は2つのドメインを設定して取得します。

■検証環境
 CentOS 7.3.1611
 Apache 2.4.6
 Python 2.7.5
■対象ドメインのネームサーバ
 AWS Route 53
■必要なもの
 Route53FullAccess権限のあるIAMユーザーの
 アクセスキー ID とシークレットアクセスキー

まずはRoute 53をCLIから操作するための準備をします。
以降の操作はすべてrootで行います。

1.AWS CLI のインストール
AWS公式手順の通り
http://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html

# curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
# python get-pip.py
# pip install awscli


2.AWS CLI の設定
# aws configure

AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: ap-northeast-1
Default output format [None]: json

※Route53FullAccess権限があるものを設定する


3.Route 53 アクセスチェック
# aws route53 list-hosted-zones
※登録しているドメイン一覧がjsonで表示されればOK


4.boto設定 必要ありませんでした
# vi ~/.boto

[Credentials]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

※2.と同一


そして無料SSLサーバ証明書「Let's Encrypt」の取得手順ですが、
公式ツールの「Certbot」ではDNS認証に対応していないため下記ツールを使用します。
参考サイト:https://http2.try-and-test.net/dehydrated.html


5.dehydrated インストール(要git)
# cd /usr/local
# git clone https://github.com/lukas2511/dehydrated
# cd dehydrated

 ・初回起動する前に --accept-terms を実行する
# ./dehydrated --register --accept-terms

 ・サンプルのコンフィグを置く
# cp -p docs/examples/config .

 ・コンフィグを編集する。(期限切れ通知を受信するアドレスを設定)
# vi config
CONTACT_EMAIL="system@***.com"


6.hook処理で使う route53.py を取得して実行権を付ける
# git clone https://gist.github.com/rmarchei/98489c05f0898abe612eec916508f2bf hook
# chmod 700 hook/route53.py


7.復数ドメイン証明書取得
[www.foobar.net]と[foobar.net]を1枚の証明書で取得する
# ./dehydrated -c -d www.foobar.net -d foobar.net -t dns-01 --hook /usr/local/dehydrated/hook/route53.py


8.証明書確認
# openssl x509 -noout -text -in certs/www.foobar.net/cert.pem | less

※Apacheのconfで設定する場合のファイルパスは下記
SSLCertificateFile /usr/local/dehydrated/certs/www.foobar.net/cert.pem
SSLCertificateChainFile /usr/local/dehydrated/certs/www.foobar.net/chain.pem
SSLCertificateKeyFile /usr/local/dehydrated/certs/www.foobar.net/privkey.pem


9.自動更新スクリプトを作成して実行権を付ける
# vi /usr/local/dehydrated/cert_refresh.sh

#! /bin/sh
cd /usr/local/dehydrated
./dehydrated -c -d www.foobar.net -d foobar.net -t dns-01 --hook /usr/local/dehydrated/hook/route53.py | grep Skipping > ./skip.txt
if [ -s ./skip.txt ] ; then
:
else
systemctl restart httpd
fi

# chmod 700 /usr/local/dehydrated/cert_refresh.sh
※更新時のみApacheリスタートする


10.cronによる自動更新設定
# crontab -e

50 3 * * 3 /usr/local/dehydrated/cert_refresh.sh > /dev/null
※毎週水曜深夜03:50に実行
※期限が30日未満になったら更新されます


注意点.取得制限について
Let's Encrypt は、 5 renew / 7 days(7日間で5回取得) の制限があるので
復数の証明書を自動更新する際は気をつけて下さい。

以上でDNS認証を用いての自動更新が出来ます。
次回は、1年放っておいた AWS Lambda の続きを書こうと思います。