【问题标题】:Does JSSE use a certificate in a PrivateKeyEntry as a trust anchor?JSSE 是否使用 PrivateKeyEntry 中的证书作为信任锚?
【发布时间】:2016-04-12 14:19:41
【问题描述】:

如果将包含一个或多个PrivateKeyEntry 的密钥库指定为信任库,JSSE 是否会根据每个条目中的最终实体证书创建信任锚?

换句话说,如果我们有一个包含受信任和私有条目的密钥库,那么在PrivateKeyEntry 下拥有一个证书就足够了吗?或者,我们是否还必须将该证书添加为TrustedCertificateEntry?

【问题讨论】:

  • 你应该描述场景 a 但更详细

标签: java ssl keystore truststore jsse


【解决方案1】:

如果我们有一个包含受信任和私有条目的密钥库,那么在 PrivateKeyEntry 下拥有证书就足够了吗

你不应该有这样的密钥库。

或者我们应该添加证书作为trustedCertEntry,以便向他们自己/代理下的其他节点发出请求?

trustedCertEntry 用于传入证书。私钥条目用于传出证书。

您将两种不同的东西混为一谈,实际上是密钥库的两种不同用途。

  1. 包含trustedCertEntry 的密钥库文件是信任库,在javax.net.ssl.trustStore 的意义上,它告诉JSSE 要信任哪个传入 证书,直接或间接。

  2. 包含PrivateKeyEntry 的密钥库文件是密钥库,在javax.net.ssl.keyStore 的意义上,它告诉JSSE 哪些证书用于出站证书。

  3. 包含两者的密钥库文件的格式严重错误。信任库只是要信任的证书列表。这不是秘密。 KeyStore 包含您的私钥,它是每个人的最高机密。将两者混为一谈是一个重大的安全漏洞。

如果没有关系,为什么会有两种不同类型的条目?

这甚至不是一个合适的问题。如果您有一个私钥应该是受信任的证书,这意味着您有其他人的私钥,这是一个初步安全漏洞。

【讨论】:

  • 已编辑答案。你知道java还支持pkcs12密钥库格式吗,也许这就是它不检查是否trustedCertEntry的原因......因为pkcs12没有trustedCertEntry。
  • 这可能不明智,但 Java KeyStore API 及其提供者绝对支持在同一存储中拥有trustedCert 和PrivateKey 条目,并且对于某些类型(至少JCEKS 和BKS)SecretKey 条目也可以;私钥part(或secretkey)是加密的,不会被破坏。如果用作信任库,它确实包含 PrivateKeyEntry 的第一个(实体)证书;请参阅方法 getTrustedCerts() 中的hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/…。
  • @dave_thompson_085 当然会,不可避免。我不明白你的最后一句话。信任 tor 包含证书:我看不出有什么值得注意的地方。
  • @DiegoRamos 您是否考虑过查阅PrivateKeyEntry 或keytool 的Javadoc?这比在 cmets 中针对 5 年前的答案提出问题要高效得多。
  • @DiegoRamos 非常清楚PrivateKey 部分只包含私钥。最终证书包含公钥。
【解决方案2】:

证书放在 PrivateKeyEntry 或 trustedCertEntry 下的位置并不重要,JVM 信任 主机从证书无论如何。

在本地测试。

使用 https 和密钥库运行本地服务器,只有一个 PrivateKeyEntry。

并使用代码运行客户端:

public static String getHTML(String urlToRead) throws Exception {
    StringBuilder result = new StringBuilder();
    URL url = new URL(urlToRead);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("GET");
    BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String line;
    while((line = rd.readLine()) != null) {
        result.append(line);
    }
    rd.close();
    return result.toString();
}

public static void main(String[] args) throws Exception {
    String testUrl="https://localhost/test";
    System.out.println(getHTML(testUrl));
}

没有:

线程“主”javax.net.ssl.SSLHandshakeException 中的异常: sun.security.validator.ValidatorException:PKIX 路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效认证路径

使用仅包含一个 PrivateKeyEntry 的 truststore(用于服务器的同一 jks 文件作为密钥库):

<!DOCTYPE....</html> 

【讨论】:

  • 这是完全错误的。这很重要。 Java 信任 trustCertEntry 用于传入证书,并使用 privateKeyEntry 处理传出证书。
  • EJP,在我总是有两个之前,为什么我们需要同时使用一个密钥库并不重要......但现在它只有一个,实际上这就是为什么出现这个问题......我也一直想你,但事实并非如此,测试表明服务器只能有一个PrivateKeyEntry,它足以信任。 ..
  • 服务器将其证书提供给客户端就足够了。他们是否信任它是一个完全独立的问题,如果它使用该 KeyStore 作为其信任库,它也不会使 servr 信任任何证书。显然你没有尝试过这个,或者你可能没有理解你自己的问题。
  • 我理解我的问题。刚复习。使用 https (PrivateKeyEntry) 运行 jboss。并使用带有一个 PrivateKeyEntry 的信任库运行另一个程序,它可以工作...
  • 我知道这是愚蠢的事情,远非最佳实践,但它确实有效......
猜你喜欢
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多