1

我目前正在测试 SSL 的水域,并且是 SSL 的新手。作为我研究的一部分,我在 Java 领域遇到了 SSL 的两种不同实现。

首先说一下我的需求,很简单,我只需要一个流程来使用 https 将数据发布到 URL 中。

在这两种解决方案中,第一种是纯Java实现(仅使用核心Java类),另一种使用Apache HTTPClient来做http。

最初,作为我测试的一部分,我会得到臭名昭著的“无法找到请求目标的有效证书路径”异常,我认为当证书(从服务器接收)不是 Java 密钥存储的一部分时会发生这种情况。将证书添加到 Java 密钥库后,应用程序在这两种情况下都可以正常工作。然而,在我使用 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 实现的用途是什么?当我们想要自动将证书添加到密钥库时,我最初认为这很有用。我的分析正确吗?

如果我的分析是正确的,哪个实现更好?

  • 手动安装证书会更好吗?这种方法有什么缺点?证书会过期吗?如果是这样,我是否必须再次安装新证书?
  • 或者我应该使用 SSLSocketFactory 自动化整个密钥存储添加功能吗?

您的意见将不胜感激。谢谢你。

4

2 回答 2

2

你都不应该这样做。对此有现有的解决方案。

从文档

我们的贡献包中有几个自定义套接字工厂可用。对于那些寻求根据应用程序的特定需求定制 HTTPS 协议的行为的人来说,它们可能是一个良好的开端:

  • EasySSLProtocolSocketFactory 可用于创建允许目标服务器使用自签名证书进行身份验证的 SSL 连接。

  • StrictSSLProtocolSocketFactory 可用于创建 SSL 连接,可以选择执行主机名验证,以帮助防止中间人类型的攻击。

  • AuthSSLProtocolSocketFactory 可用于选择性地强制执行相互客户端/服务器身份验证。这是协议套接字工厂最灵活的实现。它允许自定义 SSL 身份验证的大部分(如果不是全部)方面。

于 2011-08-22T23:40:54.303 回答
1

我在 Java 领域遇到了 SSL 的两种不同实现。

不,你没有。您遇到了内置的 JSSE 以及 Apache围绕它构建的一些东西。例如,消息“无法找到请求目标的有效认证路径”来自 JSSE,实际上来自 JCE。

我知道的 JSSE 本身的唯一其他实现是在 IBM JVM 中。

于 2011-08-23T00:36:58.450 回答