Проверка подлинности почты 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
Цитируемый текст со ссылочного сайта:
В: При подключении к моему почтовому серверу через SSL я получаю исключение, например "невозможно найти действительный путь сертификации для запрашиваемой цели".
A: Ваш сервер, вероятно, использует тестовый сертификат или самозаверяющий сертификат вместо сертификата, подписанного коммерческим центром сертификации. Вам нужно будет установить сертификат сервера в хранилище доверенных сертификатов. Программа InstallCert поможет.
Кроме того, вы можете установить в свойстве mail.protocol.ssl.trust имя хоста вашего почтового сервера. Посмотрите javadocs для пакетов поставщика протокола для деталей.
Другие распространенные причины этой проблемы:
- Там брандмауэр или антивирусная программа перехватывает ваш запрос.
- В вашей установке JDK что-то не так, что он не может найти сертификаты для доверенных центров сертификации.
- Вы работаете на сервере приложений, который переопределил список доверенных центров сертификации JDK.