Handshake_failure для конечной точки с двусторонним SSL

Я пытался подключиться к конечной точке службы, в которой включен двусторонний 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.

Кто-нибудь может мне помочь с этим, пожалуйста?

Лучшая информация об оповещении с сервера - с сервера. Если вы не можете этого понять, а также, поскольку это, по-видимому, происходит только с 'двусторонним' (клиентская аутентификация), а также, если вы получаете трассировку (с javax.net.debug = ssl или по проводу), и он показывает предупреждение приходит после второго полета клиента (Cert, CKX, CVer, CCS, Finished), то наверное это цепочка сертификатов вашего клиента; посмотрите внимательно, представьте себе множество вещей, которые сервер мог не любит, и начните через них проходить.

dave_thompson_085 31.07.2018 04:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
245
1

Ответы 1

Вот несколько вещей, которые вам нужно проверить.

  1. Проверьте, правильно ли создана ваша цепочка сертификатов.
  2. Добавьте свои сертификаты в файл CACERTS и настройте weblogic так, чтобы он указывал на файл CACERTS.

Это определенно должно решить вашу проблему.

Это было первое, что я попробовал, но безуспешно. Кроме того, в случае возникновения каких-либо проблем с CACERTS, даже вызов REST не должен работать. Я выполняю вызов REST в той же конечной точке веб-службы с той же аутентификацией, за исключением вызова REST. Я использую HTTP GET.

Sumit 30.07.2018 22:55

@Sumit, вы ведь не используете TLSv1? если вы это сделаете, это не будет поддерживаться после Java 7. Возможно, вам придется обновить до последних версий TLS.

DBANerd 30.07.2018 23:07

Я использую TLSv1.2, а версия Java - 1.8.0_144

Sumit 30.07.2018 23:18

Другие вопросы по теме