2010-10-24 4 views
3

Я пишу приложение для Android. Как использовать сертификат в соединении https, когда я инициализирую сертификат из файла каталога, а не из пакетов?Использование сертификата в https

Когда у меня есть пакеты файл с паролем, этот код работает:

 
    KeyStore keyStore = KeyStore.getInstance("PKCS12"); 
    keyStore.load(certificateIs, pass.toCharArray()); 
    KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    kmf.init(keyStore, pass.toCharArray()); 
    SSLContext sc = SSLContext.getInstance("TLS"); 
    sc.init(kmf.getKeyManagers(), trustAllCerts, new java.security.SecureRandom()); 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 

Но у меня есть сертификат, инициализированный из дер файла:

 
    CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
    X509Certificate certificate = (X509Certificate) cf.generateCertificate(certBytes); 

Я не знаю, как использовать этот сертификат через https связи.

ответ

0

Вы, кажется, говорите об аутентификации клиентского сертификата (где вашим Android-устройством является клиент).

Во-первых, клиент должен иметь закрытый ключ, соответствующий открытому ключу в сертификате, который вы пытаетесь использовать (в этом весь смысл, иначе он не аутентифицировал бы что-либо). PKCS # 12 является одним из обычных форматов для хранения закрытого ключа и сертификата. Если у вас есть только сертификат в файле der, у вас, вероятно, не будет закрытого ключа, поэтому он не будет работать. Неясно из вашего вопроса, что вы делаете с переменной certificate, относительно KeyManagerFactory (если у вас есть пользовательский X509KeyManager, он должен вернуть закрытый ключ в свой метод getPrivateKey, иначе он не будет работать).

Во-вторых, аутентификация сертификата клиента всегда инициируется сервером, поэтому вам также понадобится настроить сервер (похоже, это уже так, если ваш тест, основанный на хранилище ключей PKCS # 12, работает).

+0

Да, приложение для Android является клиентом, серверная сторона реализует другую компанию. У меня есть privateKey тоже (in der). У меня есть сертификат + закрытый ключ. Я не знаю, как использовать этот keypar в HttpsURLConnection. с pkcs, я использую sc.init(kmf.getKeyManagers(), trustAllCerts, new java.security.SecureRandom()); и HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());. Но когда у меня есть секретный ключ и сертификат отдельно. Вероятно, я должен вставить privateKey + cert в keyManagerFactory? Но я не знаю, как :( – Peter

+0

Как хранится ваш закрытый ключ? – Bruno

+0

Закрытый ключ в формате pem и сертификат тоже в формате pem. Я преобразую его в der и я использую:
X509 Сертификат сертификата = (X509Certificate) cf.generateCertificate (byteCertDerFormat);
privSpec = новый PKCS8EncodedKeySpec (bytePKDerFormat);
KeyFactory KeyFactory = KeyFactory.getInstance ("RSA");
privKey = (RSAPrivateKey) keyFactory.generatePrivate (privSpec); – Peter

 Смежные вопросы

  • Нет связанных вопросов^_^