pfxファイルから証明書情報を取り出して、localhostで証明書を確認する

opensslインストール

OpenSSHのようにWindowsに標準で入ってるものではないので、opensslコマンドを使うにはインストールする。

Win64のLight版のMSIをダウンロードしてフォルダの中にあるexeファイルを実行すればいい。

環境設定でパスも通しておく。

参考

https://atmarkit.itmedia.co.jp/ait/articles/1601/29/news043.html

pfxをインポート

pfxファイルがなければ、証明書のあるサーバーからエクスポートを行う。

pfxファイルがあり、他のサーバーにも同じ証明書を使うなら、pfxを他のサーバーに持って行って、インポートを行う。

binaryファイルのチェックを入れるのを忘れなければ、他はそのまま進めていい。寄付はご自由に。

これが証明書情報の入ったファイルとなる。

証明書更新時は、このファイルがあると思われる。最初から、.pemや.key, .crtなどのファイルの場合は、それらのファイルを証明書を参照している場所に上書きすればいい。

参考

https://jnotary.com/wp-content/uploads/2020/11/kenchikushi_import.pdf

pfxをエクスポート

インポートした証明書は、ブラウザの設定から証明書管理をみれば、どのドメインの証明書かなどを確認できる。

Chromeの場合:

・3つあるメニュー > 設定 > プライバシーとセキュリティ > セキュリティ > 証明書の管理

Edgeの場合:

…メニュー > プライバシー、検索、サービス > 証明書の管理

証明書の管理画面を開くと、個人の証明書の部分に、ドメイン名で証明書がある。下にインポート、エクスポートボタンがあるので、エクスポートボタンを押す。

秘密鍵を出力すること、パスワードを設定することを忘れなければいい。

参考

https://jp.globalsign.com/support/ssl/config/cert-export-win.html

opensslコマンドにて証明書を取り出す

エクスポートしたpfxファイルがある。このファイルから、証明書、秘密鍵、中間証明書を取り出す。

形式は、サーバーで設定されているファイル名などを参照して、そのまま入れ替えてもいいし、パスを設定すれば別のファイル名や形式でもいい。

ここではすべて、.pem形式で出力コマンドを書くが、Apacheならhttpd.confやhttpd-ssl.confなどを見て確認して出力すること。

証明書ファイルは .crt  鍵ファイルは .key としていることが多い。

以下 openssl コマンドで証明書を取り出すコマンドで、パスワードを聞かれるが、エクスポート時のパスワードを入力する。

pfxファイルのある場所で実行、もしくはファイル指定時にパスを書く。

証明書を取り出す

openssl pkcs12 -in ファイル名.pfx -clcerts -nokeys -out cert.pem

中間証明書を取り出す

必要ない場合もある。-chainを書かなければ、証明書と同じになるが、それでいい場合もある。

openssl pkcs12 -in ファイル名.pfx -cacerts -nokeys -chain -out chain.pem

秘密鍵を取り出す

openssl pkcs12 -in ファイル名.pfx -nocerts -nodes -out server.pem

ここで注意すべきは -nodes

OpenSSLコマンドによって生成される秘密鍵の暗号化を行わないように指定するものです。このオプションを使用すると、秘密鍵がパスフレーズで暗号化されず、平文でファイルに書き出されます。

ChatGPT

つまり、-nodesを入れることによって、パスフレーズの必要がなくなる。

これはApacheのhttpd-ssl.confの設定で、SSLPassPhraseDialog と書いてある部分を飛ばせる。

SSLPassPhraseDialog builtinの場合、Apacheなどサーバー起動時にパスフレーズを求められる。

SSLPassPhraseDialog exec:”pass-phrase” としてる場合、pass-phraseファイルを読み込み、実行されて、パスフレーズが出力される。

以上のパスフレーズを必要としない場合、-nodesは必要である。

出力されたファイルをhttpd.confなどapacheへ設定

証明書更新の場合は、同じファイル名で出力して、証明書のあるフォルダに上書きすればいい。

しかし、それを本番に適応する前に確かめたいときがある。

ローカル環境で、ドメインを127.0.0.1に設定して、httpsでドメインにアクセスしたときに証明書が有効期限内にあるか確かめる。

以下、Apache(xampp)での設定

1.hostsファイルに以下を追記

127.0.0.1    ドメイン名

2.httpd-ssl.confに以下を追記

<VirtualHost *:443>
    DocumentRoot "C:/xampp/ssl_test/htdocs" 
  # これがなければ、本来のhtdocsになる

    ServerName ドメイン名 
    # アクセスするときのドメイン名、証明書を設定したドメイン
    SSLEngine on
    SSLCertificateFile "C:/xampp/apache/conf/keys/cert.pem"
    SSLCertificateKeyFile "C:/xampp/apache/conf/keys/server.pem"
    SSLCertificateChainFile "C:/xampp/apache/conf/keys/chain.pem"
    # 証明書の場所を参照
</VirtualHost>

以下必要があれば、上記のものの上に追記

confファイルの上に書かれているので必要ないはず

Listen 443
SSLProtocol all -SSLv3
SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
SSLHonorCipherOrder on

apacheを再起動してssl化されているか確認

Apacheを再起動してうまく、立ち上がればhttpsでドメインにアクセスして、証明書を確認できる。

エラー対処

1.SSLモジュールが有効になっているか

httpd-ssl.confでssl_modがコメントアウトされていると思うので、有効にすること。

php.iniのextension=php_openssl.dll が有効になっているか確認。

このときextension=openssl が有効になっていれば問題ないので、そのままにしておく。そうしないと、

warning: module "openssl" is already loaded in unknown on line 0

というエラーが出てしまう。どちらの拡張機能がいいかわからない。

参考

https://norm-nois.com/blog/archives/3105

2.SSLPassPhraseDialog builtin is not supported on Win32

このエラーの場合、htppd-ssl.confのパスフレーズの部分をコメントアウトしたり、一度作った秘密鍵から、パスフレーズなしの秘密鍵を取り出したりしたが駄目だった。

上記にも書いたが、秘密鍵を作る時点で、-nodesオプションをつけてパスフレーズなしの状態で作成したほうがいい。