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