Как отключить проверку сертификатов SSL с помощью Spring RestTemplate?

Я пытаюсь написать интеграционный тест, в котором наш тест запускает встроенный HTTPS-сервер с помощью Simple. Я создал само- подписанный сертификат с использованием keytool, и я могу получить доступ к серверу с помощью браузера (в частности, Chrome, и я получаю предупреждение о самозаверяющем сертификате).

Однако, когда я пытаюсь подключиться с помощью Spring RestTemplate, я получаю ResourceAccessException:

org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://localhost:8088":sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:557)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:502)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:444)
    at net.initech.DummySslServer.shouldConnect(DummySslServer.java:119)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1917)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:301)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:295)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1369)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:156)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:925)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:860)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1043)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1343)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1371)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1355)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)
    at org.springframework.http.client.SimpleBufferingClientHttpRequest.executeInternal(SimpleBufferingClientHttpRequest.java:78)
    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
    at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:52)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:541)
    ... 33 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
    at sun.security.validator.Validator.validate(Validator.java:260)
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1351)
    ... 47 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:145)
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131)
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
    ... 53 more

Из других вопросов и блог posts Я видел совет заменить HostnameVerifier на что-то вроде

private static final HostnameVerifier PROMISCUOUS_VERIFIER = ( s, sslSession ) -> true;

И я установил его как глобально, так и на самом RestTemplate:

HttpsURLConnection.setDefaultHostnameVerifier( PROMISCUOUS_VERIFIER );

... и на самом RestTemplate:

final RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory( new SimpleClientHttpRequestFactory() {
    @Override
    protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
        if(connection instanceof HttpsURLConnection ){
            ((HttpsURLConnection) connection).setHostnameVerifier(PROMISCUOUS_VERIFIER);
        }
        super.prepareConnection(connection, httpMethod);
    }
});

Тем не менее, я все еще получаю указанную выше ошибку. Как я могу это обойти?

  1. Установка сертификата локально вне модульного теста не вариант, так как в этом случае его нужно будет устанавливать вручную на каждую машину разработчика и сервер сборки, что вызовет лавину красного цвета. Лента.
  2. Нам нужен SSL, поскольку мы тестируем библиотеку, которая находится поверх RestTemplate, и мы правильно ее настраиваем.

Я использую Java 8 (но могу использовать 7) и Spring 4.0.3.


person Sled    schedule 06.05.2014    source источник
comment
Вам нужно будет вручную настроить HTTP-коннектор, который использует шаблон.   -  person chrylis -cautiouslyoptimistic-    schedule 07.05.2014
comment
@chrylis Я не вижу класса с именем HttpConnector ни в Java SDK, ни в Springs JavaDoc. Какой класс вы имели в виду конкретно?   -  person Sled    schedule 07.05.2014
comment
Вы проверяли мой ответ [здесь] [1]. У меня это работает. [1]: stackoverflow.com/questions/18476073/   -  person nilesh    schedule 10.05.2014
comment
См. Также stackoverflow.com/questions/859111/   -  person Raedwald    schedule 09.10.2014
comment
Sled, не могли бы вы подтвердить, как вы решили эту проблему?   -  person Pra_A    schedule 07.01.2020


Ответы (9)


Хотелось бы, чтобы у меня еще была ссылка на источник, ведущий меня в этом направлении, но это код, который в итоге сработал для меня. Просматривая JavaDoc для X509TrustManager похоже, что работа TrustManagers заключается в том, что при успешной проверке ничего не возвращается, иначе возникает исключение. Таким образом, с нулевой реализацией это считается успешной проверкой. Затем вы удаляете все остальные реализации.

