Как технически правильная, но довольно бесполезная альтернатива:
TLS фактически определяет «анонимные» методы обмена ключами DH_anon и ECDH_anon (и шифровальные комплекты, использующие их), которые выполняют согласование прямого секретного ключа с использованием эфемерных пар ключей и не требуют аутентификации, поэтому не требуют любой сертификат или хранилище ключей на сервере или (потенциально) хранилище доверенных сертификатов на клиенте.
Будучи не прошедшими проверку подлинности, они легко уязвимы для активных атак, и поэтому люди (и власти), которые действительно хотят безопасности, считают их неприемлемыми для использования. Java (JSSE) действительно реализует их, но не включает их по умолчанию; Ваш код должен вызвать .setEnabledCiphers
с соответствующим измененным или заданным списком. Большинство других реализаций SSL / TLS либо отключают их аналогичным образом, либо вообще не реализуют.
Но технически это правильный способ создания TLS без долгосрочных ключей и сертификатов и, следовательно, без ручных усилий по их администрированию.
Кроме того, я верю , поэтому создание (SSLContext
и) SSLSocketFactory
с (KeyManager
для) хранилища ключей, не связанного с действительным privateKeyEntry, не выдает ошибку, потому что в принципе он может создавать сокеты (или механизмы), используемые для анонимных соединений. Вместо этого, поскольку на практике анонимный обмен ключами никогда не используется, эти фабрики приводят к сбоям всех последующих соединений, как это бывает у многих неопытных программистов с проблемами диагностики. (Напротив, попытка создать валидатор для пустого хранилища доверенных сертификатов выдает определенное исключение, что-то вроде «набор привязок доверия не должен быть пустым».)