сервер ресурсов spring oauth2: отключить проверку ssl

#spring #ssl

Вопрос:

У меня есть служба spring oauth2, и в тот момент, когда служба пытается создать компонент jwtDecoderByIssuerUri , он терпит неудачу из-за:

 ...
Caused by: java.lang.IllegalArgumentException: Unable to resolve the Configuration with the provided Issuer of <issuer>
...
Caused by: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "<issuer>": No subject alternative names present; nested exception is javax.net.ssl.SSLHandshakeException: No subject alternative names present
 

Эта ошибка появляется после того, как я уже отключил проверку ssl, выполнив следующие действия:

 public final class SSLUtil {

    private static final TrustManager[] UNQUESTIONING_TRUST_MANAGER = 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) {
                }
            }
    };

    public static void turnOffSslChecking() throws NoSuchAlgorithmException, KeyManagementException {
        // Install the all-trusting trust manager
        final SSLContext sc = SSLContext.getInstance("SSL");

        sc.init(null, UNQUESTIONING_TRUST_MANAGER, null);

        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    }

    public static void turnOnSslChecking() throws KeyManagementException, NoSuchAlgorithmException {
        // Return it to the initial state (discovered by reflection, now hardcoded)
        SSLContext.getInstance("SSL").init(null, null, null);
    }

    private SSLUtil() {
        throw new UnsupportedOperationException("Do not instantiate libraries.");
    }
}

 
     @Bean
    JwtDecoder jwtDecoderByIssuerUri(final OAuth2ResourceServerProperties properties) throws KeyManagementException, NoSuchAlgorithmException {
        turnOffSslChecking();

        return JwtDecoders.fromIssuerLocation(properties.getJwt().getIssuerUri());
    }
 

Прежде чем я добавил turnOffSslChecking() ошибку, было:

 ...
Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
...
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
...
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
 

Есть ли способ избежать всей этой проверки ssl?

Ответ №1:

Серверы Oauth2 требуют использования SSL / TLS. (Раздел 2.3.1, который затем ссылается на раздел 1.6 TLS Version спецификации Oauth — https://www.rfc-editor.org/rfc/rfc6749 ) Вам лучше решить исходную проблему, а не отключать SSL.

Ваша первоначальная проблема связана с тем, что вам необходимо установить открытый ключ сертификатов в хранилище доверия вместо создания полностью доверяющего TrustManager. Вы не указываете, но я предполагаю, что вы используете самозаверяющие сертификаты с хранилищем доверия java по умолчанию. Если это так, шаги в этой статье должны решить проблему. https://medium.com/expedia-group-tech/how-to-import-public-certificates-into-javas-truststore-from-a-browser-a35e49a806dc

Если я сделал неверное предположение, пожалуйста, опубликуйте дополнительную информацию.