Я установил javax.net.ssl.trustStoreType=Windows-ROOT, который, как я понимаю, должен разрешить Java использовать сертификаты, установленные в Windows.
Клиент создается с помощью этого метода:
Код: Выделить всё
static CloseableHttpClient getClientWindowsTrust() throws Exception {
System.setProperty("javax.net.ssl.trustStoreType", "Windows-ROOT");
SSLContext sslContext = SSLContext.getDefault();
DefaultClientTlsStrategy strat = new DefaultClientTlsStrategy(sslContext);
var connectionManager = PoolingHttpClientConnectionManagerBuilder.create()
.setTlsSocketStrategy(strat)
.build();
return HttpClients.custom()
.setConnectionManager(connectionManager)
.build();
}
Сообщение об ошибке:
Код: Выделить всё
TransportContext.java:363|Fatal (CERTIFICATE_UNKNOWN): PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
ОБНОВЛЕНИЕ
спасибо ответившим. Я попробовал все предложения, но безрезультатно. Затем я сосредоточился больше на сервере, поскольку перепробовал все, что мог придумать, на стороне клиента.
Сервер недавно получил новый промежуточный сертификат, и клиент не нашел его. Я попробовал другой сервер, на котором уже есть новый сертификат, и он сработал. Разница в том, что сервер 1 — это сервер Windows с Apache и Tomcat, а сервер 2 — контейнерный сервер.
В настоящий момент я предполагаю, что при установке Windows возникла проблема с конфигурацией. Я установил новый сертификат на другой сервер Windows, который раньше работал, а теперь он не работает.
Я опубликую еще одно обновление, когда получу дополнительную информацию.
Проблема решена
Это не проблема клиента. Сертификат был установлен на сервере коллегой, который забыл обновить конфигурацию Apache. Конфигурация по-прежнему ссылалась на старый промежуточный сертификат, и это вызывало проблему.