2010-10-24 70 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()); 

但我从DER文件初始化证书:

 
    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)。我有证书+私钥。我不知道如何在HttpsURLConnection中使用此按键。使用pkcs,我使用sc.init(kmf.getKeyManagers(), trustAllCerts, new java.security.SecureRandom());HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());。但是当我有私钥和证书分开时。可能我必须在keyManagerFactory中插入privateKey + cert?但我不知道如何: – Peter 2010-10-24 20:13:31

+0

你的私钥是如何存储的? – Bruno 2010-10-24 20:15:14

+0

私钥是pem格式,也是pem格式的证书我将其转换为der并使用:
X509Certificate certificate =(X509Certificate)cf.generateCertificate (byteCertDerFormat);
privSpec =新的PKCS8EncodedKeySpec(bytePKDerFormat);
的KeyFactory的KeyFactory = KeyFactory.getInstance( “RSA”);
的privKey =(RSAPrivateKey)keyFactory.generatePrivate(privSpec); – Peter 2010-10-24 20:20:33