import javax.net.ssl.*;
import java.security.*;
import java.security.cert.X509Certificate;

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.");
    }
}
person Sled    schedule 30.06.2014
comment
@ArtB каково использование кода для сбора? должен ли я вызывать SSLUtil.turnOffSslChecking () каждый раз перед вызовом остального URL? любой пример кода, пожалуйста - person Junchen Liu; 31.05.2017
comment
Это зависит от вашего варианта использования. Но я рекомендую выключить метод @Before в модульном тесте и снова включить в @After. - person Sled; 31.05.2017
comment
В моих тестах это определенно отключило проверки SSL, но метод turnOn () не смог восстановить проверку SSL, я опубликовал постепенное улучшение в ответе ниже. - person chrisinmtown; 08.10.2019
comment
Как мы можем использовать это с RestTemplate? - person Pra_A; 07.01.2020

Ради других разработчиков, которые задаются этим вопросом и нуждаются в другом решении, которое подходит не только для модульных тестов:

Я нашел это в блоге ( не мое решение! Кредит владельцу блога).

TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;

SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
        .loadTrustMaterial(null, acceptingTrustStrategy)
        .build();

SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);

CloseableHttpClient httpClient = HttpClients.custom()
        .setSSLSocketFactory(csf)
        .build();

HttpComponentsClientHttpRequestFactory requestFactory =
        new HttpComponentsClientHttpRequestFactory();

requestFactory.setHttpClient(httpClient);

RestTemplate restTemplate = new RestTemplate(requestFactory);
person OhadR    schedule 09.03.2017
comment
Это не работает в моей ситуации, я все еще получаю: javax.net.ssl.SSLHandshakeException: получено фатальное предупреждение: handshake_failure - person MattWeiler; 13.03.2019
comment
Обратите внимание, что этот ответ предполагает, что вы настроили среду Spring, возможно, Spring-Boot, для использования HTTP-клиента Apache в качестве реализации, а это НЕ по умолчанию. - person chrisinmtown; 08.10.2019
comment
После этой реализации я получаю SSLPeerUnverifiedException. как решить это - person ojus kulkarni; 24.10.2019
comment
Я использовал apache, предоставленный new TrustSelfSignedStrategy() в loadTrustMaterial, но все равно получал ошибку. Затем я заменил его на TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;, как рекомендовано выше, и теперь он отлично работает! - person AP22; 13.03.2020

Вы также можете зарегистрировать свое хранилище ключей:

private void registerKeyStore(String keyStoreName) {
    try {
        ClassLoader classLoader = this.getClass().getClassLoader();
        InputStream keyStoreInputStream = classLoader.getResourceAsStream(keyStoreName);
        if (keyStoreInputStream == null) {
            throw new FileNotFoundException("Could not find file named '" + keyStoreName + "' in the CLASSPATH");
        }

        //load the keystore
        KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
        keystore.load(keyStoreInputStream, null);

        //add to known keystore 
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(keystore);

        //default SSL connections are initialized with the keystore above
        TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustManagers, null);
        SSLContext.setDefault(sc);
    } catch (IOException | GeneralSecurityException e) {
        throw new RuntimeException(e);
    }
}
person Arnaud    schedule 20.01.2015

Пожалуйста, см. Ниже скромное улучшение кода @ Sled, показанного выше, в этом методе повторного включения отсутствовала одна строка, теперь он проходит мои тесты. Это отключает подмену сертификата HTTPS и имени хоста при использовании RestTemplate в приложении Spring-Boot версии 2, которое использует конфигурацию HTTP по умолчанию, НЕ настроенную для использования HTTP-клиента Apache.

package org.my.little.spring-boot-v2.app;

import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

/**
 * Disables and enables certificate and host-name checking in
 * HttpsURLConnection, the default JVM implementation of the HTTPS/TLS protocol.
 * Has no effect on implementations such as Apache Http Client, Ok Http.
*/
public final class SSLUtils {

    private static final HostnameVerifier jvmHostnameVerifier = HttpsURLConnection.getDefaultHostnameVerifier();

