2015-08-04 2 views
2

У меня есть .p12-файл, и я хочу экспортировать открытый и закрытый ключи. Я использовал этот метод:Экспорт PublicKey и PrivateKey из файла PKCS12

FileInputStream fm = new FileInputStream("C:\\cert.p12"); 
    KeyStore ks = KeyStore.getInstance("PKCS12"); 
    try { 
     ks.load(fm, "pass".toCharArray()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    Key key = ks.getKey("cert", "pass".toCharArray()); 
    Certificate cert = ks.getCertificate("cert"); 
    PublicKey publicKey = cert.getPublicKey(); 
    System.out.println("Public key"); 
    System.out.println(Base64.getEncoder().encodeToString(
      publicKey.getEncoded())); 
    fm.close(); 

Второй способ заключается в использовании команды OpenSSL и преобразовать его в файл .CER:

openssl pkcs12 -in cert.p12 -out cert.cer -nodes 

Третий метод должен был загрузить этот cert.cer файл KeyStore и получить Ключ

FileInputStream fm1; 
    fm1 = new FileInputStream("C:\\cert.cer"); 
    CertificateFactory f = CertificateFactory.getInstance("X.509"); 
    X509Certificate certificate = (X509Certificate)f.generateCertificate(fm1); 
    PublicKey pk = certificate.getPublicKey(); 
    System.out.println("Public key"); 
    System.out.println(Base64.getEncoder().encodeToString(pk.getEncoded())); 

Так что мой вопрос в том, почему первый открытый ключ такой же, как в третьем методе, но отличается от второго метода. Как я могу экспортировать этот ключ?

+0

Второй пример экспортирует сертификат, а не ключ. – EJP

ответ

2

В первом примере вы читаете файл хранилища ключей типа PKCS12. В хранилище ключей вставляется один или несколько закрытых ключей. для каждой записи закрытого ключа существует один сертификат или одна цепочка сертификатов, содержащая множество сертификатов. Итак, здесь, указав правильный псевдоним и пароль хранилища ключей, вы получаете как закрытый ключ, так и сертификат. И из сертификата вы получаете его открытый ключ

Во втором примере вы получаете только сертификат из файла хранилища ключей. Итак, здесь вы не получаете открытый ключ, а сертификат, содержащий открытый ключ. Для того, чтобы получить открытый ключ из сертификата, запустите следующую команду после вашей команды:

openssl x509 -inform pem -in certificate.der -pubkey -noout > publickey.pem 

Теперь, в третьем примере, у вас уже есть файл сертификата для чтения. Вы читаете сертификат и получаете открытый ключ из сертификата.

Надеюсь, что это очистит ваше замешательство.