OBONO’s Diary

へっぽこプログラマの戯言

オレオレ証明書

個人用にウェブサーバーを立てている。とりあえず HTTPS 対応しようということで、オレオレ自己署名サーバー証明書を生成してみたのだが、

$ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout server.key -out server.crt -subj /CN=sample.com -sha256

諸々を適切に設定しても、ブラウザでアクセスする際に「この接続ではプライバシーが保護されません」と言われてしまう。なんでじゃろう。


結論から言うと、Chrome だけの問題のようだ。去年リリースされたバージョン 58 から、ホスト名の検証に証明書の Common Name を一切使わなくなり、代わりに Subject Alternative Name とやらを使うようになったらしい。何ですかそれは?

というわけで、Google 先生にいろいろ手順を教えてもらう。

まずは、以下の内容で、req.conf というファイルを作成。

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
CN = sample.com
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = sample.com

んでもって、openssl コマンドでコンフィグとして req.conf を指定することで、秘密鍵 server.key と、Subject Alternative Name 付きのサーバー証明書 server.crt が得られる。

$ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout server.key -out server.crt -config req.cnf -sha256

あとは、これらのファイルをウェブサーバーの適当なところに配置して適切に設定し、クライアント側の OS で server.crt を「信頼されたルート証明機関」のストアに登録すれば OK。これで、Chrome で警告が出なくなって、めでたしめでたし。