【问题标题】:Temporarily adding a self-signed certificate to a local truststore临时将自签名证书添加到本地信任库
【发布时间】: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个问题:

  1. 它不起作用 - 那么我做错了什么步骤?
  2. 此设置将只允许给定的证书,而不是给定的联合 证书+正常的证书。如何添加额外的 证书?
  3. 我不确定这只适用于临时(直到应用程序停止)和本地(仅适用于我的应用程序) - 确实 有人知道是不是这样吗?如果有的话,我能改成什么 实现这一目标?

【问题讨论】:

  • 它不起作用”:它是如何失败的?您确定您的客户端连接使用HttpsURLConnection 吗? (您应该能够从堆栈跟踪中看到。)

标签: java ssl x509certificate keystore


【解决方案1】:

这里对这个问题进行了很好的讨论:https://security.stackexchange.com/questions/40207/why-ie-windows-forces-you-to-install-self-signed-certificates-as-root-ca-to-make。简而言之,这是故意很难做到的。您是否有理由不能只向浏览器添加例外?

【讨论】:

  • 作为开发人员(而非最终用户),我知道我在做什么。因此,在某些编程语言中按设计 让这件事变得困难,真是一个绝妙的主意。
猜你喜欢
  • 2012-12-07
  • 2021-01-01
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 2018-01-24
  • 2016-01-25
  • 1970-01-01
相关资源
最近更新 更多