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

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

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

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

投稿日:2020年10月25日 更新日:


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

執筆者:

関連記事

.NET Core: Azure AD B2Cユーザアカウント操作のサンプル

概要 管理者がAzure AD B2Cのユーザアカウントの管理が行えるASP.NET Coreのアプリの開発を想定している。Azure AD B2Cユーザアカウントの作成や更新等の操作はMicroso …

slf4jで独自ログ項目を追加(MDC)

業務要件、障害発生時の処理追跡や証跡等、ログ出力に特定項目を含めたい場合があります。 共通のログ出力ユーティリティやライブラリを作って、その中でログ出力内容を変更しても良いのですが、MDC(Mappe …

Windows10のインストール場所を選べない

DELLのノートPCであるVostro 5370を購入しました。 既定ではWindows 10 Homeがインストールされていましたが、会社用のボリュームライセンスのWindows10 Enterpr …

ftp, ftps, sftpの違い

開発対象システムの連携先システムとして、ftpsやらftpsサーバが指定される場合がある。 私の場合、開発標準の役割を担う場合が多く、これらの仕様を把握し、動作確認や単体テスト用のダミーのサーバを用意 …

Javaによるzipファイルの安全な解凍方法

以前、業務アプリ(Java)でzipファイルの操作が必要となったため、Javaにおけるzip圧縮解凍について調査しました。また、zip4jを使った圧縮・解凍についても説明しました。 ここでは、もう少し …