KeyStore、HttpClient 和 HTTPS:有人可以向我解释这段代码吗?

Posted

技术标签:

【中文标题】KeyStore、HttpClient 和 HTTPS:有人可以向我解释这段代码吗?【英文标题】:KeyStore, HttpClient, and HTTPS: Can someone explain this code to me? 【发布时间】:2010-04-29 23:44:45 【问题描述】:

我试图了解this code 中发生了什么。

KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());        
FileInputStream instream = new FileInputStream(new File("my.keystore")); 
try 
    trustStore.load(instream, "nopassword".toCharArray());
 finally 
    instream.close();


SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
Scheme sch = new Scheme("https", socketFactory, 443);
httpclient.getConnectionManager().getSchemeRegistry().register(sch);

我的问题:

trustStore.load(instream, "nopassword".toCharArray()); 到底在做什么?通过阅读文档load() 将使用一些任意的“nopassword”从输入流(这只是我们刚刚创建的一个空文件)加载 KeyStore 数据。为什么不直接使用null 作为 InputStream 参数和一个空字符串作为密码字段来加载它?

然后当这个空的 KeyStore 被传递给 SSLSocketFactory 构造函数时会发生什么?这样操作的结果是什么?

或者 -- 这只是一个示例,在实际应用程序中,您必须实际引用现有的密钥库文件/密码?

【问题讨论】:

【参考方案1】:

此示例尝试向您展示如何加载您自己的信任库。为了让这个例子正常工作,你需要在当前目录中有一个名为“my.keystore”的文件,并且密钥库的密码是“nopassword”。

请注意new File("my.keystore") 不一定会创建新文件。它只是创建一个指向路径的 File 对象。

【讨论】:

事实上,new File() 永远不会创建新文件。如果文件不存在,那么 FileInputStream 将立即抛出异常。该代码暗示您事先创建了一个密钥库,给它一个密码“nopassword”,然后导入了一些您信任的 SSL 证书。然后,您将密钥库与您的应用程序打包在一起,以便用于验证证书。【参考方案2】:

或者 -- 这只是一个示例,在实际应用程序中,您必须实际引用现有的密钥库文件/密码?

确实是这样的。在 HttpClient 4.0.1 的二进制或源代码分发中没有分发 "my.keystore" 文件。为此,您将创建一个实际的密钥库。您可以使用keytool 或Portecle。

此示例向您展示了如何为DefaultHttpClient 的此实例使用与 JVM 默认使用的信任库 ($JAVA_HOME/jre/lib/security/cacerts) 不同的信任库。当 SSL 站点使用由他们自己的内部 certificate authority 签名的证书时,这很有用。只有当服务器证书的签名者被识别时,SSL 连接才会建立。如果您不熟悉这个概念,那么TLS 上的***条目是一个不错的介绍。

【讨论】:

以上是关于KeyStore、HttpClient 和 HTTPS:有人可以向我解释这段代码吗?的主要内容,如果未能解决你的问题,请参考以下文章

工具篇:apache-httpClient 和 jdk11-HttpClient的使用

httpclient

HttpClient使用详解与实战一:普通的GET和POST请求

HttpClient使用详解与实战一:普通的GET和POST请求

用java做一个httpClient 发送https 的get请求,需要证书验证的那种,求大神指点一下!

springboot整合httpClient