Я использую собственный частный центр сертификации и хочу установить связь между двумя службами, обе из которых используют собственный сертификат. Тем не менее, я получаю сообщение об ошибке, которое не понимаю
Итак, для обеих служб я настроил склад доверенных сертификатов с частным центром сертификации и отдельным хранилищем ключей с сертификатом, который он идентифицирует как. Переход к простому / привет маршруту в браузере показывает, что соединение является безопасным (т.е. издатель известен, а общее имя допустимо). Это то же самое, когда я curl -iv https://{address}
, он говорит, что рукопожатие прошло, сказав, что «SSL сертификат проверен нормально» и что домен соответствует имени подстановочного знака в сертификате.
Однако, когда я пытаюсь выполнить простой запрос GET из отдельного сервиса, который настроен точно так же, я получаю сообщение об ошибке, указанное в заголовке. Проблема в том, что он говорит, что сертификат для службы, с которой я пытаюсь связаться, не может сопоставить ни одно из альтернативных имен субъекта в его сертификате с доменом, на котором он зарегистрирован. Но это абсолютно неверно, единственное отличие состоит в том, что он использует подстановочный знак. Это работает из браузера И команды curl, которая отлаживает рукопожатие. Это просто не из моего загрузочного кода Java / Spring на отдельном микросервисе.
Работает ли Java по-разному в более строгой форме, что означает, что она не любит связываться с серверами с подстановочными сертификатами?
РЕДАКТИРОВАТЬ: добавление строки, показанной ниже, исправляет это, поэтому происходит сбой при проверке имени хостав Java (но не в браузере или отладке с помощью curl). Это небезопасно, так что это НЕ РЕШЕНИЕ.
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(truststore, null).build();
HostnameVerifier hostnameVerifier = new NoopHostnameVerifier(); // I added this line, but it's advised against as it's insecure
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
РЕДАКТИРОВАТЬ 2: Classic StackOverflow, принижая меня за обращение за помощью. Я собирался оставить это, потому что это может помочь другим, но думаю, что я не могу сейчас.