Spring Boot调用带数字证书的SOAP服务遇400错误求排查
看你贴的配置,几个可能的问题点和排查方向:
1. 密钥库格式不匹配
你代码里用KeyStore.getInstance("PKCS12")加载密钥库,但变量名是caminhoArquivoJKS(JKS文件路径),如果你的密钥库实际是JKS格式,这里就会加载失败,转而使用默认SSLContext。而服务器可能要求客户端提供证书,默认SSLContext没有携带有效证书,导致返回400。
解决: 确认你的密钥库格式,JKS格式就改成KeyStore.getInstance("JKS"),PKCS12就确保文件是.p12/.pfx后缀的。
2. Content-Type与SOAP版本不匹配
你给HttpClient设置的Content-Type是application/soap+xml; charset=utf-8,这是SOAP 1.2的标准内容类型。如果服务器仅支持SOAP 1.1,会因为内容类型不识别返回400。
解决: 改成SOAP 1.1的Content-Type试试:text/xml; charset=utf-8
3. RemoveSoapHeadersInterceptor可能移除必要头
HttpComponentsMessageSender.RemoveSoapHeadersInterceptor会移除一些自动生成的SOAP相关HTTP头,比如Content-Length或者服务器依赖的其他头,导致请求格式不符合服务器要求。
解决: 暂时注释掉这个拦截器,重新调用看看是否恢复正常。
4. 确保日志能完整打印请求内容
虽然你配置了SoapLoggingInterceptor,但要确认它真的输出了完整的HTTP请求头和XML信封。有时候肉眼检查的请求和实际发送的会有差异,比如编码问题、命名空间缺失、XML格式错误(比如未闭合标签),这些都可能导致服务器返回400。
5. 检查SSLContext是否有效加载
日志里打印了alias和证书,但要确认这些证书是服务器认可的客户端证书。如果加载密钥库时出现异常(比如密码错误),代码会返回默认SSLContext,此时客户端没有携带服务器要求的证书,部分服务器会用400而不是403来响应。
可以在createDefaultSSLContext()方法里加日志,确认是否走到了默认分支。
内容的提问来源于stack exchange,提问作者Douglas Rezende

