Spring Boot用Axis调用HTTPS SOAP服务如何配置接受任意无效证书
⚠️ 重要提醒:以下配置仅可在隔离测试环境使用,会完全跳过HTTPS服务端证书校验、主机名合法性校验,直接暴露在中间人攻击风险下,严禁在生产环境使用。
Axis 1.x 客户端实现方案
你不需要把测试环境的自签证书导入JVM信任库,通过自定义Axis的SSL套接字工厂即可实现跳过证书校验的效果,不会改动全局JVM的证书配置:
- 第一步:自定义不做证书校验的SSL套接字工厂实现
import javax.net.ssl.*; import java.security.cert.X509Certificate; import java.net.Socket; import java.io.IOException; import java.security.GeneralSecurityException; public class SkipCertCheckSSLSocketFactory extends SSLSocketFactory { private static final SSLSocketFactory DELEGATE_FACTORY; static { try { // 配置空逻辑的证书信任管理器,信任所有服务端证书 TrustManager[] trustAllManager = new TrustManager[]{ new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {} @Override public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {} @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } } }; // 初始化TLS上下文 SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustAllManager, new java.security.SecureRandom()); DELEGATE_FACTORY = sslContext.getSocketFactory(); // 跳过主机名校验 HttpsURLConnection.setDefaultHostnameVerifier((hostname, sslSession) -> true); } catch (GeneralSecurityException e) { throw new RuntimeException("初始化跳过证书校验的SSL工厂失败", e); } } // 所有套接字创建逻辑全部委托给上面初始化的、不校验证书的工厂实例 @Override public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { return DELEGATE_FACTORY.createSocket(s, host, port, autoClose); } @Override public String[] getDefaultCipherSuites() { return DELEGATE_FACTORY.getDefaultCipherSuites(); } @Override public String[] getSupportedCipherSuites() { return DELEGATE_FACTORY.getSupportedCipherSuites(); } @Override public Socket createSocket(String host, int port) throws IOException { return DELEGATE_FACTORY.createSocket(host, port); } @Override public Socket createSocket(String host, int port, java.net.InetAddress localAddr, int localPort) throws IOException { return DELEGATE_FACTORY.createSocket(host, port, localAddr, localPort); } @Override public Socket createSocket(java.net.InetAddress host, int port) throws IOException { return DELEGATE_FACTORY.createSocket(host, port); } @Override public Socket createSocket(java.net.InetAddress address, int port, java.net.InetAddress localAddr, int localPort) throws IOException { return DELEGATE_FACTORY.createSocket(address, port, localAddr, localPort); } } - 第二步:给Axis客户端注册这个自定义工厂,推荐优先选单服务生效的配置方式,避免影响应用内其他HTTPS逻辑:
- 单SOAP客户端生效(推荐):在你初始化的Axis服务Stub实例上单独设置属性,仅当前调用会跳过证书校验
// 替换成你自己的SOAP服务Stub类 YourSoapServiceStub serviceStub = new YourSoapServiceStub(); serviceStub._setProperty("axis.socketSecureFactory", SkipCertCheckSSLSocketFactory.class.getName()); - 全局Axis生效:如果应用里所有Axis调用都要连这个测试环境的SOAP服务,可以全局配置
AxisProperties.setProperty("axis.socketSecureFactory", SkipCertCheckSSLSocketFactory.class.getName());
- 单SOAP客户端生效(推荐):在你初始化的Axis服务Stub实例上单独设置属性,仅当前调用会跳过证书校验
其他场景说明
- 如果你用的是Axis2而非Axis 1.x,逻辑完全一致:实现Axis2提供的
SSLSocketFactory扩展接口,注入上面逻辑生成的不校验证书的SSLContext,再在axis2.xml中注册自定义工厂即可。 - 不要通过修改JVM启动参数、设置全局
javax.net.ssl.*系统属性的方式跳过证书校验,这种方式会影响JVM内所有HTTPS请求,风险范围不可控。 - 测试结束切换生产环境前,必须移除这段跳过校验的配置,改用将服务端证书导入信任库的正规方式做证书合法性校验。
内容的提问来源于stack exchange,提问作者CaptainPyscho
相关产品推荐
相关产品推荐

