Вы можете создать самозаверяющий сертификат динамически, используя библиотеку, такую как BouncyCastle (по сути, для сертификата для самоподписания вы используете тот же DN эмитента, что и DN субъекта, и вы подписываете сзакрытый ключ, соответствующий открытому ключу сертификата).Затем вам нужно поместить его в KeyStore
(по крайней мере, в памяти, необязательно в файл) и собрать из него SSLContext
, чтобы иметь возможность построить SSLSocketFactory
.
Это может быть полезно для тестирования, но это не сделает ваше приложение безопасным .Вообще говоря, шифрование без аутентификации удаленной стороны небезопасно.Вы можете обмениваться информацией так же «тайно», как и с удаленной стороной, но если вы не проверили ее личность, вы не уверены, что ваши секреты переданы предполагаемому получателю.
Если ваш сертификатгенерируемый динамически, вам нужно будет найти способ, чтобы клиент узнал, что это действительно законный сертификат, прежде чем делать какие-либо вызовы на этот сервер.
Общий подход SSH (где предполагается, что мало кто на самом деле проверяет отпечатки пальцев, которые ониустановление первого соединения - некоторые люди действительно проверяют вне группы) - это компромисс, при котором клиенты, как правило, принимают ключ (более или менее вслепую) в первый раз, но будут предупреждены, если он изменился.Вы также можете реализовать такой подход для обработки доверия сертификатов X.509, но если вы будете заново генерировать новый самозаверяющий сертификат каждый раз при перезапуске сервера, вы вернетесь к первоначальной проблеме.
Вы можете решить эту проблему, имея своего рода онлайн / динамический ЦС, где серверы будут запрашивать и выдавать сертификат динамически на основе чего-то, что они могут динамически доказать этому ЦС (чтобы доказать, что это один из ваших серверов, возможно, на основенекоторый параметр конфигурации, известный обоим), а затем клиент доверяет этому ЦС, но это более сложный сценарий.