我写的是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
连接上使用此证书。
答案 0 :(得分:1)
您似乎在谈论客户端证书身份验证(您的Android设备是客户端)。
首先,您需要客户端使用与您尝试使用的证书中的公钥匹配的私钥(这是重点,否则,它不会对任何内容进行身份验证)。 PKCS#12是包含私钥和证书的常用格式之一。如果您只在 der 文件中拥有证书,则可能没有私钥,因此它不起作用。
从您的问题来看,您对certificate
变量的处理方式并不十分清楚KeyManagerFactory
(如果您有自定义X509KeyManager
,它应该在其getPrivateKey
中返回私钥1}}方法,否则不起作用。)
其次,客户端证书身份验证始终由服务器启动,因此您也需要相应地设置服务器(如果您的测试基于PKCS#12密钥库,则似乎已经是这种情况)