Test amacıyla, okHttp istemcime bir proxy ayarlandığında her şeye güvenen bir soket fabrikası eklemeye çalışıyorum. Bu defalarca yapıldı, ancak güvenilir bir soket fabrikası uygulamamda bir şey eksik görünüyor:
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);
Uygulamamdan hiçbir istek gönderilmiyor ve hiçbir istisna kaydedilmiyor, bu nedenle okHttp içinde sessizce başarısız oluyor gibi görünüyor. Daha fazla araştırmanın ardından Connection.upgradeToTls()
, el sıkışmaya zorlanırken okHttp'lerde yutulan bir İstisna var gibi görünüyor . Bana verilen istisna:javax.net.ssl.SSLException: SSL handshake terminated: ssl=0x74b522b0: SSL_ERROR_ZERO_RETURN occurred. You should never see this.
Aşağıdaki kod, SSLContext
herhangi bir istisna atmayan bir SSLSocketFactory oluştururken bir cazibe gibi çalışan bir kod üretir :
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();
}
Sorun şu ki, tüm Apache HttpClient bağımlılıklarını uygulamamdan tamamen kaldırmaya çalışıyorum. Apache HttpClient'in temelini oluşturan kod SSLContext
yeterince basit görünüyor, ancak açıkçası kendimi SSLContext
buna uyacak şekilde yapılandıramadığım için bir şeyi kaçırıyorum .
Benim istediğimi Apache HttpClient kullanmadan yapan bir SSLContext uygulaması üretebilecek olan var mı?
java.net.SocketTimeoutException: Read timed out