2010-12-03 7 views
2

Я пытаюсь отправить почту с использованием JavaMail на порт 25 (без SSL) с использованием TLS, но с моим собственным доверительным магазином (поскольку исходный суперсервер cacerts не содержит необходимые сертификаты, и я не хочу изменять хранилище доверия по умолчанию Ява). У меня есть код, который способен отправить почту с помощью TLS с использованием системы доверенных сертификатов, создав свойствоJavaMail: TLS на порте 25 с отдельным доверительным магазином?

mail.smtp.starttls.enable=true 

, также, установку

System.setProperty("javax.net.ssl.trustStore", ...) 

, чтобы указать правильные доверенные сертификаты, когда соединение работает безопасно. Поскольку обычный порт 25, мне не нужно настраивать свойства (и реализации) socketFactory. Я могу отправлять почту с использованием TLS на 25-м порту, используя систему truststore.

Однако свойства коммутационной системы, позволяющие настроить правильное хранилище доверия, выглядят глупо, особенно на сервере, когда я не знаю, какой другой код хочет отправить почту, и, возможно, необходимо использовать системные свойства а также, в общем: я ищу другое решение, чтобы не изменять систему truststore (файл cacerts, копируя его и модифицируя копию, хотя все равно!), ни системные свойства, необходимые в настоящее время для его настройки.

То, что я уже пробовал:

  • Настройка мой собственный SSL SocketFactory и используя свой собственный менеджер ключей для загрузки других доверенных сертификатов. Это было бы абсолютно безупречно, если бы не было необходимости отправлять на порт 25, но вместо этого я мог уже начать безопасное соединение на порту 465. Однако .. Я не могу этого сделать, и это заканчивается исключением сокета, потому что я Я пытаюсь безопасно подключиться к почтовому серверу, который не защищен.

  • Пытается установить свой собственный socketFactory, но с помощью обычного разъема для фактической связи. Это в основном то же самое, что не использовать мой собственный socketFactory вообще и заканчивается Java, используя файл cacerts trustStore системы.

  • изменение cacerts system truststore file. Это работает, но я не хочу изменять хранилище доверия системы, у меня могут не быть прав на запись или пароль ключа может быть изменен и т. Д.

  • изменение системного имущества "javax.net.ssl.trustStore", чтобы указать на мое собственное доверительное учреждение файл. Работает хорошо, но я не хочу изменять свойства системы, потому что мой код работает на сервере, и я не знаю, что там делает другой код и нуждается в свойствах. Даже сохранение прежнего состояния и восстановление на самом деле не защищают от других потоков, используя это свойство в то время, когда оно было изменено, поэтому мне не очень нравится это решение.

Так .. короче говоря: Кто-нибудь знает решение, как я могу использовать не безопасное подключение к почтовому серверу на порт 25, включите TLS (путем установки свойства почты), это внутренне крепит соединение и использование моего собственного файла доверия, не изменяя cacerts или системное свойство? Может быть, есть аналогичный способ для свойств socketFactory, который используется только тогда, когда безопасное соединение безопасно?

+0

У меня такая же проблема, как вы и я интересно в ответе, который вы нашли для своей проблемы. Вы можете поделиться им? Спасибо, Valentin – 2011-10-07 12:15:15

+0

Посмотрите информацию о пакете com.sun.mail, чтобы увидеть все свойства. В основном вы можете установить «mail.smtp.socketFactory.class» и «mail.smtp.ssl.socketFactory.class», чтобы иметь фабрику для связи SSL и Non-SSL. TLS может быть SSL с самого начала, в моем случае начало было Non-SSL, но переключилось на SSL после того, как связь была настроена. Чтобы иметь возможность делать это для каждого потока, а не только для всей системы, вам нужен только собственный экземпляр свойств, который вы передаете Session.getInstance (Свойства) с соответствующими настройками свойств. – Fuggly 2011-10-13 07:56:32

ответ

0

Упс .. нашел .. есть два SocketFactory свойства, которые могут быть переданы .. один для SSL, другой для не защищенных заводов ..

0

Запуск приложения с помощью -Djavax.net.ssl.trustStore = ...

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