私は現在、私が書いたコードを使用して IBM Httpd サーバーのポートに SSL 証明書をインストールしています。このコードは、次のように証明書をインストールします。
秘密鍵オブジェクトとエンド エンティティ証明書 (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 ファイルが正しく生成されます。
- 次のコマンドを使用して .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 ファイルが作成されます。
- 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 の実装に関する既知のバグであるかどうか、何か考えはありますか?