0

私は現在、私が書いたコードを使用して IBM Httpd サーバーのポートに SSL 証明書をインストールしています。このコードは、次のように証明書をインストールします。

  1. 秘密鍵オブジェクトとエンド エンティティ証明書 (1 要素の X509Certificate 配列として渡される) を含む、パスワードで保護された .p12 ファイルを作成します。

    public static KeyStore createKeyStoreFromKeyAndCertChain(String encoding,
        String friendlyName, X509Certificate[] certChain, 
        PrivateKey key, String password)
        throws KeyStoreException, CertificateException,
        NoSuchAlgorithmException, IOException {
    KeyStore store = KeyStore.getInstance(encoding);
    store.load(null, null);
    store.setKeyEntry(friendlyName, key, password.toCharArray(), certChain);
    return store; 
    

これにより、openssl と keytool を使用して解析可能な .p12 ファイルが正しく生成されます。

  1. 次のコマンドを使用して .kdb ファイルを作成し、発行者証明書を .kdb ファイルに追加してから、手順 1 で作成した .p12 ファイル (秘密鍵とエンド エンティティ証明書を含む) を追加します。

"C:\Program Files (x86)\IBM\HTTPServer2\java\jre\bin\ikeycmd.exe" -keydb -create -db "C:\Work\Certs\IBM certs\test.kdb" -pw password -type cms -expire 60 -stash

"C:\Program Files (x86)\IBM\HTTPServer2\java\jre\bin\ikeycmd.exe" -cert -add -db "C:\Work\Certs\IBM certs\key1.kdb" -pw password -label icacert -file "C:\renewcert\ica.cer" -trust enable

"C:\Program Files (x86)\IBM\HTTPServer2\java\jre\bin\ikeycmd.exe" -cert -add -db "C:\Work\Certs\IBM certs\key1.kdb" -pw password -label rootcert -file "C:\renewcert\rootCert.cer" -trust enable

"C:\Program Files (x86)\IBM\HTTPServer2\java\jre\bin\ikeycmd.exe" -cert -import -db "C:\renewcert\certWithPvtKey.p12" -pw password -target "C:\Work \Certs\IBM certs\httpdkey.kdb" -target_pw password -target_type cms

これにより、.kdb ファイルが作成されます。

  1. httpd.conf ファイル内の仮想ホスト ディレクティブを更新して、新しく作成された .kdb ファイルに対応する情報を保存します。
    Listen 10.212.143.105:6042
    <VirtualHost 10.212.143.105:6042>
         SSLEnable
         SSLProtocolDisable SSLv2

         SSLServerCert ibmhttpdsslcert
         KeyFile "C:\Work\Certs\IBM certs\key1.kdb"
         SSLStashFile "C:\Work\Certs\IBM certs\key1.sth"

    </VirtualHost>

タグ SSLServerCert に使用されるラベルは、ステップ 1 で .p12 を作成するために使用されるフレンドリ名と同じです。

証明書は、アプリケーション (Java ベースの SSL 証明書検出を使用) および openssl からも検出できます。

問題

ここで、元の .p12 を .kdb ファイルからエクスポートする必要があります。同じために、次のコマンドが使用されます。

"C:\Program Files (x86)\IBM\HTTPServer2\java\jre\bin\ikeycmd.exe" -cert -export -db "C:\Work\Certs\IBM certs\key1.kdb" -pw password -label ibmhttpdsslcert -type cms -target "C:\Work\Certs\IBM certs\certChain.p12" -target_pw password -target_type pkcs12

基本的に発生するのは、生成される .p12 ファイルが破損しているように見え、次のコードを使用して解析できないことです。

public static void main(String[] args) throws Exception {
        
    
    String password = "password";
    
    // Read the .p12 and convert it to Java objects
    FileInputStream fm = new FileInputStream(new File("C:\\Work\\Certs\\IBM certs\\certChain.p12"));
    KeyStore ks = KeyStore.getInstance("PKCS12");
    try {
        ks.load(fm, password.toCharArray());
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    System.out.println("Size- " +ks.size());
    
    Enumeration aliases = ks.aliases();

    while(aliases.hasMoreElements()){
        String param = (String) aliases.nextElement();
        System.out.println("Param- " +param);
    }
    
    
    KeyStore.ProtectionParameter protParam =
            new KeyStore.PasswordProtection(password.toCharArray());

    // Retrieve the key using the alias "IBMHttpdSSLCert"
    KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry)
        ks.getEntry("IBMHttpdSSLcert", protParam);
    PrivateKey myPrivateKey = pkEntry.getPrivateKey();
    
    Object pemObject = myPrivateKey;
    
    // Write the key to file
    JcaPEMWriter pemWriter = new JcaPEMWriter(new FileWriter(new File("C:\\Work\\pvtKey.pem")));
    pemWriter.writeObject(pemObject);
    pemWriter.close();
    
    System.out.println("Pvt key- " +myPrivateKey);
    
    fm.close();
}

キーストアのサイズがゼロ (0) と報告され、keytool を使用してもキーストア ファイルを解析できません。ただし、同じことは openssl を使用して解析できますが、openssl をコード バイナリにバンドルすることはできません。

IBM の keystore export の実装に関する既知のバグであるかどうか、何か考えはありますか?

4

0 に答える 0