JavaMail: возможен ли TLS на порту 25 с отдельным хранилищем доверенных сертификатов? - PullRequest
2 голосов
/ 03 декабря 2010

Я пытаюсь отправить почту с использованием 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, который используется только тогда, когда небезопасное соединение становится безопасным?

Ответы [ 2 ]

0 голосов
/ 30 мая 2012

Упс .. нашел его .. есть два свойства socketFactory, которые можно передать ... одно для SSL, другое для не-ssl-фабрик ..

0 голосов
/ 01 марта 2011

Запустите ваше приложение с -Djavax.net.ssl.trustStore = ...

Тогда это будет иметь отношение только к вашему java-приложению и никаких других системных свойств.

...