2

我试图了解这段代码中发生了什么。

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 构造函数时会发生什么?这样的操作的结果是什么?

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

4

2 回答 2

2

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

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

于 2010-04-30T00:11:52.303 回答
1

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

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

此示例向您展示了如何为DefaultHttpClient. 当 SSL 站点使用由他们自己的内部证书颁发机构签名的证书时,这很有用。只有当服务器证书的签名者被识别时,SSL 连接才会建立。如果您不熟悉 TLS 的概念,那么Wikipedia 上的TLS条目是一个不错的介绍。

于 2010-04-30T00:21:52.747 回答