प्रयोजनों के परीक्षण के लिए, मैं अपने okHttp क्लाइंट के लिए एक सॉकेट फैक्ट्री जोड़ने की कोशिश कर रहा हूं जो एक प्रॉक्सी सेट होने पर सब कुछ पर भरोसा करता है। यह कई बार खत्म हो गया है, लेकिन एक भरोसेमंद सॉकेट कारखाने के मेरे कार्यान्वयन कुछ याद आ रहा है:
class TrustEveryoneManager implements X509TrustManager {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { }
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { }
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
}
OkHttpClient client = new OkHttpClient();
final InetAddress ipAddress = InetAddress.getByName("XX.XXX.XXX.XXX"); // some IP
client.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ipAddress, 8888)));
SSLContext sslContext = SSLContext.getInstance("TLS");
TrustManager[] trustManagers = new TrustManager[]{new TrustEveryoneManager()};
sslContext.init(null, trustManagers, null);
client.setSslSocketFactory(sslContext.getSocketFactory);
मेरे ऐप से कोई अनुरोध नहीं भेजा जा रहा है और कोई अपवाद लॉग इन नहीं हो रहा है, इसलिए ऐसा लगता है कि यह okHttp के भीतर चुपचाप विफल हो रहा है। आगे की जांच करने पर, ऐसा लगता है कि एक अपवाद है जिसे ओकेटेप Connection.upgradeToTls()
में हाथ मिलाने के लिए मजबूर किया जा रहा है। मुझे जो अपवाद दिया जा रहा है वह है:javax.net.ssl.SSLException: SSL handshake terminated: ssl=0x74b522b0: SSL_ERROR_ZERO_RETURN occurred. You should never see this.
निम्नलिखित कोड SSLContext
एक SSLSocketFactory बनाने में एक आकर्षण की तरह काम करता है जो कोई अपवाद नहीं फेंकता है:
protected SSLContext getTrustingSslContext() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
final SSLContextBuilder trustingSSLContextBuilder = SSLContexts.custom()
.loadTrustMaterial(null, new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
return true; // Accepts any ssl cert whether valid or not.
}
});
return trustingSSLContextBuilder.build();
}
मुद्दा यह है कि मैं अपने ऐप से सभी अपाचे HttpClient निर्भरता को पूरी तरह से हटाने की कोशिश कर रहा हूं। अपाचे HttpClient के साथ अंतर्निहित कोड SSLContext
सीधे सरल प्रतीत होता है, लेकिन मैं स्पष्ट रूप से कुछ याद कर रहा हूं क्योंकि मैं इसे SSLContext
मैच करने के लिए कॉन्फ़िगर नहीं कर सकता हूं ।
क्या कोई SSLContext कार्यान्वयन का उत्पादन करने में सक्षम होगा जो अपाचे HttpClient का उपयोग किए बिना मुझे क्या चाहिए?
java.net.SocketTimeoutException: Read timed out