Đối với mục đích thử nghiệm, tôi đang cố gắng thêm một nhà máy sản xuất ổ cắm vào ứng dụng khách okHttp của mình tin cậy mọi thứ trong khi proxy được thiết lập. Điều này đã được thực hiện nhiều lần, nhưng việc triển khai nhà máy sản xuất ổ cắm đáng tin cậy của tôi dường như còn thiếu một số thứ:
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);
Không có yêu cầu nào được gửi ra khỏi ứng dụng của tôi và không có trường hợp ngoại lệ nào đang được ghi lại, vì vậy, có vẻ như nó đang không thành công trong okHttp. Khi điều tra thêm, có vẻ như có một Ngoại lệ bị nuốt chửng trong okHttp'sConnection.upgradeToTls()
khi bắt tay đang bị ép buộc. Ngoại lệ tôi đang được đưa ra là:javax.net.ssl.SSLException: SSL handshake terminated: ssl=0x74b522b0: SSL_ERROR_ZERO_RETURN occurred. You should never see this.
Đoạn mã sau tạo ra một mã SSLContext
hoạt động giống như một sự quyến rũ trong việc tạo SSLSocketFactory không đưa ra bất kỳ ngoại lệ nào:
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();
}
Vấn đề là tôi đang cố gắng xóa hoàn toàn tất cả các phụ thuộc Apache HttpClient khỏi ứng dụng của mình. Mã cơ bản với Apache HttpClient để tạo ra SSLContext
có vẻ đủ đơn giản, nhưng tôi rõ ràng là thiếu một số thứ vì tôi không thể định cấu hìnhSSLContext
để phù hợp với điều này.
Có ai có thể tạo ra một triển khai SSLContext mà không cần sử dụng Apache HttpClient không?
java.net.SocketTimeoutException: Read timed out