公司最近有个接口改造需求,要将http请求改成https请求,我用的是绕过验证数字证书的方法,网上有很多,但我老版代码采用的是webservice编程,一直没有合适的,后来研究了一下,总结如下,亲测有效
1. 需要自定义一个配置类SoapHTTPConduitConfigurer
@Configuration
public class SoapHTTPConduitConfigurer implements HTTPConduitConfigurer {
@Override
public void configure(String name, String address, HTTPConduit c) {
try{
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
c.setClient(httpClientPolicy);
SSLContext context = createIgnoreVerifySSL();
TLSClientParameters params = c.getTlsClientParameters();
if (params == null) {
params = new TLSClientParameters();
}
params.setSslContext(context);
params.setSSLSocketFactory(context.getSocketFactory());
params.setHostnameVerifier((s, sslSession) -> true);
c.setTlsClientParameters(params);
}catch(Exception e){
e.printStackTrace();
}
}
public static SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sc = SSLContext.getInstance("TLS");
// 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法
X509TrustManager trustManager = new X509TrustManager() {
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
String paramString) throws CertificateException {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
String paramString) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sc.init(null, new TrustManager[]{trustManager}, null);
return sc;
}
}
其他的啥也不用干,部署测试,能够正常访问https路径
当我们绕过证书时,就意味着不再对服务器的数字证书进行验证,无论其是否是由受信任的证书颁发机构(CA)签发的。这样做可能会带来一些安全风险,因为我们无法确保建立的连接是安全的,并且无法验证服务器的身份。
绕过证书通常只应在开发和测试环境中使用,不建议在生产环境中使用!!!