Let’s Encryptとは無料で証明書を発行してくれるものです。普通に証明書を取ろうとするとお金がかかるので、金無し学生には非常に嬉しいサービスです。

証明書を発行するのに便利なツールとしてCertbotというものがあり、機能が豊富であるため、コマンド入力をよく忘れてしまうことがあるので、ここに自分用のメモとして記して置きたいと思います。

環境はCentOS 8、Nginxを使っていると想定します。

設定

nginxのconfファイルに応じた証明書を発行する

nginxのconfファイルを作成し、通常のHTTP通信の設定を構築後、以下のコマンドを入力。

certbot-auto --nginx 

あとはconfファイルに入力したドメインを選び、強制リダイレクトをかけるかの設定をすれば勝手にHTTPS通信になる。

証明書の発行だけ

上記の設定ではnginxのconfファイルを勝手に書き換えてくれるが、証明書の発行だけをしたい場合は以下のコマンドを入力する。

certbot-auto certonly --nginx 

certonlyをつけることによって /etc/letsencrypt/live/ に新しい証明書ができているので、自分でconfファイルをいじる。

更新

certbot-auto renew 

証明書を失効させる

certbot-auto revoke --cert-path /etc/letsencrypt/archive/DOMAIN_NAME/cert.pem

自動で証明書の更新を行う

Let’s Encryptは証明書の有効期限が他と比べて短い。上記のコマンドを入力して再発行してもよいが、自動化したほうが楽だし、ヒューマンエラーも防げる。

スケジューラーにはcrontabをつかう。

echo "0 0,12 * * * root python3 -c 'import random;  import time; time.sleep(random.random() * 3600)' &&  certbot-auto renew" | sudo tee -a /etc/crontab >  /dev/null 

crontabに一定間隔で更新させる処理を追加することで、更新忘れを防ぐことができる。

ワイルドカード証明書について

私のサイトではワイルドカード証明書を取得しているのですが、上記の方法では更新できませんでした。

certbot certonly --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory -m [email protected] -d hoge.com -d *.hoge.com

という感じで証明書を発行し、DNSサーバにTXTを設定してやっています。

更新も同じコマンドを入力して再発行しています。

楕円曲線暗号を利用するには

最近はECDSAにハマっています。

一昨日に証明書の更新を行いましたが、引数を一つ追加するだけでRSA2048ビットからECDSA256ビットに変えることができます。

もちろん、ワイルドカード証明書を利用しています。

certbot certonly --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory -m [email protected] --key-type ecdsa -d hoge.com -d *.hoge.com

このように–-key-type ecdsaという引数を指定することによって、ECDSA鍵を利用することができます。

楕円曲線暗号はRSAと比較して、鍵長が短いのでサーバの負荷を軽減することが可能となります。

384bit ECDSAを使う方法

多くのサーバではRSA2048が利用されていますが、SSL Labsのテストを行うとKey Exchange項目が90点になります。100点を目指すオタクはRSA4096に変更します。

P-256ではRSA3072と同程度ですので、RSA4096以上にしたいならば、P-384を利用するべきです。

ここで、「nBitセキュリティ」というものは、共通鍵暗号の鍵長ごとのセキュリティ強度ということです。NIST的にはAESは最低112ビットあればOKらしいので、一般的には128bitのAESが利用されています。なので多くのRSAの鍵長が2048ビットになっています。これは2030年までは新規発行OKであり、それ以降は更に鍵長を長くしなければなりません。

ちなみに、量子コンピュータでの暗号解読を考慮する場合、NIST的にはAESは安全と謳っており 1 、国際コンピュータサイエンス学会の論文ではAESは256bitあれば大丈夫だそうです。 2

+----------------------+-----------------+--------------------+
| セキュリティビット数 |  RSA鍵長 ビット  |   ECC 鍵長 ビット | 
+----------------------+---------- ------+--------------------+
| 80                   | 1024            | 160                |
| 112                  | 2048            | 224                |
| 128                  | 3072            | 256                |
| 192                  | 7680            | 384                |
| 256                  | 15360           | 512                |
+----------------------+-----------------+--------------------+

certbotではコマンド一つ加えるだけで楕円曲線のビット長を変更することができます。

もちろん、ワイルドカード証明書のとり方です。

certbot certonly --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory -m [email protected] --key-type ecdsa --elliptic-curve secp384r1 -d hoge.com -d *.hoge.com

–-elliptic-curve secp384r1 を指定することによってP-384を利用することが可能です。P-521くらいまでは設定できるらしいですが、対応しているブラウザがあるのかどうかもわかりませんので、P-384程度に留めておいたほうが良いかもしれません…

P-384で鍵交換において100点を取ることができました。x25519を無効化してNIST曲線のみに設定すれば達成できます。

SSLtest100A+

※ここではNIST曲線のバックドアとかの陰謀論よりの話はしません。

ただ、SSLlabsのテストで100点を取るよりも、処理速度や使い勝手を優先したほうが良いので、x25519は有効化するべきでしょう。効率的だし。