我目前正在测试SSL的水域,并且是SSL新手。作为我研究的一部分,我在java空间中遇到了两种不同的SSL实现。
首先,让我说明我的要求,这非常简单,我只需要一个使用https将数据发布到URL的过程。
在这两个解决方案中,第一个是纯Java实现(仅使用核心Java类),另一个使用Apache HTTPClient来实现http。
最初,作为我的测试的一部分,我会得到臭名昭着的“无法找到有效的证书路径到请求的目标”异常,我认为当证书(从服务器收到)不是Java的一部分时会发生这种情况钥匙店。将证书添加到Java Key存储后,应用程序在两种情况下都能正常工作。 但是,在我使用HTTPClient时,我注意到了SSLSocketFactory的使用。
当我使用以下代码测试HttpClient时,
HttpClient httpClient = new HttpClient();
PostMethod postMethod = new PostMethod(target);
postMethod.setQueryString("someQueryString");
try {
httpClient.executeMethod(postMethod);
System.out.println("Response code: " + postMethod.getStatusLine());
BufferedReader in = new BufferedReader (new InputStreamReader(postMethod.getResponseBodyAsStream()));
String temp;
while ((temp = in.readLine()) != null){
response += temp + "\n";
}
temp = null;
in.close ();
System.out.println("Server response:\n'" + response + "'");
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
postMethod.releaseConnection();
}
它运行正常,所以我不确定SSLSocketFactory实现的用途是什么?当我们想要自动将证书添加到密钥库时,我最初认为这很有用。我在分析中是对的吗?
如果我的分析是真的,哪种实施更好?
非常感谢您的投入。谢谢。
答案 0 :(得分:2)
你不应该这样做。现有解决方案。
我们有几个自定义套接字工厂 捐款方案。对于那些寻求帮助的人来说,这是一个良好的开端 根据特定需求定制HTTPS协议的行为 他们的申请:
EasySSLProtocolSocketFactory可用于创建SSL 允许目标服务器使用a进行身份验证的连接 自签名证书。
StrictSSLProtocolSocketFactory可用于创建SSL 可选择执行主机名验证的连接 为了帮助防止中间人攻击。
AuthSSLProtocolSocketFactory可用于有选择地强制执行 相互客户/服务器认证。这是最灵活的 协议套接字工厂的实现。它允许 自定义SSL身份验证的大多数(如果不是全部)方面。
答案 1 :(得分:1)
我在java空间中遇到了两种不同的SSL实现。
不,你没有。您遇到了内置的JSSE以及Apache已经构建的它的一些东西。例如,“无法找到所请求目标的有效证书路径”的消息来自JSSE,实际上来自JCE。
我所知道的JSSE本身唯一的其他实现是在IBM JVM中。