java - handshake_failure 用于启用 2 路 SSL 的端点
问题描述
我一直在尝试连接到启用 2 路 SSL 的服务端点。我正在使用 Spring resttemplate。我已在密钥库中添加了证书,但出现以下错误:
>org.springframework.web.client.ResourceAccessException: I/O error on POST request for "path":Received fatal alert: handshake_failure; nested exception is javax.net.ssl.SSLException: Received fatal alert: handshake_failure
I enabled the SSL debus logs and in the logs I can see the warning as well:
<BEA-000000> <Warning: no suitable certificate found - continuing without client authentication>
相同的代码在我的 DEV 服务器上使用相同的实现可以正常工作,但不能在 UAT 服务器上工作,但在 UAT 服务器上,同一端点上的 REST 调用工作正常(这也是启用了 2 路 SSL)。下面是我用于 SOAP 和 REST 调用的代码:REST:
ObjectMapper mapper = new ObjectMapper();
ServReqRespLogMgr reqRespLogMgr = (ServReqRespLogMgr)UtilityMgr.getBean("servReqRespLogMgr");
SSLContext sc = SSLContext.getInstance(StringUtils.trimToEmpty(PropertyUtil.getProperty("SSL_CONTEXT")));
PasswordEncryptor pe = new PasswordEncryptor();
KeyManagerFactory factory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(new FileInputStream(PropertyUtil.getProperty("JKS_LOC_VALUE")), pe.decrypt(PropertyUtil.getProperty(IConstants.JKS_PWD_VALUE)).toCharArray());
factory.init(keyStore, pe.decrypt(PropertyUtil.getProperty(IConstants.JKS_PWD_VALUE)).toCharArray());
sc.init(factory.getKeyManagers(), null, null);
CloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sc).build();
ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
RestTemplate restTemplate = new RestTemplate(requestFactory);
HttpHeaders headers = new HttpHeaders();
肥皂:
BindingProvider bindingProvider = (BindingProvider) services;
bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, filenetWsUrl);
Map<String, List<String>> headers = new HashMap<String, List<String>>();
headers.put("X-APPCERT", Arrays.asList(StringUtils.trimToEmpty(PropertyUtil.getProperty("FILENET_APP_CERT"))));
bindingProvider.getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS,headers);
bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, filenetWsUrl);
SSLContext sc = SSLContext.getInstance(StringUtils.trimToEmpty(PropertyUtil.getProperty("SSL_CONTEXT")));
KeyManagerFactory factory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(new FileInputStream(PropertyUtil.getProperty("JKS_LOC_VALUE")), jksPwd);
factory.init(keyStore, jksPwd);
sc.init(factory.getKeyManagers(), null, null);
//sc.init(factory.getKeyManagers(), null, null);
//End Trust Store
((BindingProvider) services).getRequestContext().put(JAXWSProperties.SSL_SOCKET_FACTORY, sc.getSocketFactory());
我检查了看起来不错的密钥库文件的权限。如果我切换到一种方式的 SSL 端点,那么它也可以正常工作。我的 Java 运行时间是 1.8.0_144,我的应用服务器是 WebLogic 12.2.1.3。
任何人都可以帮我解决这个问题吗?
解决方案
以下是您必须检查的几件事。
- 检查您的证书链是否已正确创建。
- 将您的证书添加到 CACERTS 文件并配置 weblogic 以指向 CACERTS 文件。
这绝对可以解决您的问题。
推荐阅读
- r - 使用 tidyr 的 pivot_wider 从长到宽
- flutter - Flutter:我可以通过提供者更改状态栏颜色吗?
- excel - SAS中每列分为子列时如何导入excel文件
- python - 熊猫和重复日期的麻烦
- node.js - SyntaxError:我的模型中 JSON 输入意外结束
- javascript - 如何使用正确的生命周期使用来改进这个 React 组件?
- html - 在之前的 div 的右侧动态添加 X 个 div 并水平(而不是垂直)展开页面
- angular - 在角度模板(.html 文件)中使用 window.location.href 会出错
- javascript - 尝试在 for 循环中运行 jQuery.clone() 以附加元素 x 次,但获得的输出超出预期
- c++ - 如何将函数的返回值分配给c ++中的变量?