0

由於我需要使用一些舊版服務器,並且由於RC4已從Java 8中刪除,所以我需要重新啓用一些基於RC4的密碼。如發行說明中所述,我們必須使用SSLSocket/SSLEngine.setEnabledCipherSuites()。由於我使用的是Apache HTTP客戶端,因此我無法找到一種方法來執行此操作。提前致謝! (我也發現相當半拖車的問題,因此想到發佈一個新的答案)如何在使用Apache HTTP Client時設置EnabledCipherSuites?

回答

1

我正面臨同樣的問題,我能夠弄清楚這一點。

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

在「SecureProtocolSocketFactoryImpl」類,你必須要覆蓋的方法是公共套接字的createSocket()爲SecureProtocolSocketFactory類。

在這種方法中,你會得到一個插座這樣

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/file中的java「java.security」文件,並從禁用的算法列表中刪除CR4。

0

獲得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(); 
相關問題