JSSE是否将PrivateKeyEntry中的证书用作信任锚?

时间:2016-04-12 14:19:42

标签: java ssl keystore truststore jsse

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

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

2 个答案:

答案 0 :(得分:0)

无论如何,证书放在 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));
}

没有任何:

  

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

truststore 只包含一个 PrivateKeyEntry (与服务器用作密钥库的jks文件相同):

<!DOCTYPE....</html> 

答案 1 :(得分:0)

  

如果我们有一个包含可信条目和私有条目的密钥库,那么在PrivateKeyEntry下获得证书是否足够

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

  

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

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

你正在混淆两个不同的东西,实际上是密钥库的两种不同用途。

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

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

  3. 包含两者的密钥库文件存在根本错误的格式。信任库只是要信任的证书列表。这不是秘密。 KeyStore包含您的私钥,对每个人来说都是绝密。将两者混为一谈是一项重大的安全漏洞。

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

    这甚至都不是一个问题的正确问题。如果您拥有可信证书的私钥,则表示您拥有其他人的私钥,这是表面上安全漏洞。