使用https中的证书

时间:2010-10-24 17:50:17

标签: java android https certificate x509certificate

我写的是android应用程序。 当我从目录文件而不是从包中初始化证书时,如何在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连接上使用此证书。

1 个答案:

答案 0 :(得分:1)

您似乎在谈论客户端证书身份验证(您的Android设备是客户端)。

首先,您需要客户端使用与您尝试使用的证书中的公钥匹配的私钥(这是重点,否则,它不会对任何内容进行身份验证)。 PKCS#12是包含私钥和证书的常用格式之一。如果您只在 der 文件中拥有证书,则可能没有私钥,因此它不起作用。 从您的问题来看,您对certificate变量的处理方式并不十分清楚KeyManagerFactory(如果您有自定义X509KeyManager,它应该在其getPrivateKey中返回私钥1}}方法,否则不起作用。)

其次,客户端证书身份验证始终由服务器启动,因此您也需要相应地设置服务器(如果您的测试基于PKCS#12密钥库,则似乎已经是这种情况)