MyDNS.jpのLet's Encrypt証明書を ECDSA対応にしつつ、DNS認証を通す

今のLet's Encryptの証明書は、TLS1.2対応の ECDHE-RSA(2048bit)-AES256-GCM-SHA384 証明書となっている
RSA 2048bitは重たいので、より強固でありながら bit数が短い ECDSA(256bit)の証明書を発行しようかと


暗号スイート強度については、下記に詳細が
-> 暗号スイートの暗号強度と、公開鍵のビット数の設定、及びRSAとECDHEでサーバ負荷の比較 - Apache 2.4系でHTTP/2対応サーバを構築してみるテスト。

というこで、AES128を使用する場合、ECDHE(256bit)-ECDSA(256bit)-AES128-*のパフォーマンスが、抜き出ています。
サーバ側処理が1.6[ms]で終わり、共通鍵のパフォーマンスは、87,510.36 KB/sです。
そりゃ、超巨大なサイトでは、ECDHE(256bit)-ECDSA(256bit)-AES128-GCM-SHA256あたりが、利用される訳です。

AES256を使用する場合、ECDHE(384bit)-ECDSA(256bit)-AES256-*が良いです。
サーバ側処理が3.1[ms]で終わり、共通鍵のパフォーマンスは、62,363.31 KB/sです。
これでも、サーバ側処理は、ECDHE(256bit)-RSA(2048bit)よりも軽いので、暗号強度を高めるなら、こちらが現実的です。

で、標準のままだとECDSA証明書を発行されないので
ECDSA用のCSRを作成して認証局に送付して、ECDSAな証明書を発行して貰う流れになる

certbotには、csrを指定するオプションもあるのでそれを使用

んで、手順は

1. ECC曲線秘密鍵の作成

NIST 推奨曲線名 P-256 (OpenSSL 上の曲線名 prime256v)を使用して、ECC秘密鍵の作成

# openssl ecparam -name prime256v1 -genkey -out private.key
2.ECC秘密鍵から、CSRの作成
# openssl req -new -sha256 -key private.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP  ## <- 必須
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:City ## <- 必須
Organization Name (eg, company) [Default Company Ltd]:Company  ## <- 必須
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []: ## <- 必須
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

CSR作成時にディスティングイッシュネームを要求されるけど、必要最低限叩き込んでおけばいい(個人サイトなら)
必須というか、Common Name以外は Default値がセットされて変な証明書ができてしまうので(苦笑

3. MyDNSのDNS認証を実行

一発目は --dry-run いれて検証すると良い

certbot certonly --manual --preferred-challenges=dns \
--manual-auth-hook /etc/letsencrypt/DirectEdit-master/txtregist.php \
--manual-cleanup-hook /etc/letsencrypt/DirectEdit-master/txtdelete.php \
-d <ドメイン名> --csr /etc/nginx/ssl/server.csr \
--cert-path /etc/nginx/ssl/server.pem --fullchain-path /etc/nginx/ssl/fullchain.pem \
--server https://acme-v02.api.letsencrypt.org/directory \
--agree-tos -m <メールアドレス> --manual-public-ip-logging-ok --dry-run

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org
Performing the following challenges:
dns-01 challenge for <ドメイン名>
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
- The dry run was successful.

成功すると、最後に successful 表示が出る
dry-runが成功したら、実際に証明書を発行

4.作成された証明書の確認

別にやらなくてもいいけど、どんな事が記載されているのかみたければ

# openssl x509 -text -fingerprint -noout -in /etc/nginx/ssl/fullchain.pem

で中身を確認できる

後は、NginxのSSL証明書の位置をconf で書き換えたり、定期的に実行しているなら定期実行バッチファイル書き換えたりすればOK

https://i.imgur.com/qHuPku4.png
無事 ECDHE-ECDSA-AES256-GCM-SHA384 になりましたっと