SSL-разрешить только определенным клиентам или серверам (Java truststore)
Если хранилище доверия должно содержать только корневые сертификаты ЦС (что, по-видимому, рекомендуется из того, что я прочитал), как можно ограничить доступ к определенным сторонам (а не к любой стороне, проверенной ЦС в хранилище доверия).
Подробнее:
У меня есть два java-приложения-назовем их A и B-которые используют SSL для защиты коммуникаций. A и B имеют клиентскую и серверную части для отправки (клиент) и получения (сервер) сообщений. Клиент использует ключ, хранящийся в клиент.keystore, сервер использует ключ в сервере.keystore, и оба используют одно хранилище доверия для проверки подлинности другого приложения (например, приложение A имеет 3 хранилища ключей, приложение B имеет 3 хранилища ключей).
До сих пор я использовал keytools для генерации ключей для клиента и сервера, подписывал их (с помощью моего собственного тестового центра сертификации) и загружал подписанные сертификаты обратно в хранилище ключей. Я делаю это для приложения A и B. Для того чтобы получить SSL-подтверждения для завершения, я обнаружил, что хранилища доверенных сертификатов должны содержать ка сертификат, используемый для подписи ключей других приложений (поэтому truststore для приложения A должен содержать сертификат CA, используемый для подписи клиентских и серверных ключей приложения B, и наоборот).
Пока это имеет смысл, но поскольку хранилище доверия содержит сертификат корневого ЦС, я могу сгенерировать другой набор ключей, подписать их с тем же ЦС и принять их другим приложением - другими словами, приложение B примет агент-мошенник, который выглядит как приложение A, если у него есть ключи, подписанные корневым ЦС. ОКОЛО
Есть ли у SSL механизм, чтобы предотвратить это? Я попытался импортировать открытые ключи для клиента и сервера приложения A в хранилище доверия приложения B (и наоборот), но без корневого сертификата SSL-рукопожатие не завершится.
1 ответ:
Есть ли у SSL механизм, чтобы предотвратить это?
Нет. SSL обеспечивает конфиденциальность, целостность и аутентификацию. Пэры-это те, за кого они себя выдают. То, о чем вы говорите, - это авторизация: является ли этот пиринг тем пирингом, с которым я хочу поговорить? Это ответственность приложения. Вы можете получить доступ к цепочке сертификатов однорангового узла через
SSLSocket.getSession()
и изучить ее во время рукопожатия черезHandshakeCompletedListener
, чтобы авторизовать одноранговый узел. Если он вам не нравится, просто закройте розетку. Больше ничего не может случиться на земле. соединение.