我需要什么样的SSL实施?

时间:2011-08-22 23:34:42

标签: java ssl html-components jsse

我目前正在测试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实现的用途是什么?当我们想要自动将证书添加到密钥库时,我最初认为这很有用。我在分析中是对的吗?

如果我的分析是真的,哪种实施更好?

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

非常感谢您的投入。谢谢。

2 个答案:

答案 0 :(得分:2)

你不应该这样做。现有解决方案。

From the docs

  

我们有几个自定义套接字工厂   捐款方案。对于那些寻求帮助的人来说,这是一个良好的开端   根据特定需求定制HTTPS协议的行为   他们的申请:

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

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

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

  •   

答案 1 :(得分:1)

  

我在java空间中遇到了两种不同的SSL实现。

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

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