localhostのオレオレ証明書を作る
最近の Debian 系 Linux (Ubuntu など)では、ssl-cert パッケージにより、ssl-cert-snakeoil という証明書を作るのが一般的になってきている。
ただし、これは証明書に問題があり、証明書をインポートしても完全に信頼されない。
正しく判定されるようにするための条件
ルートCAの証明書を「信頼されたルート証明機関」にインポートする。(Windows)
ルートCAにより署名する。(自己署名なら問題なし)
CN=localhost (これは今は評価されない模様)
EKU(Extended Key Usage, 拡張キー使用法)にサーバー認証 (serverAuth, 1.3.6.1.5.5.7.3.1)を指定する。
SAN(Subject Alternative Name, サブジェクト代替名)で、DNS名と(必要ならば)IPアドレスを指定する。
以前は質問に答えるだけで CN が設定されるので問題なかったが、今は、subjectAltName を正しく設定しなければならないため、必ず設定ファイルで指定するしかなくなってしまった。
bash ならば設定ファイルをコマンドプロンプト上で作った一時ファイルから流し込むことができる。
code:localhost.openssl.cnf
utf8 = yes
string_mask = utf8only
default_md = sha256
prompt = no
distinguished_name = dn_sect
req_extensions = ext_sect
x509_extensions = ext_sect
commonName = localhost
basicConstraints = CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectKeyIdentifier = hash
subjectAltName = @alt_names
DNS.1 = localhost
IP.1 = 127.0.0.1
IP.2 = ::1
clientAuth は要らないかも。
鍵と証明書の作成
$ openssl req -config localhost.openssl.cnf -x509 -newkey rsa:4096 -nodes -keyout privkey.pem -out cert.pem
デフォルトで30日有効だが、-days 365 とかにすれば1年使える。(あまり望ましくない。)
鍵と CSR の作成(CA で別途署名するならこちら)
$ openssl req -config localhost.openssl.cnf -new -newkey rsa:4096 -nodes -keyout privkey.pem -out csr.pem
-new で CSRの作成
-x509 で証明書の作成
-new と -x509 は排他になる。
-newkey で鍵の作成
rsa:4096 で RSA 4096bit を指定
-nodes で鍵のパスフレーズを付けない。(DES暗号化をしない。no des)
-keyout 鍵ファイル で鍵の出力先指定
-out ファイルの出力先指定