開発環境にて、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)を生成します。> cd C:\ > mkdir certwork > cd certwork > Get-ChildItem -Path cert:\currentUser\Root | Where-Object { $_.Subject -eq "CN=localhost" } PSParentPath: Microsoft.PowerShell.Security\Certificate::currentUser\Root Thumbprint Subject ---------- ------- 6CC237xxxxxxxxxxxxxxxxxxxxxxxxxxxxx72D77 CN=localhost > $cert = Get-ChildItem -Path cert:\currentUser\Root | Where-Object { $_.Subject -eq "CN=localhost" } > $pwd = ConvertTo-SecureString -String "password" -Force -AsPlainText > Export-PfxCertificate -Cert $cert -FilePath localhost.pfx -Password $pwd ディレクトリ: C:\certwork Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2020/01/22 15:20 2669 localhost.pfx > $Env:Path += ";C:\Program Files\OpenSSL-Win64\bin" > openssl pkcs12 -in localhost.pfx -clcerts -nokeys -out localhost.crt Enter Import Password: ******** > openssl pkcs12 -in localhost.pfx -nocerts -nodes -out localhost.key Enter Import Password: ******** > dir ディレクトリ: C:\certwork Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2020/01/22 15:23 1244 localhost.crt -a---- 2020/01/22 15:24 1999 localhost.key -a---- 2020/01/22 15:20 2669 localhost.pfx
- 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等のサービス・デーモンで参照する際に手間がかかるので、パスワード保護・暗号化を解除しています。)
- 12-14行目: localhost証明書をpfxファイルにエクスポートします。
- 生成された証明書と鍵のファイルは次のようになります。
Bag Attributes localKeyID: xx xx xx xx friendlyName: IIS Express Development Certificate subject=CN = localhost issuer=CN = localhost -----BEGIN CERTIFICATE----- MIIC7DCCAdSgAxIBAgIQQ+6X4ceH56VDoHRynd9CcjANBgklhkiG9w0BAQsFADAU ... CMP5Ilzzh1p3teyl2xkW46C4+P5zw7Jm8CMjWIIcwUU= -----END CERTIFICATE-----
Bag Attributes Microsoft Local Key set: <No Values> localKeyID: xx xx xx xx friendlyName: IIS Express Development Certificate Container Microsoft CSP Name: Microsoft RSA SChannel Cryptographic Provider Key Attributes X509v3 Key Usage: xx -----BEGIN PRIVATE KEY----- MIIEvgIBADANBakqhkiG9w0BAQEFAASCBKgwgaSkAgEAAoIBAQC/ckDQomsAiL0m ... z/Cwzzw9yorsiict15bfkCyO -----END PRIVATE KEY-----