我正在编写一个必须连接到SSL服务器的Android客户端。有没有办法设置TrustStore,以便它信任SSL服务器发送的任何证书?或者是否真的必须以某种方式获取SSL服务器证书并使用一些神秘的命令行命令将其放入我的客户端上的信任存储文件中?
答案 0 :(得分:-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”),该手机不信任为我的三个应用程序颁发证书(于2019年)的“ DigiCert全球根G2” CA。后端。由于我还在应用中使用了nv-websocket-client库,因此我还必须添加以下几行:
WebSocketFactory wsFactory = new WebSocketFactory();
wsFactory.setSSLContext(sslContext);
wsFactory.setVerifyHostname(false);
为了完整起见,我也看到了以下行:
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());