Как java проверить сертификат и почему я получаю SSLHandshakeException - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь вызвать API, используя RestTemplte из службы на сервере A и другой службы на сервере B, и я получаю ошибку ниже:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Даже когда я добавил эту конфигурацию (код ниже ) в шаблоне rest все та же проблема.

SSLContext sslContext = new SSLContextBuilder()
                .loadTrustMaterial(new File(keystore), trustStorePassword.toCharArray())
                .build();
        SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext);
        HttpClient httpClient = HttpClients.custom()
                .setSSLSocketFactory(socketFactory)
                .build();
        HttpComponentsClientHttpRequestFactory factory =
                new HttpComponentsClientHttpRequestFactory(httpClient);
        RestTemplate restTemplate = new RestTemplate(factory);

решение, которое я нашел на net, состоит в том, чтобы экспортировать сертификат из chrome и добавить его в доверенный сертификат JVM. Я не знаю, является ли это правильным решением, потому что мы можем изменить этот сертификат каждые 3 месяца, например ..

И у меня есть еще несколько вопросов:

  • JVM знает все центры сертификации (я думаю, что есть миллиард ..), например, когда я звоню в Google с помощью rest, сертификат будет проверен JVM с использованием «security / cacerts»?

  • Должен ли я добавить наш сертификат в доверенные сертификаты JVM для исправления sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target?

  • Процесс проверки не автоматизирован c по механизму SSL?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Процесс проверки полностью автоматизирован c, и он отклоняет ваш сертификат, потому что ничего о нем не знает. Это ненадежно.

У вас есть два варианта:

  1. Доверять всем сертификатам.
  2. Добавить сертификат сервера в доверенное хранилище ключей.

Доверять всем сертификатам См. «Вариант 2» здесь

Добавить сертификат сервера в доверенное хранилище ключей. Загрузить сертификат:

openssl s_client -connect SERVER_URL:SERVER_PORT 2>/dev/null </dev/null | \
    sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > server.pem

Добавить сертификат в хранилище ключей

keytool -import -alias your-server-name -file server.pem -keystore certs.jks -keypass CERT_PASSWORD -storepass STORE_PASSWORD

Здесь:

  • your-server-name - дать имя для сертификат в хранилище ключей
  • certs.jks - путь к хранилищу ключей
  • CERT_PASSWORD - укажите пароль для доступа к сертификату и
  • STORE_PASSWORD - пароль для доступа к хранилищу ключей
0 голосов
/ 15 января 2020

Как вы узнали сами, jvm в настоящее время не доверяет сертификату вашего удаленного сервера. Чтобы решить эту проблему, вы должны сконфигурировать ваше хранилище доверия для доверия этому удаленному серверу.

Вы действительно можете добавить прямой сертификат удаленного сервера, это должно решить вашу проблему.

Но, как вы заявили, что сертификат может быть недолгим. Вместо этого вы должны добавить сертификат из ваших центров сертификации. Это должно быть доступно в цепочке ключей, представленной в chrome.

К сожалению, если вы используете самозаверяющий сертификат, центры сертификации отсутствуют, и будет доступно только первое решение.

...