localhost(pfx)をPEM形式の証明書と鍵に変換

開発環境にて、Visual Studioのインストール時に追加されるlocalhostサーバ証明書(IIS Express Development Certificate)を、Apache httpdサーバで利用できるようにPEM形式に変換する方法を説明します。

  • 前提
    • Windows 10環境で検証しています。
    • Visual Studio 2019のインストールで、ユーザの「信頼されたルール証明機関」にインストールされた証明書localhostを変換対象とします。
    • opensslを使用します。
      • Windows標準のコマンドでは鍵はpfxにしかエクスポートできず、pfxをPEM形式に変換できるコマンドがありません。そのため、ここではopensslを使用します。
      • opensslのwikiにあるダウンロードページから任意のバイナリをダウンロードしてインストールします。ここでは、slproweb.comのバイナリWin64 OpenSSL v1.1.1h Lightを使用します。
        (既定のC:\Program Files\OpenSSL-Win64にインストールした前提で説明します。)
  • 変換手順
    PowerShellを開き、Export-PfxCertificateコマンドを使って、ユーザの「信頼されたルール証明機関」にあるlocalhost証明書をpfxファイル(localhost.pfx)にエクスポートします。
    opensslコマンドを使って、pfxファイルから証明書ファイル(localhost.crt)と鍵ファイル(localhost.key)を生成します。
    • 12-14行目: localhost証明書をpfxファイルにエクスポートします。
      ユーザの「信頼されたルール証明機関」にある証明書は”cert:\currentUser\Root”というパスで検索できます。この中からlocalhostの証明書のみを取得するために「Subjectが”CN=localhost”」という条件を付与しています。(localhostの証明書はSubjectが”CN=localhost”になっている。)
      Export-PfxCertificateで鍵をエクスポートする際に暗号化されたパスワード文字列が必要になるので、そのパスワード文字列$pwdを事前に作成しています。この方法はパスワードがコマンド履歴に残ってしまうので開発環境限定の方法になります。
    • 23行目: pfxファイルから証明書を出力します。
      pfxはPKCS#12形式なのでopensslのpkcs12コマンドを使用します。
      証明書を出力対象とするために-clcerts、鍵を出力対象外にするために-nokeysオプションを指定しています。
    • 25行目: pfxファイルから鍵を出力します。
      pfxはPKCS#12形式なのでopensslのpkcs12コマンドを使用します。
      証明書を出力対象外とするために-nocerts、パスワード保護・暗号化を解除したPEMにするために-nodesオプションを指定しています。
      (鍵ファイルがパスワード保護・暗号化されていると、httpd等のサービス・デーモンで参照する際に手間がかかるので、パスワード保護・暗号化を解除しています。)
  • 生成された証明書と鍵のファイルは次のようになります。