    private static final HostnameVerifier trivialHostnameVerifier = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession sslSession) {
            return true;
        }
    };

    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 {
        HttpsURLConnection.setDefaultHostnameVerifier(trivialHostnameVerifier);
        // Install the all-trusting trust manager
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, UNQUESTIONING_TRUST_MANAGER, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    }

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

    private SSLUtils() {
        throw new UnsupportedOperationException("Do not instantiate libraries.");
    }
}
person chrisinmtown    schedule 08.10.2019
comment
Спасибо! Это обновленное решение сработало для меня. FYI Для получения дополнительной информации о реализации проверки имени хоста в sun.net.www.protocol.https.HttpsClient есть огромный блок комментариев с подробным описанием используемого алгоритма, который можно задать явно. Первоначально я думал, что достаточно просто установить значение по умолчанию HostnameVerifier, но это не так, и я думаю, что это из-за используемого алгоритма проверки имени хоста по умолчанию. - person mikehwang; 08.10.2019
comment
Это сработало и для меня. Я вызвал его перед запуском приложения Spring Boot в основном методе. - person Chry007; 21.08.2020

Вот решение, в котором проверка безопасности отключена (например, общение с локальным хостом). Кроме того, некоторые из решений, которые я видел, теперь содержат устаревшие методы и тому подобное.

/**
 * @param configFilePath
 * @param ipAddress
 * @param userId
 * @param password
 * @throws MalformedURLException
 */
public Upgrade(String aConfigFilePath, String ipAddress, String userId, String password) {
    configFilePath = aConfigFilePath;
    baseUri = "https://" + ipAddress + ":" + PORT + "/";

    restTemplate = new RestTemplate(createSecureTransport(userId, password, ipAddress, PORT));
    restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());
    restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
 }

ClientHttpRequestFactory createSecureTransport(String username,
        String password, String host, int port) {
    HostnameVerifier nullHostnameVerifier = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };
    UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(username, password);
    CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(
            new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM), credentials);

    HttpClient client = HttpClientBuilder.create()
            .setSSLHostnameVerifier(nullHostnameVerifier)
            .setSSLContext(createContext())
            .setDefaultCredentialsProvider(credentialsProvider).build();

    HttpComponentsClientHttpRequestFactory requestFactory = 
            new HttpComponentsClientHttpRequestFactory(client);

    return requestFactory;
}

private SSLContext createContext() {
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        public void checkClientTrusted(
                java.security.cert.X509Certificate[] certs, String authType) {
        }

        public void checkServerTrusted(
                java.security.cert.X509Certificate[] certs, String authType) {
        }
    } };

    try {
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, null);
        SSLContext.setDefault(sc);
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });
        return sc;

    } catch (Exception e) {
    }
    return null;
}
person Michael    schedule 09.11.2015

Я знаю, что это слишком стар, чтобы отвечать, но я не мог найти такого решения.

Код, который работал у меня с клиентом jersey:

import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientProperties;

import javax.net.ssl.*;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedHashMap;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;

public class Testi {

static {
    disableSslVerification();
}
private static void disableSslVerification() {
    // Create all-trusting host name verifier
    HostnameVerifier allHostsValid = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };
    // Install the all-trusting host verifier
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
}

public Testi() {
    MultivaluedHashMap<String, Object> headers = new MultivaluedHashMap<>();
    //... initialize headers

    Form form = new Form();
    Entity<Form> entity = Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE);
    // initialize entity ...

    WebTarget target = getWebTarget();
    Object responseResult = target.path("api/test/path...").request()
            .headers(headers).post(entity, Object.class);

}

public static void main(String args[]) {
    new Testi();
}

private WebTarget getWebTarget() {
    ClientConfig clientConfig = new ClientConfig();
    clientConfig.property(ClientProperties.CONNECT_TIMEOUT, 30000);
    clientConfig.property(ClientProperties.READ_TIMEOUT, 30000);

    SSLContext sc = getSSLContext();
    Client client = ClientBuilder.newBuilder().sslContext(sc).withConfig(clientConfig).build();
    WebTarget target = client.target("...url...");
    return target;
}

