Сервер ресурсов Spring cloud gateway: альтернативные имена субъектов отсутствуют

#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);  } }