Domino托管Bean连接支付网关遇SSL握手失败问题求助
你遇到的javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure错误,核心原因确实是支付网关强制要求TLS1.2,但Domino服务器默认的SSL配置或JVM协议优先级没有跟上。结合你的环境,我给你以下具体解决方案:
一、调整Domino服务器的NOTES.INI参数
你已经设置了部分参数,但还需要补充TLS1.2的启用配置,确保服务器强制使用TLS1.2:
- 添加/修改以下参数:
DISABLE_SSLV3=1 SSL_DISABLE_TLS_10=1 SSL_DISABLE_TLS_11=1 SSL_ENABLE_TLS_12=1 - 更新
SSLCipherSpec为TLS1.2兼容的加密套件,比如:SSLCipherSpec=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:TLS_RSA_WITH_AES_128_GCM_SHA256:TLS_RSA_WITH_AES_256_GCM_SHA384
注意:修改NOTES.INI后必须重启Domino服务器,否则配置不会生效。重启后可以在服务器控制台执行
show config SSL_*命令,确认所有参数已正确加载。
二、在Java代码中显式指定TLS1.2协议
有时候Domino的JVM不会自动协商到TLS1.2,需要在代码中强制指定。你可以修改HttpURLConnection的配置,两种方式任选一种:
方式1:设置请求属性
在connection.setRequestMethod("POST");之后添加:
connection.setRequestProperty("https.protocols", "TLSv1.2");
方式2:直接配置SSLContext
如果方式1无效,尝试显式创建TLS1.2的SSLContext并绑定到连接:
URL url = new URL("https://host/endpoint"); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); // 初始化TLS1.2上下文 SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); sslContext.init(null, null, new SecureRandom()); connection.setSSLSocketFactory(sslContext.getSocketFactory()); // 后续的请求配置保持不变 connection.setRequestMethod("POST"); connection.setAllowUserInteraction(false); connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false); connection.setRequestProperty("Content-type", "text/xml"); connection.setRequestProperty("Content-length", Integer.toString(postContent.length())); DataOutputStream out = new DataOutputStream(connection.getOutputStream()); out.writeBytes(postContent); out.flush(); out.close(); connection.disconnect();
三、验证Domino JVM的TLS支持
如果上述配置仍无效,可能是服务器JVM的TLS1.2支持存在问题。你可以在托管Bean中添加一段测试代码,打印当前JVM支持的SSL协议:
import javax.net.ssl.SSLContext; import java.util.Arrays; // 测试代码片段 SSLContext defaultContext = SSLContext.getDefault(); String[] supportedProtocols = defaultContext.getDefaultSSLParameters().getProtocols(); System.out.println("JVM支持的SSL协议:" + Arrays.toString(supportedProtocols));
如果输出中没有TLSv1.2,说明需要升级Domino服务器的JVM补丁(比如升级到更高的Fix Pack或Interim Fix),不过Domino 9.0.1FP6的IBM JVM理论上已经支持TLS1.2,大概率是配置问题。
为什么客户端运行正常?
你的Notes客户端是9.0.1FP10IF3,比服务器的FP6版本更高,其默认JVM配置已经启用了TLS1.2,所以能正常和网关通信。服务器版本较低,需要手动强制开启TLS1.2支持。
内容的提问来源于stack exchange,提问作者Terry Boyd

