Недавно я был назначен ответственным за издевание продукта Apple (утилита настройки iPhone) на Java. Один из разделов, которые я немного застрял, - это часть Exchange ActiveSync. В нем вы можете выбрать сертификат из вашей брелка для использования в качестве учетных данных для своей учетной записи EAS. После некоторого исследования я обнаружил, что он фактически создает хранилище ключей PKCS12, вставляя закрытый ключ выбранного сертификата и кодируя его в XML. Пока что не очень. Если я создаю файл .p12 с Keychain Access, он загружает без проблем. Но я сталкиваюсь с проблемой, когда пытаюсь передать это на Java.
Скажем, я экспортирую один из тех сертификатов, который я использовал ранее с файлом .p12 в виде .cer файла (это то, что мы ожидаем получить в среде). Теперь, когда я загружаю его в Java, я получаю объект Certificate следующим образом:
KeyStore ks = java.security.KeyStore.getInstance("PKCS12");
ks.load(null, "somePassword".toCharArray());
CertificateFactory cf = CertificateFactory.getInstance("X.509", new BouncyCastleProvider());
java.security.cert.Certificate userCert = cf.generateCertificate(new FileInputStream("/Users/me/Desktop/RecentlyExportedCert.cer"));
Но когда я пытаюсь...
ks.setCertificateEntry("SomeAlias", userCert);
Я получаю исключение...
java.security.KeyStoreException: TrustedCertEntry not supported
Итак, из сертификатов я перехожу к ключам. Но с этими сертификатами (я также получил сертификат CA), я могу получить доступ к открытому ключу, а не к частному. И если я попытаюсь добавить открытый ключ так...
java.security.cert.Certificate[] chain = {CACert};
ks.setKeyEntry("SomeAlias", userCert.getPublicKey().getEncoded(), chain);
Я получаю...
java.security.KeyStoreException: Private key is not stored as PKCS#8 EncryptedPrivateKeyInfo: java.io.IOException: DerValue.getOctetString, not an Octet String: 3
Итак, теперь я здесь. Кто-нибудь знает, как получить закрытый ключ из файла .cer в хранилище ключей PKCS12 на Java? Я даже на правильном пути?
Спасибо заранее!