【问题标题】:KeyStore, HttpClient, and HTTPS: Can someone explain this code to me?KeyStore、HttpClient 和 HTTPS:有人可以向我解释这段代码吗?
【发布时间】: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 构造函数时会发生什么?这样操作的结果是什么?

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

【问题讨论】:

    标签: java https httpclient keystore


    【解决方案1】:

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

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

    【讨论】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-20
      • 1970-01-01
      • 2011-05-31
      • 2011-02-28
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多