Я пытался подключиться к конечной точке службы, в которой включен двусторонний 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 на той же конечной точке работает нормально (что также включает двусторонний SSL). Ниже приведен код, который я использую для вызова SOAP и 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, даже вызов REST не должен работать. Я выполняю вызов REST в той же конечной точке веб-службы с той же аутентификацией, за исключением вызова REST. Я использую HTTP GET.
@Sumit, вы ведь не используете TLSv1? если вы это сделаете, это не будет поддерживаться после Java 7. Возможно, вам придется обновить до последних версий TLS.
Я использую TLSv1.2, а версия Java - 1.8.0_144
Лучшая информация об оповещении с сервера - с сервера. Если вы не можете этого понять, а также, поскольку это, по-видимому, происходит только с 'двусторонним' (клиентская аутентификация), а также, если вы получаете трассировку (с javax.net.debug = ssl или по проводу), и он показывает предупреждение приходит после второго полета клиента (Cert, CKX, CVer, CCS, Finished), то наверное это цепочка сертификатов вашего клиента; посмотрите внимательно, представьте себе множество вещей, которые сервер мог не любит, и начните через них проходить.