BouncyCastle - создание файла сертификата, понятного MS Windows.

Я использую Java и BouncyCastle для создания сертификата CA, CA выдает несколько пользовательских сертификатов, эти сертификаты хранятся в базе данных с их закрытым ключом. Как я могу создать файл сертификата, который может быть установлен Windows, в котором операционная система распознает закрытый ключ и сведения о сертификате? Если я сохраню данные сертификата из класса X509Certificate в файл PEM, данные сертификата будут распознаны, но без закрытого ключа.

Любая помощь ?

Спасибо.


person maluk    schedule 03.02.2015    source источник
comment
Для клиентов Windows следует использовать семейство COM-интерфейсов CertEnroll: msdn.microsoft.com/en-us/library/windows/desktop/. Имейте в виду, что закрытый ключ должен генерироваться только на целевом клиенте. Это очень плохая практика, когда ключи генерируются на сервере CA и только потом достигают целевых клиентов.   -  person Crypt32    schedule 03.02.2015
comment
Спасибо, но как я могу сгенерировать содержимое файла сертификата? Есть ли способ собрать все вместе в один файл?   -  person maluk    schedule 04.02.2015
comment
Содержимое сертификата создается выдающим сервером CA. Вы генерируете запрос, отправляете на сервер CA, получаете и устанавливаете выданный сертификат.   -  person Crypt32    schedule 04.02.2015


Ответы (1)


Обычно вы генерируете закрытый ключ и запрос на подпись сертификата, вы отправляете csr в ЦС, а ЦС выдает сертификат. Наконец, вы можете сгенерировать keystore и сохранить на нем закрытый ключ и сертификат. Поэтому я не понимаю, как ваш ЦС хранит закрытый ключ в базе данных, поскольку закрытый ключ не отправляется в ЦС.

Опуская эту информацию (возможно, у вас есть самоподписанный CA для целей инфраструктуры, база данных, хранить privateKeys небезопасно и т. Д.), Дело в том; чтобы загрузить закрытый ключ и сертификат в Windows, вам понадобится keystore файл (обычно для Windows это pfx или pkcs12), а не только сертификат. Чтобы сделать это с помощью java и bouncycastle, как вы просите, вы можете использовать следующий пример кода (как вы сказали, я полагаю, что у вас есть сертификат и закрытый ключ):

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class Sample {

    public static void main(String[] args) throws Exception {

        // generate your certificate
        CertificateFactory cf = CertificateFactory.getInstance("X509", new BouncyCastleProvider());
        Certificate yourCert = cf.generateCertificate(new FileInputStream("C:/your_certificate_path"));
        // here you can add also the issuer of your cert
        Certificate[] certChain = { yourCert };
        // depending on your private key format you've a different
        // ways to parse its
        Key privatekey = null;//...
        String alias = "yourKSEntry";
        // generate the keystore
        KeyStore ks = KeyStore.getInstance("PKCS12", new BouncyCastleProvider());
        // necessary to init a new keystore
        ks.load(null, null);
        String keyPass = null;// your key pass or null if the key file has no password
        // adds the key and cert to the keystore
        ks.setKeyEntry(alias, privatekey, null, certChain);
        // save to file in order that then you
        // can install on windows keystore
        ks.store(new FileOutputStream("C:/where_save_your_keystore.p12"), "your_keystore_pass".toCharArray());

    }
}

Надеюсь это поможет,

person albciff    schedule 22.02.2015
comment
Это идеально. Спасибо. - person maluk; 25.02.2015
comment
@maluk рад помочь тебе :) - person albciff; 25.02.2015