Мне нужен простой встроенный HTTPS-сервер (предпочтительно com.sun.net.httpserver.HttpsServer
), который прослушивает несколько интерфейсов и использует правильный сертификат для каждого интерфейса.
К счастью, IP-адрес каждого интерфейса соответствует уникальному имени DNS.Другими словами, обратный поиск DNS возвращает правильный CN для используемого сертификата, и SNI (указание имени сервера) не требуется.
На первом шаге I следовал за этим ответом , чтобы включитьсервер HTTPS в мое приложение.Мои сертификаты подписаны с использованием цепочки из двух промежуточных ЦС и последнего корневого ЦС.Например, цепочка доверия выглядит как
certForInterfaceA --\
+-- intermediateCA1 -- intermediateCA2 -- rootCA
certForInterfaceB --/
Все работает нормально, если я изменяю свой код так, чтобы сервер HTTPS слушал только определенный интерфейс, и если я исключительно помещал соответствующий сертификат (вместе с его закрытым ключом)и цепочку) в хранилище ключей в виде одной записи PrivateKey
.
Я надеялся, что все будет работать, если HTTPS-сервер будет прослушивать подстановочный адрес и если в хранилище ключей будет две записи PrivateKey
, одна длякаждый интерфейс.Я надеялся, что библиотека Java сама определит, какой правильный сертификат должен быть отправлен клиенту в зависимости от запроса.
К сожалению, тесты показывают ненадежное и непредсказуемое поведение.Кажется, что библиотека выбирает один из ключей случайным образом.Например, я получаю ошибку сертификата из-за несоответствия имени в половине случаев.
Я попытался посмотреть Справочник по Java для javax.net.ssl
и Руководство по безопасности Java и выяснить, что я могу пропустить.Я подумал, что должен быть способ подключиться к библиотеке, чтобы предоставить правильный ключ во время установления сеанса SSL.Но я был потерян.Я даже не понимал, как отдельные классы (HttpsServer
, SSLContext
, SSLSession
, TrustManager
, KeyManager
) взаимодействуют друг с другом и каково правильное место для выбора правильного сертификата в зависимости от запроса.Весь документ - это такой стиль "завод-изготовитель-для-провайдера, который дает вам стратегию-для-фабрики-для-вашего-объекта", который я не понимаю.