アプリ開発ときどきアウトドア

主にJavaを使ったアプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。

1. システムエンジニアリング SSL/TLS/PKI windows 基盤技術 開発標準化

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

投稿日:


開発環境にて、Visual Studioのインストール時に追加されるlocalhostサーバ証明書を、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等のサービス・デーモンで参照する際に手間がかかるので、パスワード保護・暗号化を解除しています。)
  • 生成された証明書と鍵のファイルは次のようになります。
    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-----
    


(adsbygoogle = window.adsbygoogle || []).push({});


(adsbygoogle = window.adsbygoogle || []).push({});

-1. システムエンジニアリング, SSL/TLS/PKI, windows, 基盤技術, 開発標準化

執筆者:

関連記事

WebサイトのSSL化

次のようなGoogleウェブマスター向け公式ブログでの推奨や、リモートか管理の安全性向上の向上のためにSSL(TLS)を有効にする。 概要 Googleさんの考え 保護されたウェブの普及を目指して(2 …

IIS Expressでカスタムドメインと自己署名証明書

シングルサインオンの検証等を想定し、開発環境の複数のWebアプリに独自ドメイン名+SSLを使用したい。 Visual Studio 2019で作成したWeb系プロジェクトを前提とし、IIS Expre …

ASP.NET Core: エラーメッセージ一覧のカスタマイズ

ASP.NET Core標準のasp-validation-summary属性では単純なエラーメッセージの一覧しか出力しかできません。 ここでは、asp-validation-summary属性と同様 …

postgresqlでの拡張のインストール

PostgreSQL10で暗号化関数を使用するため拡張(pgcrypto)をインストールした際の出来事を記載します。 事象 pgcryptoの拡張をインストールしたり、インストールの確認を行うと、その …

EAP7のインストールとパッチ適用

仕事でredhat社のEnterprise Application Server7(EAP7)を扱うことが多いので備忘録として記載します。 なお、このサイトでWebアプリを公開したいと考えていますが、 …