AWSへのLet’s Encrypt 更新
何が起こった!?
httpsでアクセスしていた自社サービステストサイト
証明証はLet’s Encryptで取得した
今日、いつもどおりにアクセスしてみると、証明証エラー
何がおこったし!?
環境
AWS環境で、EC2をアプリサーバにし、LBSを導入していた
自動更新はしていた
EC2上でCron使って、Let’s Encryptの自動更新はしていたんだよ
00 23 * * * /usr/bin/certbot-auto renew --quiet
証明証もちゃんと更新されていたんだよ
# ls -la /etc/letsencrypt/archive/hogehoge.com/
drwxr-xr-x 2 root root 4096 10月 3 17:26 .
drwx------ 3 root root 4096 10月 3 17:26 ..
-rw-r--r-- 1 root root 1809 7月 3 17:26 cert1.pem
-rw-r--r-- 1 root root 1809 9月 3 17:26 cert2.pem
-rw-r--r-- 1 root root 1647 7月 3 17:26 chain1.pem
-rw-r--r-- 1 root root 1647 9月 3 17:26 chain2.pem
-rw-r--r-- 1 root root 3456 7月 3 17:26 fullchain1.pem
-rw-r--r-- 1 root root 3456 9月 3 17:26 fullchain2.pem
-rw-r--r-- 1 root root 1704 7月 3 17:26 privkey1.pem
-rw-r--r-- 1 root root 1704 9月 3 17:26 privkey2.pem
ほら、ちゃんと xxxx2.xxx って形で新しい証明証できてる
ちゃんとApacheも再起動して確認
# service httpd restart
けどだめ
忘れてた
そういえば、最初にSSL化した時のことを思い出した
Webサーバからアクセスするのって、EC2じゃなくてELBじゃん
そうじゃん、EC2上で証明証更新されてても、ELBで更新されてないんじゃなんも意味ないじゃん
そういえばELBで証明証指定していたの忘れてたよ、、、
なんたる失態、、、
ELBへの証明証更新
どこかから拾ってきたシェルスクリプト使って、証明証をIAMにアップロードするよ
#!/bin/bash
set -eux
# ドメインを指定
_domain='hogehoge.com'
# LBSリスナーのARNを指定
_listener_arn='arn:aws:elasticloadbalancing:ap-northeast-1:############:listener/app/HOGE-LBS/XXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXX'
_cert_path="/${_domain}/"
_date=$(date +%Y%m%d-%H%M%S)
_cert_name="${_domain}-${_date}"
# 新しいSSL証明書をアップロード
cd /etc/letsencrypt/live/${_domain}/
aws iam upload-server-certificate \
--server-certificate-name ${_cert_name} \
--certificate-body file://cert.pem \
--private-key file://privkey.pem \
--certificate-chain file://chain.pem \
--path ${_cert_path}
# 新しいSSL証明書を ELB(Application) のターゲットグループにセット
sleep 60
_cert_arn=$(aws iam get-server-certificate --server-certificate-name ${_cert_name} | jq -r '.ServerCertificate.ServerCertificateMetadata.Arn')
aws elbv2 modify-listener \
--listener-arn ${_listener_arn} \
--certificates "CertificateArn=${_cert_arn}"
# 古いSSL証明書を削除
_certs=$(aws iam list-server-certificates --path-prefix ${_cert_path} | jq -r '.ServerCertificateMetadataList[].ServerCertificateName')
for _cert in ${_certs}; do
if [ "${_cert_name}" != "${_cert}" ]; then
aws iam delete-server-certificate --server-certificate-name ${_cert}
fi
done
これでいいのか?
いったんこれで良いような気はするが、、、
次回90日後、どうなるか、、、
カレンダーにリマインダー入れておこう