#java #spring #spring-cloud
Вопрос:
Наш шлюз spring cloud настроен как сервер ресурсов для проверки токенов в keycloak и контроля доступа, наш экземпляр keycloak работает по протоколу https (для подключения ldap), и когда я пытаюсь отправить запрос на шлюз с токеном, я получаю ошибку: «Вызвано: javax.net.ssl.SSLHandshakeException: Нет альтернативных имен субъектов».
Какие параметры у меня есть, чтобы отключить проверку сертификатов и альтернативных имен субъектов во время разработки для проверки подлинности с помощью ключа? Спасибо за любые рекомендации.
Комментарии:
1. похоже, ваше приложение spring boot пытается проверить имя хоста в ssl — сертификате keycloak и терпит неудачу. Вы можете попробовать отключить проверку имени хоста, используя что-то вроде
HttpsURLConnection.setDefaultHostnameVerifier(new rg.apache.http.conn.ssl.NoopHostnameVerifier());
в@Configuration
классе.2. @httPants это не работает для меня 🙁 Я пробую HostnameVerifier allHostsValid = новый HostnameVerifier() { публичная логическая проверка(строковое имя хоста, сеанс SSLSession) { возвращает true; } }; HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); Но в любом случае получаю ошибку
Ответ №1:
Ладно,я забыл об этой проблеме, но теперь у меня есть простое решение. Похоже, что это только решение для разработчиков.
@Configuration @Slf4j @ConditionalOnProperty("spring.security.oauth2.resourceserver.jwt.jwk-set-uri") public class SslResolverConfig { @Value("${spring.security.oauth2.resourceserver.jwt.jwk-set-uri}") private String issuerUri; @Bean public ReactiveJwtDecoder reactiveJwtDecoder() { log.debug("ISSUE uri {}", issuerUri); var jvmBlockingResolver = createHttpClient(); var connector = new ReactorClientHttpConnector(jvmBlockingResolver); var webClient = WebClient .builder() .clientConnector(connector) .build(); return NimbusReactiveJwtDecoder .withJwkSetUri(issuerUri) .webClient(webClient) .build(); } @SneakyThrows public HttpClient createHttpClient() { TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(X509Certificate[] certs, String authType) { } public void checkServerTrusted(X509Certificate[] certs, String authType) { } } }; SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); SslContext sslContext = SslContextBuilder .forClient() .trustManager(InsecureTrustManagerFactory.INSTANCE) .build(); return HttpClient.create() .secure(t -gt; t.sslContext(sslContext)) .wiretap("LoggingFilter", LogLevel.INFO, AdvancedByteBufFormat.TEXTUAL); } }