Использование простого списка Java HttpsServer на нескольких интерфейсах с индивидуальными сертификатами на интерфейс - PullRequest
0 голосов
/ 13 ноября 2018

Мне нужен простой встроенный 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) взаимодействуют друг с другом и каково правильное место для выбора правильного сертификата в зависимости от запроса.Весь документ - это такой стиль "завод-изготовитель-для-провайдера, который дает вам стратегию-для-фабрики-для-вашего-объекта", который я не понимаю.

...