Я пытаюсь отправить почту с использованием JavaMail на порт 25 (без SSL) с использованием TLS, но с собственным хранилищем доверенных сертификатов (поскольку исходное хранилище доверенных сертификатов cacerts не содержит необходимых сертификатов, и я не хочу изменять хранилище доверия по умолчанию Ява).
У меня есть код, который может отправлять почту, используя TLS, используя системное хранилище доверенных сертификатов, установив
mail.smtp.starttls.enable=true
свойство, также, настройка
System.setProperty("javax.net.ssl.trustStore", ...)
, чтобы указать на правильное хранилище доверенных сертификатов, когда соединение становится безопасным, работает. Так как это обычный порт 25, мне не нужно устанавливать какие-либо свойства socketFactory (и реализации). Я могу отправлять почту, используя TLS на порт 25, используя системное хранилище доверенных сертификатов.
Однако ... переключение системных свойств для установки правильного хранилища доверия довольно глупо, особенно на сервере, когда я не знаю, какой другой код хочет отправлять почту, и, возможно, ему нужно использовать системные свойства как ну, в общем: я ищу другое решение, чтобы не изменять системное хранилище доверенных сертификатов (файл cacerts , сделать его копию и изменять копию - это нормально!), а также системные свойства, которые в настоящее время необходимо установить это.
Что я уже пробовал:
Настройка моего собственного SSL socketFactory и использование моего собственного менеджера ключей для загрузки другого хранилища доверенных сертификатов. Это было бы абсолютно идеально, если бы не было необходимости отправлять через порт 25, но вместо этого я уже мог запустить безопасное соединение через порт 465. Однако ... я не могу этого сделать, так как это приводит к исключению сокета, потому что я я пытаюсь безопасно подключиться к почтовому серверу, который не защищен.
Попытка настроить мой socketFactory , но с использованием обычного сокета для реальной связи. По сути, это то же самое, что вообще не использовать мой собственный socketFactory, и заканчивается Java с использованием файла trustStore системы cacerts.
изменение файла cacerts системного хранилища доверенных сертификатов. Это работает, но я не хочу изменять доверенное хранилище системы, у меня могут не быть разрешения на запись или пароль хранилища ключей и т. Д.
изменение системного свойства "javax.net.ssl.trustStore"
, чтобы оно указывало на мой собственный файл склада доверенных сертификатов. Работает хорошо, но я также не хочу изменять системные свойства, потому что мой код работает на сервере, и я не знаю, какой другой код работает там, и ему нужны свойства без изменений. Даже сохранение прежнего состояния и восстановление не защищает другие потоки, использующие это свойство во время его изменения, поэтому мне не очень нравится это решение.
Итак .. короче: кто-нибудь знает решение, как я могу использовать небезопасное соединение с почтовым сервером через порт 25, включить TLS (путем настройки свойства mail), это внутренне защищает соединение и использует мой собственный файл склада доверенных сертификатов без изменений или системных свойств? Может быть, существует аналогичный способ свойств socketFactory, который используется только тогда, когда небезопасное соединение становится безопасным?