Сервер IBM Httpd - Экспорт p12 из kdb дает поврежденный файл p12
В настоящее время я устанавливаю сертификат SSL на порт сервера IBM Httpd, используя написанный мной код. Код устанавливает сертификат следующим образом:
Создает защищенный паролем файл.p12, содержащий объект закрытого ключа и сертификат конечного объекта (передается как массив X509Certificate из 1 элемента).
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;
Это правильно генерирует файл.p12, который можно проанализировать с помощью openssl и keytool.
- Используйте следующие команды для создания файла.kdb, добавьте сертификаты эмитента в файл.kdb, а затем добавьте файл.p12 (содержащий закрытый ключ и сертификат конечного объекта), созданный на шаге 1.
"C: \ Program Files (x86) \ IBM \ HTTPServer2 \ java \ jre \ bin \ ikeycmd.exe" -keydb -create -db "C: \ Work \ Certs \ IBM certs \ test.kdb" -pw пароль -тип 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 пароль -label icacert -file "C:\renewcert\ica.cer" -trust включить
"C:\Program Files (x86)\IBM\HTTPServer2\java\jre\bin\ikeycmd.exe" -cert -add -db "C:\Work\Certs\IBM certs\key1.kdb" -pw пароль -label rootcert -file "C:\renewcert\rootCert.cer" -trust включить
"C:\Program Files (x86)\IBM\HTTPServer2\java\jre\bin\ikeycmd.exe" -cert -import -db "C:\renewcert\certWithPvtKey.p12" -pw пароль -target "C:\Work\Certs\IBM certs\httpdkey.kdb" -target_pw пароль -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, совпадает с понятным именем, используемым для создания.p12 на шаге 1.
Сертификат можно обнаружить через наше приложение (которое использует обнаружение SSL-сертификата на основе Java), а также через 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 пароль -label ibmhttpdsslcert -type cms -target "C:\Work\Certs\IBM certs\certChain.p12" -target_pw пароль -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 для экспорта хранилища ключей?