如何在使用Apache HTTP Client时设置EnabledCipherSuite?

时间:2016-04-20 03:23:32

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

由于我需要使用一些旧版服务器,并且从{8}中删除了RC4,我需要重新启用一些基于RC4的密码。如发行说明中所述,我们必须使用SSLSocket/SSLEngine.setEnabledCipherSuites()。由于我使用的是Apache HTTP Client,因此无法找到实现此目的的方法。提前致谢! (我也找到了一个半挂车的问题而没有回答,所以想发布一个新的)

2 个答案:

答案 0 :(得分:2)

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

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

在" SecureProtocolSocketFactoryImpl" class必须覆盖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相关的密码。您将需要修改java" java.security"在jre / lib / security / file中的文件,并从禁用的算法列表中删除CR4。

答案 1 :(得分:1)

获取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(); 中,您可以配置客户端要限制的密码和协议。

示例代码:

class App(Frame):

    def __init__(self, master):
        self.frame = Frame(master)
        self.frame.pack()
        self.createWidgets()

    def createWidgets(self):
        photo = PhotoImage(file="screeniess.png")
        w = Label(self.frame, image=photo)
        w.photo = photo
        w.pack()

root = Tk()
root.title("Application")
root.geometry("400x500")
root.resizable(0,0)
root.mainloop()