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日後、どうなるか、、、
カレンダーにリマインダー入れておこう