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使用详解与实战一:普通的GET和POST请求
HttpClient使用详解与实战一:普通的GET和POST请求