【发布时间】:2014-02-14 15:43:40
【问题描述】:
我运行一个使用 httpsconnections 的 java 应用程序。在服务器上有一个自签名证书。在我的本地机器上,我在路径 C:\Whatever\mycertificate.cer 上有一份此证书的副本。我想让我的本地机器接受自签名证书作为受信任的 https 连接(除了普通签名证书),仅适用于我的应用程序并且仅在应用程序运行时。
我的程序的输入参数是证书的路径。我使用以下代码将其转换为java对象X509Certificate:
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
InputStream inputStream = new FileInputStream(pathToTheCertificateFile);
X509Certificate certificate = (X509Certificate) certificateFactory.generateCertificate(inputStream);
inputStream.close();
接下来我创建一个新的空Keystore(信任库)并将证书对象添加到其中:
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);
trustStore.setCertificateEntry("extra", certificate);
最后,我使用TrustManagerFactory 创建了一个TrustManager:
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);
最后,我使用这些信任管理器数组来初始化 SSLContext
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, tmf.getTrustManagers(), null);
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
这有3个问题:
- 它不起作用 - 那么我做错了什么步骤?
- 此设置将只允许给定的证书,而不是给定的联合 证书+正常的证书。如何添加额外的 证书?
- 我不确定这只适用于临时(直到应用程序停止)和本地(仅适用于我的应用程序) - 确实 有人知道是不是这样吗?如果有的话,我能改成什么 实现这一目标?
【问题讨论】:
-
“它不起作用”:它是如何失败的?您确定您的客户端连接使用
HttpsURLConnection吗? (您应该能够从堆栈跟踪中看到。)
标签: java ssl x509certificate keystore