当你在Android应用程序中遇到 javax.net.ssl.SSLHandshakeException: 连接被对等方关闭
错误时,这意味着SSL握手过程中出现了问题,可能是由于证书验证失败或者TLS版本不兼容导致的。以下是一些解决方法:
确保你的服务器证书是有效的:首先,确保你的服务器证书是有效的,没有过期或被吊销。你可以使用浏览器访问你的服务器网站来验证证书是否有效。如果证书无效,你需要重新配置或更新你的服务器证书。
禁用主机名验证:有时,SSL握手失败是因为服务器的主机名验证不通过。你可以尝试禁用主机名验证来解决这个问题。但请注意,禁用主机名验证可能会导致安全风险,因为它无法确保你连接的是预期的服务器。在生产环境中,不建议长期禁用主机名验证。
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);
更新你的TLS版本:有时,SSL握手失败是由于TLS版本不兼容导致的。你可以尝试更新你的TLS版本来解决这个问题。在Android应用程序中,可以使用以下代码将TLS版本设置为TLSv1.2。
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, null, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
自定义SSL证书验证:如果你使用的是自签名证书或者不受信任的证书,你可以自定义SSL证书验证来解决这个问题。以下是一个示例代码:
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
};
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);
请注意,自定义SSL证书验证可能会导致安全风险,因为它无法确保你连接的是预期的服务器。在生产环境中,不建议长期使用自定义SSL证书验证。
这些是一些常见的解决方法,用于解决 javax.net.ssl.SSLHandshakeException: 连接被对等方关闭
错误。根据你的具体情况,可能需要尝试其中的一个或多个解决方法。