【问题标题】:How to setEnabledCipherSuites when using Apache HTTP Client?使用 Apache HTTP 客户端时如何设置启用密码套件?
【发布时间】:2016-04-20 03:23:31
【问题描述】:

由于我需要使用一些旧版服务器,并且由于 RC4 已从 Java 8 中删除,因此我需要重新启用一些基于 RC4 的密码。如发行说明中所述,我们必须使用SSLSocket/SSLEngine.setEnabledCipherSuites()。由于我使用的是 Apache HTTP 客户端,我无法找到执行此操作的方法。提前致谢! (我还发现了一个没有答案的半拖车问题,所以想发布一个新的)

【问题讨论】:

    标签: java httpclient apache-httpclient-4.x apache-commons-httpclient


    【解决方案1】:

    我遇到了同样的问题,我能够解决这个问题。

    SecureProtocolSocketFactoryImpl protFactory = new SecureProtocolSocketFactoryImpl();
    httpsClient.getHostConfiguration().setHost(host, port, httpsProtocol);
    

    在“SecureProtocolSocketFactoryImpl”类中,您必须为 SecureProtocolSocketFactory 类重写方法 public Socket createSocket()。

    在那个方法中你会得到一个这样的套接字

     SSLSocket soc = (SSLSocket) getSSLContext().getSocketFactory().createSocket(
                        socket,
                        host,
                        port,
                        autoClose
                    );
    

    因此,您将能够执行以下操作。

    ciphersToBeEnabled[0] = "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA";
    soc.setEnabledCipherSuites(ciphersToBeEnabled);
    

    希望你能明白。如果您有任何问题,请在下面发表评论。请注意,仅这样做不会启用 RC4 相关密码。您需要修改 jre/lib/security/ 文件中的 java "java.security" 文件,并从禁用算法列表中删除 CR4。

    【讨论】:

      【解决方案2】:

      获取HttpClient 的推荐方法是使用HttpClientBuilder。在此构建器中,您可以设置HttpClientConnectionManager,而后者又可以采用Registry<ConnectionSocketFactory>。在这个ConnectionSocketFactory,你可以配置客户端想要限制的密码和协议。

      示例代码:

      Registry<ConnectionSocketFactory> socketFactoryRegistry;
          {
              SSLContext sslcontext = <your SSLContext>;
              socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
                  .register("http", new PlainConnectionSocketFactory())
                  .register("https", new SSLConnectionSocketFactory(sslcontext,
                                          <your supported protocols, could be null>,
                                          <your supported ciphers, could be null>,
                                          <your HostnameVerifier>
                  .build();
          }
      
      HttpClientBuilder b = HttpClientBuilder.create()
          .setConnectionManager(new BasicHttpClientConnectionManager(socketFactoryRegistry))
          .set<anything else you want>(<with what you want>);
      
      HttpClient client = b.build();
      

      【讨论】:

        猜你喜欢
        • 2014-03-01
        • 2011-09-25
        • 1970-01-01
        • 2014-05-16
        • 2015-07-14
        • 2021-06-02
        • 1970-01-01
        • 1970-01-01
        • 2011-07-17
        相关资源
        最近更新 更多