У меня есть обычный вариант использования, когда мне нужно аутентифицировать обычного клиента на моем java smtp-сервере, чтобы клиент отправлял почту на мой smtp-сервер. Теперь я хочу включить STARTTLS в этой среде. Я знаю, что об этом написано много, и я все читаю, но все равно что-то мне не нравится. Вот моя проблема:
(И, пожалуйста, поправьте меня, если какая-либо информация ниже неверна)
Для успешного установления связи SSL нам нужны хранилища ключей и доверенные хранилища.
В основном хранилище ключей -> где у нас есть publi c и закрытый ключ и сертификат (в основном способ идентификации)
Truststore -> в основном другое хранилище ключей, но здесь мы храним опубликованные c ключи, известные как сертификаты доверенных лиц.
Теперь, для успешной аутентификации клиента на сервере, я хочу использовать свой самозаверяющий сертификат на сервере. Для этого нам нужно:
Сервер -> должен иметь хранилище ключей (private + publi c key) + truststore (содержащее publi c ключ клиента)
Клиент -> хранилище ключей (содержащее закрытый + publi c ключ клиента) + хранилище доверенных сертификатов (сертификат сервера)
Здесь я запутался, есть ли клиенту также нужно хранилище ключей? или достаточно, чтобы у клиента был только сертификат publi c сервера.
Если все вышеперечисленное до сих пор верно, это проблема, с которой я столкнулся:
У меня есть два отдельных проекта eclipse java. Первый - это сервер со встроенной библиотекой smtp. и второй проект java имеет некоторый почтовый код java для отправки почты на этот smtp-сервер.
Я создал сертификат с помощью keytool. Но вот в чем дело. На стороне сервера я использую это:
private void setSystemPropertiesForSSLConnection() {
System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "debug");
System.setProperty("javax.net.ssl.keyStore", "C:/store/keystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "mypassword");
}
Как видите, я не указываю какое-либо хранилище доверенных сертификатов, хотя выше мы говорим, что мне нужен сертификат publi c клиента, которому можно доверять.
Кроме того, на стороне клиента у меня есть следующий фрагмент кода в части java почты:
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.debug", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", "25000");
Теперь, если это так, как вы можете видеть на моей стороне клиента У меня нет спецификации хранилища ключей или доверенного хранилища, но если я запустил код, письмо будет успешно отправлено с использованием javamail. Но что случилось с хранилищем доверенных сертификатов и хранилищами ключей? ПОЧЕМУ это работает, только когда у меня есть хранилище ключей на стороне сервера. Потому что я не добавил сертификат publi c. сервера или на стороне клиента, как клиент доверяет серверу?