我运行一个使用 https 连接的 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个问题:
- 它不起作用 - 那么我做错了哪一步?
- 此设置将只允许给定的证书,而不是给定的联合 证书+普通证书。我怎样才能添加额外的 证书?
- 我不确定这是否仅适用于临时(直到应用程序停止)和本地(仅适用于我的应用程序)- 确实如此 有人知道是不是这种情况吗?如果有的话,我可以改成什么 实现这个目标?
最佳答案
这里对这个问题进行了不错的讨论:https://security.stackexchange.com/questions/40207/why-ie-windows-forces-you-to-install-self-signed-certificates-as-root-ca-to-make .简而言之,这是故意很难做到的。您是否有理由不能只向浏览器添加异常(exception)?
关于java - 临时将自签名证书添加到本地信任库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21783553/