Проверка подлинности почты TLS Java

Я пытаюсь понять основы Java Mail API и TLS. У меня есть следующий сценарий:

Существует сервер STMP, который использует TLS & SSL. Если я войду на этот сервер с каким-либо клиентом, я могу отправлять проверенные и проверенные электронные письма без каких-либо проблем.

Затем я пытаюсь запустить веб-сервер на другом компьютере, который отправляет почту, используя ранее упомянутый SMTP-сервер. Я все еще хочу отправлять электронные письма TLS & SSL, однако независимо от того, как я настраиваю свойства запуска, я получаю следующую хорошо известную ошибку:

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

Я нашел много людей, имеющих подобные проблемы, однако мой вопрос заключается в следующем:

Учитывая ранее описанный сценарий, нужно ли мне получать какой-либо сертификат на веб-сервер (возможно, где-то в JRE) или он должен просто работать нормально, поскольку на почтовом сервере уже работает этот механизм сертификатов и аутентификации. Разве нельзя использовать сертификат SMTP-сервера? В любом случае, если мне нужно установить сертификат на машину, которая использует сервер STMP, как я могу получить этот сертификат?

Я довольно новичок в JavaMail API, и я видел много статей по этому поводу, но я не смог найти черно-белый ответ на мой вопрос.

2 ответа

Решение

Ваш клиент (то есть в вашем случае тот, который работает на веб-сервере) должен проверить SSL-сертификат почтового сервера. Кажется, что ваше хранилище доверенных сертификатов Java не содержит этот сертификат.

Поэтому вам нужно либо поместить этот сертификат в хранилище доверенных сертификатов по умолчанию вашего JRE (что я бы не рекомендовал), либо определить другое хранилище доверенных сертификатов для вашего приложения (которое, конечно, должно содержать сертификат почтовых серверов). Для этого установите этот параметр VM: Djavax.net.ssl.trustStore=<path-to-truststore>

Редактировать: Ах, я пропустил некоторую часть вашего вопроса. Чтобы получить сертификат почтового сервера, используйте что-то вроде openssl. См. Например: https://serverfault.com/questions/139728/how-to-download-ssl-certificate-from-a-website

Ответ в FAQ по JavaMail.

Цитируемый текст со ссылочного сайта:

В: При подключении к моему почтовому серверу через SSL я получаю исключение, например "невозможно найти действительный путь сертификации для запрашиваемой цели".

A: Ваш сервер, вероятно, использует тестовый сертификат или самозаверяющий сертификат вместо сертификата, подписанного коммерческим центром сертификации. Вам нужно будет установить сертификат сервера в хранилище доверенных сертификатов. Программа InstallCert поможет.

Кроме того, вы можете установить в свойстве mail.protocol.ssl.trust имя хоста вашего почтового сервера. Посмотрите javadocs для пакетов поставщика протокола для деталей.

Другие распространенные причины этой проблемы:

  • Там брандмауэр или антивирусная программа перехватывает ваш запрос.
  • В вашей установке JDK что-то не так, что он не может найти сертификаты для доверенных центров сертификации.
  • Вы работаете на сервере приложений, который переопределил список доверенных центров сертификации JDK.
Другие вопросы по тегам