Let'sEncryptでPre-loaded Public Key Pinningに対応しやすい証明書を発行する


最初に

本記事ではLet'sEncrypt, PublicKeyPinningに関する解説は省略します。

通常の証明書発行

通常、(certbotを使った場合)以下のように発行と更新を行うかと思います。

# 初回
certbot certonly --server https://acme-v02.api.letsencrypt.org/directory -d "*.foo.com" --manual-public-ip-logging-ok --agree-tos

# 更新
certbot renew

発生する問題

Pre-loaded Public Key Pinningを行いたい場合、クライアント側に公開鍵をもたせる必要があります。
certbot renewの場合、このクライアント側に持たせたい公開鍵を毎回作成し直してしまいます。
アプリなどの場合、こうなると証明書が更新されるたびにアプリの更新も必要かつ同時にやらなければPinningに失敗します。

公開鍵を固定にして証明書を発行

certbot certonly --server https://acme-v02.api.letsencrypt.org/directory -d "*.foo.com" --manual-public-ip-logging-ok --agree-tos --csr /etc/letsencrypt/csr/0000_csr-certbot.pem

--csrオプションを付けることで公開鍵情報を固定することが出来ます。
csrの発行手順については省略しますが、csrをつけずに実行すると/etc/letsencrypt/csr/に生成してくれるので活用すると便利です。

# ls /etc/letsencrypt/csr/
0000_csr-certbot.pem

秘密鍵は/etc/letsencrypt/keys/にあります。

# ls /etc/letsencrypt/keys/
0000_key-certbot.pem

csrオプションを付けると証明書はカレントディレクトリに以下のように作成されます。

# ls
0000_cert.pem  0000_chain.pem  0001_chain.pem

更新について

csrオプションを付けるとcertbot renewの対象外になります。
なので同じコマンドをcrontabなどを使って自前で更新処理を実行するようにしましょう。

余談

certbot certonly --server https://acme-v02.api.letsencrypt.org/directory -d "*.foo.com" --manual-public-ip-logging-ok --agree-tos --preferred-chain "ISRG Root X1" --csr /etc/letsencrypt/csr/0000_csr-certbot.pem

preferred-chainに"ISRG Root X1"を指定すると今後スタンダードとなるROOT証明書で署名されたものを発行できます。