我正在编写一个必须连接到 SSL 服务器的 Android 客户端。有什么方法可以设置 TrustStore 以使其信任 SSL 服务器发送的任何证书?还是真的是我必须以某种方式获取 SSL 服务器证书并使用一些神秘的命令行命令将其放入客户端上的信任存储文件中?
问问题
141 次
1 回答
-1
首先创建文件 TrustAllManager.java:
package my.package;
import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
public class TrustAllManager implements X509TrustManager {
@Override
public void checkClientTrusted(
X509Certificate[] x509Certificates,
String s) throws CertificateException { }
@Override
public void checkServerTrusted(
X509Certificate[] x509Certificates,
String s) throws CertificateException { }
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
然后在您的代码中使用它:
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[] { new TrustAllManager() }, null);
SSLContext.setDefault(sslContext);
您必须了解其中的含义,例如有人可以编辑 /etc/resolv.conf 或更改路由器的设置,而您的应用程序仍会认为它正在与受信任的服务器通信。
就我而言,我这样做是为了支持较旧的 Android 4 手机(例如 2012 年构建的“三星 Galaxy S3”),它不信任为我的三个应用后端颁发证书的“DigiCert Global Root G2”CA(2019 年)。由于我还在我的应用程序中使用了nv-websocket-client库,因此我还必须添加以下行:
WebSocketFactory wsFactory = new WebSocketFactory();
wsFactory.setSSLContext(sslContext);
wsFactory.setVerifyHostname(false);
为了完整起见,我还看到了以下行:
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
于 2020-08-29T10:59:10.297 回答