Как да деактивирам проверката на 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

От други въпроси и блог публикации Виждал съм съвета да заменя 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 нито в SDK на Java, нито в 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, да използвате Apache HTTP Client като имплементация, което НЕ е по подразбиране. - 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 конфигурацията по подразбиране, НЕ конфигурирано да използва Apache HTTP Client.

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

Знам, че е твърде старо за отговор, но не можах да намеря подобно решение.

Кодът, който работи за мен с клиента на фланелката:

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

Деактивирането на проверката на сертификати е грешно решение и радикално несигурно.

Правилното решение е да импортирате самоподписания сертификат във вашия truststore. Още по-правилно решение е сертификатът да бъде подписан от CA.

Ако това е „само за тестване“, все още е необходимо да се тества производствената конфигурация. Тестването на нещо друго изобщо не е тест, а просто загуба на време.

person user207421    schedule 06.05.2014
comment
Това е само в рамките на единичен тест. В рамките на модулния тест извеждам фиктивна версия на сървъра на нашия клиент, към който ще изпращаме команди. В производството клиентският сървър има сертификат, подписан от CA. Те обаче нямат тестова среда. Много от нашите команди са разрушителни, така че използвам нашия фиктивен клиентски сървър, за да записвам съобщенията, които му изпращаме, за да можем да ги проверим за съответствие. Библиотеките, които използваме, налагат 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 (не с доверен CA, защото очевидно е интранет) и е недостъпен през 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