2017-02-16 8 views
2

У меня есть открытый публичный сертификат клиента и файл закрытого ключа в виде файлов формата .pem.Как создать файл формата PKCS # 12 с открытым сертификатом клиента и закрытым ключом с помощью java-программы

Может ли кто-нибудь из вас помочь мне создать файл формата PKCS # 12 с этими файлами с помощью java-программы.

Здесь я добавил мой код

Path path = Paths.get(new File("User_privkey.pem").getAbsolutePath()); 
     Path certPath = Paths.get(new File("User.pem").getAbsolutePath()); 
     try { 
      // Used to read User_privkey.pem file to get private key 
      PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Files.readAllBytes(path)); 
      KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
      PrivateKey privateKey = keyFactory.generatePrivate(spec); 

      // Used to read user certificate 
      CertificateFactory factory = CertificateFactory.getInstance("X.509"); 
      Certificate cert = factory.generateCertificate(Files.newInputStream(certPath, null)); 

      KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
      // add it to the keystore 
      ks.setKeyEntry("MyPKCSEntry", privateKey, "Temp".toCharArray(), new Certificate[] { cert }); 

      File file = new File("CERTIFICATE_CUSTOMPATH"); 
      OutputStream out = new FileOutputStream(file); 
      ks.store(out, "Temp".toCharArray()); 
      out.close(); 

     } catch (Exception e) { 
      System.out.println("Exception got caught" + e.getMessage()); 
     } 
+1

попытка добавить код на свой вопрос. – Seeker

+0

Возможный дубликат [конвертировать сертификат PEM в JKS] (http://stackoverflow.com/questions/22296312/convert-certificate-from-pem-into-jks) – Keith

+0

Привет, я ищу для реализации вышеуказанных функций. Можете ли вы помочь мне с кодом для достижения этого требования. –

ответ

0

вы можете использовать этот код, я также рекомендую этот link

public static byte[] pemToPKCS12(final String keyFile, final String cerFile, final String password) throws Exception { 
// Get the private key 
FileReader reader = new FileReader(keyFile); 

PEMReader pem = new PEMReader(reader, new PasswordFinder() { 
    @Override public char[] getPassword() { 
     return password.toCharArray(); 
    } 
}); 

PrivateKey key = ((KeyPair)pem.readObject()).getPrivate(); 

pem.close(); 
reader.close(); 

// Get the certificate  
reader = new FileReader(cerFile); 
pem = new PEMReader(reader); 

X509Certificate cert = (X509Certificate)pem.readObject(); 
java.security.cert.Certificate X509Certificate = 
     new JcaX509CertificateConverter().setProvider("SC") 
      .getCertificate(cert); 
pem.close(); 
reader.close(); 

// Put them into a PKCS12 keystore and write it to a byte[] 
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
KeyStore ks = KeyStore.getInstance("PKCS12"); 
ks.load(null); 
ks.setKeyEntry("alias", (Key)key, password.toCharArray(), new java.security.cert.Certificate[]{cert}); 
ks.store(bos, password.toCharArray()); 
bos.close(); 
return bos.toByteArray();} 
+0

Привет, я получаю следующее исключение. Можете ли вы помочь мне решить эту проблему java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: неверный формат ключа –

+0

@VinodKumar, пожалуйста, покажите свой код – aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

+0

В приведенном выше коде, если я не ошибаюсь, вы используете bouncycastle api для чтения pem файла. Пожалуйста, ознакомьтесь с кодом, который я использую сейчас! PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec (Files.readAllBytes (путь)); PrivateKey privateKey = keyFactory.generatePrivate (spec); –

0

Некоторые исправления необходимы в вашем коде. Попробуйте использовать этот полностью функциональный код. Он не требует дополнительных зависимостей. Я предположил, ваш ключ PKCS # 8 (начинается с -----BEGIN PRIVATE KEY-----. Если нет, то вы не будете конвертировать его.

public static void selfSignedCertificateToP12(String privateKeyFile, String certificateFile,String p12File, String alias, char[] password) 
     throws Exception{ 
    byte privateKeyData[] = Files.readAllBytes(Paths.get(privateKeyFile)); 
    byte certificateData[] = Files.readAllBytes(Paths.get(certificateFile)); 

    //Remove PEM header, footer and \n 
    String privateKeyPEM = new String (privateKeyData, StandardCharsets.UTF_8); 
    privateKeyPEM = privateKeyPEM.replace(
      "-----BEGIN PRIVATE KEY-----\n", "") 
       .replace("-----END PRIVATE KEY-----", "") 
       .replaceAll("\n", ""); 
    byte privateKeyDER[] = Base64.getDecoder().decode(privateKeyPEM); 

    // Used to read User_privkey.pem file to get private key 
    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(privateKeyDER); 
    KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
    PrivateKey privateKey = keyFactory.generatePrivate(spec); 

    // Used to read user certificate 
    CertificateFactory factory = CertificateFactory.getInstance("X.509"); 
    Certificate cert = factory.generateCertificate(new ByteArrayInputStream(certificateData)); 

    //Create keystore, add entry with the provided alias and save 
    KeyStore ks = KeyStore.getInstance("PKCS12"); 
    ks.load(null); 
    ks.setKeyEntry(alias, privateKey, password, new Certificate[] { cert }); 
    OutputStream out = new FileOutputStream(p12File); 
    ks.store(out, password); 
    out.close(); 
}