Skip to content

Instantly share code, notes, and snippets.

@ykst
Last active August 19, 2024 12:14
Show Gist options
  • Save ykst/2a666d3d41785f9a41d403889f45d82e to your computer and use it in GitHub Desktop.
Save ykst/2a666d3d41785f9a41d403889f45d82e to your computer and use it in GitHub Desktop.
LANのIPアドレスに対してSANを適用して真正なSSL証明書を作成する手順

LANのIPアドレスに対してSANを適用して真正なSSL証明書を作成する手順

概要

テスト用に自己証明書を用いてローカル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.keyoreore.crtを組み込む。 後は、このoreore.crtをクライアント端末に信用させればよい。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment