テスト用に自己証明書を用いてローカルhttpsサーバーを立てるなどの際に、クライアントから危険な接続として扱われないように証明書を設定をする方法について説明する。
通常ホストの真正性を確認するためにはドメイン名を使用するが、環境の都合上ローカルにDNSを立てるのが難しい場合がある。クライアントへの介入が難しい場合は/etc/host
による書き換えも出来ない。
そこで、x509.v3のsubjectAltName拡張を用いてIPをホスト名の代わりに使用し、任意のIPアドレスに立てたサーバーを真正なものとして扱えるようにする。
- openssl設定ファイルの指定(任意)
$ export OPENSSL_CONF=/System/Library/OpenSSL/openssl.cnf
デフォルトの場所にopenssl.cnf
が存在しない場合は環境変数で指定するのが安定。
- サーバー用の秘密鍵を作成する
$ openssl genrsa -out localhost.key 2048
- CAに向けた証明書署名要求を作成する。
$ openssl req -new -key localhost.key -out localhost.csr
DN/パスコードは適当に設定しておく。
- 自己署名サーバー証明書を作成
$ openssl x509 -days 3650 -in localhost.csr -out oreore.crt -req -signkey localhost.key
- 自己署名サーバー証明書をp12、pemに変換
$ openssl pkcs12 -export -inkey localhost.key -in oreore.crt -out oreore.p12
$ openssl pkcs12 -in oreore.p12 -out oreore.pem
- CA証明書の秘密鍵を作成する
$ openssl pkcs12 -in oreore.p12 -nodes -out oreore-ca.key -nocerts
- CA証明書、CA秘密鍵、証明書署名要求を用いてサーバー証明書を作成する
$ openssl x509 -req -in localhost.csr -CA oreore.pem -CAkey oreore-ca.key -CAcreateserial -out oreore.crt -days 3650 -sha256 -extensions SAN -extfile <(printf "
[SAN]
subjectAltName=@alt_names
basicConstraints=CA:FALSE
[alt_names]
DNS.1=localhost
IP.1=192.168.1.2
IP.2=127.0.0.1")
ここで、'192.168.1.2' の部分は設置するサーバーのIPアドレスである。 localhostと127.0.0.1もサーバーローカルからの確認用に追加しておく。
- 証明書の内容を確認する
$ openssl x509 -in oreore.crt -text -noout
ここで以下のセクションが出ていることを確認。
...
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:localhost, IP Address:192.168.1.108, IP Address:127.0.0.1
...
httpsサーバー側ではここで作成したlocalhost.key
とoreore.crt
を組み込む。
後は、このoreore.crt
をクライアント端末に信用させればよい。