import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
public class SslConfig{
public static void ignoreSsl() throws Exception {
HostnameVerifier hv = (s, sslSession) -> true;
trustAllHttpsCertificates();
HttpsURLConnection.setDefaultHostnameVerifier(hv);
}
private static void trustAllHttpsCertificates() throws Exception {
TrustManager[] trustManagers = new TrustManager[1];
TrustManager tm = new miTM();
trustManagers[0] = tm;
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustManagers, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
static class miTM implements TrustManager, X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
return;
}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
return;
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public boolean isServerTrusted(X509Certificate[] certs) {
return true;
}
public boolean isClientTrusted(X509Certificate[] certs) {
return true;
}
}
}
然后在启动类里配置:SslUtils.ignoressl();
public static void main(string[] args)throws Exception {
SslUtils.ignoressl();
SpringApplication.run(YourAppName.class, args);
}
比如当 ServiceA 调用 ServiceB 需要提供 SSL 证书时,在dev环境一般不需要提供SSL证书,所以就可以加此配置即可跳过证书验证
代码解析
ignoreSsl
方法:- 创建一个
HostnameVerifier
实例,始终返回true
,这意味着它会忽略所有主机名验证。 - 调用
trustAllHttpsCertificates
方法,设置一个全局的信任管理器,信任所有的 HTTPS 证书。 - 设置默认的主机名验证器。
- 创建一个
trustAllHttpsCertificates
方法:- 创建一个包含自定义
TrustManager
的数组。 - 获取一个
SSLContext
实例,并使用信任所有证书的TrustManager
初始化它。 - 设置默认的
SSLSocketFactory
,以使用这个信任管理器。
- 创建一个包含自定义
miTM
类:- 自定义的
TrustManager
实现,忽略所有证书验证。 checkClientTrusted
和checkServerTrusted
方法都被重写为空实现,表示不对客户端和服务器证书进行任何检查。getAcceptedIssuers
方法返回null
,表示接受任何发行者的证书。isServerTrusted
和isClientTrusted
方法始终返回true
,表示信任所有服务器和客户端证书。
- 自定义的
注意事项
虽然这个类在开发和测试环境中可能有用,但在生产环境中使用是不安全的,因为它会使你的应用程序容易受到各种 SSL/TLS 攻击。请确保在生产环境中进行适当的证书验证,以保护数据传输的安全性。