Java:在 Spring Boot 中连接到服务时出现 SSLHandshake 异常



我正在研究Apple Pay POC,在这个过程中,我试图使用一个休息服务,但很难通过Java代码连接到该服务器。

但是,使用以下 curl 命令可以正常工作。

curl -v --cert publicCert.pem:srk --key privateKey.pem -H Content-type:application/json --request POST --data 
{
"merchantIdentifier": "merchant.com.xxxx.srk-demos",
"displayName": "poc",
"initiative": "web",
"initiativeContext": "srk-demos.xxxx.com"
}
https://apple-pay-gateway-cert.apple.com/paymentservices/startSession

我得到的只是一个merchant.p12文件,我从中提取了 pem 格式的私钥和公共证书。私钥的密码与p12文件相同,在这种情况下是srk

我正在使用带有RestTemplate的 Spring Boot 来使用该服务。将mic.p12直接导入 jks。 并且,将jks放入我的弹簧启动应用程序的resources文件夹中。

并按照 Sasha Shpota 针对这个相关 StackOverflow 问题的方法中的建议通过代码加载这个 jks,但它在我的情况下也不起作用。

对此的任何想法或指示不胜感激。我可以使用java.lang.Runtime类调用上述工作curl命令,但我相信这不是有效的 java 方法。

我正在使用 OpenJDK8

我关注了这篇文章,它对我有用。

创建了已获取私钥 + 公共证书的身份存储和包含服务器证书的信任存储。

我以前错过了什么? 尝试使用以下代码片段加载 p12 文件

try(CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(yourLoadSSLFunction()).build()){
}

不应该包含在尝试资源中,而应该像这样使用

CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(yourLoadSSLFunction()).build()
RestTemplate restTemplate = new RestTemplate();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
restTemplate.setRequestFactory(requestFactory);

最新更新