個人用にウェブサーバーを立てている。とりあえず 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 で警告が出なくなって、めでたしめでたし。