private SSLContext getSSLContext() {
    try {
        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
            @Override
            public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws CertificateException {

            }

            @Override
            public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws CertificateException {

            }

            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        }
        };

        // Install the all-trusting trust manager
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        return sc;
    } catch (NoSuchAlgorithmException | KeyManagementException e) {
        e.printStackTrace();
    }
    return null;
}
}
person Sohbati    schedule 03.09.2019

В моем случае с letsencrypt https это было вызвано использованием cert.pem вместо fullchain.pem в качестве файла сертификата на запрошенном сервере. См. person Klesun    schedule 15.08.2020


Отключение проверки сертификатов - неправильное решение и в корне небезопасно.

Правильное решение - импортировать самозаверяющий сертификат в хранилище доверенных сертификатов. Еще более правильное решение - получить сертификат, подписанный центром сертификации.

Если это «только для тестирования», все равно необходимо протестировать производственную конфигурацию. Тестирование чего-то еще - это вовсе не тест, это просто пустая трата времени.

person user207421    schedule 06.05.2014
comment
Это только в рамках модульного теста. В модульном тесте я вызываю фиктивную версию нашего клиентского сервера, на которую мы будем отправлять команды. В процессе эксплуатации клиентский сервер имеет сертификат, подписанный ЦС. Однако у них нет тестовой среды. Многие из наших команд разрушительны, поэтому я использую наш фиктивный клиентский сервер для записи сообщений, которые мы ему отправляем, чтобы мы могли проверить их на соответствие. Библиотеки, которые мы используем, принудительно используют SSL, чтобы фиксировать полное содержание сообщений, которые мы им отправляем. - person Sled; 07.05.2014
comment
Не отвечая на вопрос. Иногда в целях отладки необходимо отключить проверку SSL. - person Alex; 30.06.2014
comment
@Alex Цели отладки, такие как что? Каким образом предоставление «правильного решения» не дает ответа на вопрос? - person user207421; 30.06.2014
comment
@EJP вопрос явно задается Как отключить проверку сертификата SSL с помощью Spring RestTemplate ?. Предоставленный вами ответ не отвечает на этот вопрос. Поскольку я также искал ответ на этот вопрос, я не нашел его в вашем комментарии. - person Alex; 04.07.2014
comment
Сертификат может быть самоподписанным по ряду причин. Например, не все организации предоставляют подписанные сертификаты во всех средах. Ваш комментарий не отвечает на вопрос. - person ipaul; 18.12.2015
comment
Полезно иметь возможность отключить проверку сертификатов в определенных случаях. Причину этого следует рассматривать в индивидуальном порядке, но возможность сделать это не указана в вашем ответе. - person Gerard Downes; 29.07.2016
comment
@GerardDownes Это полезно в каких случаях? Где эти загадочные случаи, когда вам все равно, кто выдал сертификат? Вы читали RFC 2616 по этой теме? - person user207421; 01.08.2016
comment
@ipaul Использование самозаверяющего сертификата не требует отключения всех проверок сертификатов. Во всяком случае, это делает это еще более важным. - person user207421; 15.11.2017
comment
Я разрабатываю службу интрасети, где крайне важно отправлять запросы в частной сети. Ресурс, который нужно использовать, находится за https (не с доверенным центром сертификации, потому что, очевидно, это интрасеть) и недоступен через http. В будущем, пожалуйста, не публикуйте слишком личные мнения по поводу вопросов, даже не отвечая на них. Для этого существуют разделы комментариев. - person Gyuhyeon Lee; 27.01.2018

person    schedule
comment
Добро пожаловать в SO. Пожалуйста, объясните, как это отвечает на вопрос OP. - person m02ph3u5; 27.04.2020
comment
Если присмотреться, похоже, что этот фрагмент кода идентичен ответу @OhadR. Чем это отличается? - person Matthew S; 20.01.2021