Сервер IBM Httpd - Экспорт p12 из kdb дает поврежденный файл p12

В настоящее время я устанавливаю сертификат SSL на порт сервера IBM Httpd, используя написанный мной код. Код устанавливает сертификат следующим образом:

  1. Создает защищенный паролем файл.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.

  1. Используйте следующие команды для создания файла.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.

  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, совпадает с понятным именем, используемым для создания.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 для экспорта хранилища ключей?

0 ответов

Другие вопросы по тегам