it-swarm.com.ru

Как обрабатывать недействительные сертификаты SSL с Apache HttpClient?

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

У меня: ubuntu-9.10-desktop-AMD64 + NetBeans6.7.1 установлена ​​"как есть" с выключенного компьютера. rep . Мне нужно подключиться к какому-либо сайту через HTTPS. Для этого я использую Apache HttpClient.

Из учебника я прочитал:

«После правильной установки JSSE безопасная HTTP-связь через SSL должна быть
просто как простое HTTP-соединение. "И некоторые примеры:

HttpClient httpclient = new HttpClient();
GetMethod httpget = new GetMethod("https://www.verisign.com/"); 
try { 
  httpclient.executeMethod(httpget);
  System.out.println(httpget.getStatusLine());
} finally {
  httpget.releaseConnection();
}

К настоящему времени я пишу это:

HttpClient client = new HttpClient();

HttpMethod get = new GetMethod("https://mms.nw.ru");
//get.setDoAuthentication(true);

try {
    int status = client.executeMethod(get);
    System.out.println(status);

    BufferedInputStream is = new BufferedInputStream(get.getResponseBodyAsStream());
    int r=0;byte[] buf = new byte[10];
    while((r = is.read(buf)) > 0) {
        System.out.write(buf,0,r);
    }

} catch(Exception ex) {
    ex.printStackTrace();
}

В результате у меня есть множество ошибок:

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:1627)
        at Sun.security.ssl.Handshaker.fatalSE(Handshaker.Java:204)
        at Sun.security.ssl.Handshaker.fatalSE(Handshaker.Java:198)
        at Sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.Java:994)
        at Sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.Java:142)
        at Sun.security.ssl.Handshaker.processLoop(Handshaker.Java:533)
        at Sun.security.ssl.Handshaker.process_record(Handshaker.Java:471)
        at Sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.Java:904)
        at Sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.Java:1132)
        at Sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.Java:643)
        at Sun.security.ssl.AppOutputStream.write(AppOutputStream.Java:78)
        at Java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.Java:82)
        at Java.io.BufferedOutputStream.flush(BufferedOutputStream.Java:140)
        at org.Apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.Java:828)
        at org.Apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.Java:2116)
        at org.Apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.Java:1096)
        at org.Apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.Java:398)
        at org.Apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.Java:171)
        at org.Apache.commons.httpclient.HttpClient.executeMethod(HttpClient.Java:397)
        at org.Apache.commons.httpclient.HttpClient.executeMethod(HttpClient.Java:323)
        at simpleapachehttp.Main.main(Main.Java:41)
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:302)
        at Sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.Java:205)
        at Sun.security.validator.Validator.validate(Validator.Java:235)
        at Sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.Java:147)
        at Sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.Java:230)
        at Sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.Java:270)
        at Sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.Java:973)
        ... 17 more
Caused by: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at Sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.Java:191)
        at Java.security.cert.CertPathBuilder.build(CertPathBuilder.Java:255)
        at Sun.security.validator.PKIXValidator.doBuild(PKIXValidator.Java:297)
        ... 23 more

Что я должен сделать, чтобы создать простейшее соединение SSL? (Вероятно, без KeyManager, Trust Manager и т.д. Пока.)

113
rauch

https://mms.nw.ru использует самозаверяющий сертификат, который явно не содержится в наборе доверенных менеджеров по умолчанию.

Вам понадобится одно из следующих:

  • Сконфигурируйте SSLContext с TrustManager, который принимает любой сертификат (см. Ниже)

  • Настройте SSLContext с соответствующим хранилищем доверия, которое включает ваш сертификат

  • Добавьте сертификат для этого сайта в хранилище доверенных сертификатов Java по умолчанию.

Вот пример программы, которая создает (в основном бесполезный) контекст SSL, который принимает любой сертификат:

import Java.net.URL;
import Java.security.SecureRandom;
import Java.security.cert.CertificateException;
import Java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class SSLTest {

    public static void main(String [] args) throws Exception {
        // configure the SSLContext with a TrustManager
        SSLContext ctx = SSLContext.getInstance("TLS");
        ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
        SSLContext.setDefault(ctx);

        URL url = new URL("https://mms.nw.ru");
        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
        conn.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String arg0, SSLSession arg1) {
                return true;
            }
        });
        System.out.println(conn.getResponseCode());
        conn.disconnect();
    }

    private static class DefaultTrustManager implements X509TrustManager {

        @Override
        public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

        @Override
        public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    }
}
151
Kevin

https://mms.nw.ru , вероятно, использует сертификат, не выданный центром сертификации. Следовательно, вам нужно добавить сертификат в ваше доверенное хранилище ключей Java, как описано в невозможно найти действительный путь сертификации к запрошенной цели :

При работе на клиенте, который работает с сервером с поддержкой SSL, работающим в Протокол https, вы можете получить ошибку 'невозможно найти действительное свидетельство путь к запрошенной цели ', если сертификат сервера не выдан центр сертификации, но сам подписано или выдано частной CMS.

Не паникуйте Все, что вам нужно сделать, это добавьте сертификат сервера к вашему доверенное хранилище ключей Java, если ваш клиент написано на Java. Вы, возможно интересно, как будто вы не можете получить доступ машина, где находится сервер установлены. Есть простая программа могу помочь тебе. Пожалуйста, загрузите Java запрограммировать и запустить

% Java InstallCert _web_site_hostname_

Эта программа открыла соединение с указан Хост и запущен SSL рукопожатие. Это напечатало исключение трассировка стека возникшей ошибки и показывает вам сертификаты, используемые сервер. Теперь он предлагает добавить сертификат вашего доверенного хранилища ключей.

Если вы передумали, введите «Д». Если вы действительно хотите добавить сертификат, введите «1» или другое номера для добавления других сертификатов, даже сертификат CA, но вы обычно не хочу этого делать Как только у вас есть сделал свой выбор, программа будет отобразить полный сертификат и затем добавил его в хранилище ключей Java с именем 'jssecacerts' в текущем каталог.

Чтобы использовать его в своей программе, либо настроить JSSE для использования в качестве доверия сохранить или скопировать его в свой $ Java_HOME/jre/lib/security directory . Если вы хотите, чтобы все приложения Java были признать сертификат доверенным и не только JSSE, вы могли бы также переписать файл cacerts в этом каталог.

После всего этого JSSE сможет завершить рукопожатие с Хостом, что вы можете проверить, запустив Запрограммируйте снова.

Чтобы получить более подробную информацию, вы можете проверить Блог Leeland No more 'невозможно найти действительный путь сертификации к запрашиваемому цель '

44
Pascal Thivent

В дополнение к правильному ответу Pascal Thivent, другим способом является сохранение сертификата из Firefox (Просмотр сертификата -> Детали -> экспорт) или openssl s_client и импорт его в хранилище доверенных сертификатов.

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

Чтобы импортировать его в доверенное хранилище, используйте:

keytool -importcert -keystore truststore.jks -file servercert.pem

По умолчанию хранилище доверенных сертификатов по умолчанию должно быть lib/security/cacerts, а его пароль - changeit, подробности см. В Справочном руководстве JSSE .

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

TrustManagerFactory tmf = TrustManagerFactory
    .getInstance(TrustManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream fis = new FileInputStream("/.../truststore.jks");
ks.load(fis, null);
// or ks.load(fis, "thepassword".toCharArray());
fis.close();

tmf.init(ks);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);

Затем вам нужно настроить его для Apache HTTP Client 3.x, внедрив его, если его SecureProtocolSocketFactory использовать этот SSLContext. (Есть примеры здесь ).

Apache HTTP Client 4.x (кроме самой ранней версии) имеет прямую поддержку для передачи SSLContext.

23
Bruno

От  http://hc.Apache.org/httpclient-3.x/sslguide.html:

Protocol.registerProtocol("https", 
new Protocol("https", new MySSLSocketFactory(), 443));
HttpClient httpclient = new HttpClient();
GetMethod httpget = new GetMethod("https://www.whatever.com/");
try {
  httpclient.executeMethod(httpget);
      System.out.println(httpget.getStatusLine());
} finally {
      httpget.releaseConnection();
}

Где можно найти пример MySSLSocketFactory здесь . Он ссылается на TrustManager, который вы можете изменить, чтобы доверять всему (хотя вы должны учитывать это!)

10
Bozho

Apache HttpClient 4.5 способ:

org.Apache.http.ssl.SSLContextBuilder sslContextBuilder = SSLContextBuilder.create();
sslContextBuilder.loadTrustMaterial(new org.Apache.http.conn.ssl.TrustSelfSignedStrategy());
SSLContext sslContext = sslContextBuilder.build();
org.Apache.http.conn.ssl.SSLConnectionSocketFactory sslSocketFactory =
        new SSLConnectionSocketFactory(sslContext, new org.Apache.http.conn.ssl.DefaultHostnameVerifier());

HttpClientBuilder httpClientBuilder = HttpClients.custom().setSSLSocketFactory(sslSocketFactory);
httpClient = httpClientBuilder.build();

ПРИМЕЧАНИЕ: org.Apache.http.conn.ssl.SSLContextBuilder является устарела и org.Apache.http.ssl.SSLContextBuilder является новым (уведомление conn отсутствует в имени пакета последнего).

9
Anton Krosnev

Если у вас есть хранилище сертификатов Java (с помощью созданного выше класса great InstallCert), вы можете настроить его на использование Java, передав параметр "javax.net.ssl.trustStore" при запуске Java. 

Пример:

Java -Djavax.net.ssl.trustStore=/path/to/jssecacerts MyClassName
4
Brian M. Carr

Для Apache HttpClient 4.5+ и Java8:

SSLContext sslContext = SSLContexts.custom()
        .loadTrustMaterial((chain, authType) -> true).build();

SSLConnectionSocketFactory sslConnectionSocketFactory =
        new SSLConnectionSocketFactory(sslContext, new String[]
        {"SSLv2Hello", "SSLv3", "TLSv1","TLSv1.1", "TLSv1.2" }, null,
        NoopHostnameVerifier.INSTANCE);
CloseableHttpClient client = HttpClients.custom()
        .setSSLSocketFactory(sslConnectionSocketFactory)
        .build();

Но если ваш HttpClient использует ConnectionManager для поиска соединения, например, как это:

 PoolingHttpClientConnectionManager connectionManager = new 
         PoolingHttpClientConnectionManager();

 CloseableHttpClient client = HttpClients.custom()
            .setConnectionManager(connectionManager)
            .build();

HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory) не имеет никакого эффекта , проблема не решена.

Потому что HttpClient использует указанный connectionManager для поиска соединения, а указанный connectionManager не зарегистрировал наш настроенный SSLConnectionSocketFactory. Чтобы решить эту проблему, следует зарегистрировать настроенный SSLConnectionSocketFactory в ConnectionManager. Правильный код должен выглядеть так:

PoolingHttpClientConnectionManager connectionManager = new 
    PoolingHttpClientConnectionManager(RegistryBuilder.
                <ConnectionSocketFactory>create()
      .register("http",PlainConnectionSocketFactory.getSocketFactory())
      .register("https", sslConnectionSocketFactory).build());

CloseableHttpClient client = HttpClients.custom()
            .setConnectionManager(connectionManager)
            .build();
4
EyouGo

Другая проблема, с которой вы можете столкнуться с самоподписанными тестовыми сертификатами, заключается в следующем:

Java.io.IOException: HTTPS неверное имя хоста: должно быть ...

Эта ошибка возникает при попытке доступа к URL-адресу HTTPS. Возможно, вы уже установили сертификат сервера в хранилище ключей вашего JRE. Но эта ошибка означает, что имя сертификата сервера не совпадает с фактическим доменным именем сервера, указанным в URL-адресе. Обычно это происходит, когда вы используете сертификат, не выданный центром сертификации.

В этом примере показано, как написать HttpsURLConnection DefaultHostnameVerifier, который игнорирует имя сервера сертификатов:

http://www.Java-samples.com/showtutorial.php?tutorialid=211

3
Kiwicmc

Чтобы легко добавить хосты, которым вы доверяете, во время выполнения, не выбрасывая все проверки, попробуйте код здесь: http://code.google.com/p/self-signed-cert-trust-manager/ .

2
Matt Olsen

EasySSLProtocolSocketFactory доставлял мне проблемы, поэтому я в итоге реализовал свой собственный ProtocolSocketFactory. 

Сначала вам нужно зарегистрировать его: 

Protocol.registerProtocol("https", new Protocol("https", new TrustAllSSLSocketFactory(), 443));

HttpClient client = new HttpClient();
...

Затем реализуйте ProtocolSocketFactory:

class TrustAllSSLSocketFactory implements ProtocolSocketFactory {

    public static final TrustManager[] TRUST_ALL_CERTS = new TrustManager[]{
        new X509TrustManager() {
            public void checkClientTrusted(final X509Certificate[] certs, final String authType) {

            }

            public void checkServerTrusted(final X509Certificate[] certs, final String authType) {

            }

            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        }
    };

    private TrustManager[] getTrustManager() {
        return TRUST_ALL_CERTS;
    }

    public Socket createSocket(final String Host, final int port, final InetAddress clientHost,
                               final int clientPort) throws IOException {
        return getSocketFactory().createSocket(Host, port, clientHost, clientPort);
    }

    @Override
    public Socket createSocket(final String Host, final int port, final InetAddress localAddress,
                               final int localPort, final HttpConnectionParams params) throws IOException {
        return createSocket(Host, port);
    }

    public Socket createSocket(final String Host, final int port) throws IOException {
        return getSocketFactory().createSocket(Host, port);
    }

    private SocketFactory getSocketFactory() throws UnknownHostException {
        TrustManager[] trustAllCerts = getTrustManager();

        try {
            SSLContext context = SSLContext.getInstance("SSL");
            context.init(null, trustAllCerts, new SecureRandom());

            final SSLSocketFactory socketFactory = context.getSocketFactory();
            HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);
            return socketFactory;
        } catch (NoSuchAlgorithmException | KeyManagementException exception) {
            throw new UnknownHostException(exception.getMessage());
        }
    }
}

Примечание: это с HttpClient 3.1 и Java 8

1
Daniel Treiber

следуйте приведенным ниже инструкциям для Java 1.7, чтобы создать сертификат SSL с помощью файла программы InstallCert.Java.

https://github.com/escline/InstallCert

вы должны перезапустить Tomcat

0
Allahbakash.G

Я использую httpclient 3.1.X, и это работает для меня 

        try {
        SSLContext sslContext = SSLContext.getInstance("TLS");
        TrustManager trustManager = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
            }

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

            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };
        sslContext.init(null, new TrustManager[]{trustManager}, null);
        SslContextSecureProtocolSocketFactory socketFactory = new SslContextSecureProtocolSocketFactory(sslContext,false);
        Protocol.registerProtocol("https", new Protocol("https", (ProtocolSocketFactory) socketFactory, 443));//同样会影响到HttpUtils
    } catch (Throwable e) {
        e.printStackTrace();

}

public class SslContextSecureProtocolSocketFactory implements      SecureProtocolSocketFactory {

private SSLContext sslContext;
private boolean verifyHostname;

public SslContextSecureProtocolSocketFactory(SSLContext sslContext, boolean verifyHostname) {
    this.verifyHostname = true;
    this.sslContext = sslContext;
    this.verifyHostname = verifyHostname;
}

public SslContextSecureProtocolSocketFactory(SSLContext sslContext) {
    this(sslContext, true);
}

public SslContextSecureProtocolSocketFactory(boolean verifyHostname) {
    this((SSLContext)null, verifyHostname);
}

public SslContextSecureProtocolSocketFactory() {
    this((SSLContext)null, true);
}

public synchronized void setHostnameVerification(boolean verifyHostname) {
    this.verifyHostname = verifyHostname;
}

public synchronized boolean getHostnameVerification() {
    return this.verifyHostname;
}

public Socket createSocket(String Host, int port, InetAddress clientHost, int clientPort) throws IOException, UnknownHostException {
    SSLSocketFactory sf = this.getSslSocketFactory();
    SSLSocket sslSocket = (SSLSocket)sf.createSocket(Host, port, clientHost, clientPort);
    this.verifyHostname(sslSocket);
    return sslSocket;
}

public Socket createSocket(String Host, int port, InetAddress localAddress, int localPort, HttpConnectionParams params) throws IOException, UnknownHostException, ConnectTimeoutException {
    if(params == null) {
        throw new IllegalArgumentException("Parameters may not be null");
    } else {
        int timeout = params.getConnectionTimeout();
        Socket socket = null;
        SSLSocketFactory socketfactory = this.getSslSocketFactory();
        if(timeout == 0) {
            socket = socketfactory.createSocket(Host, port, localAddress, localPort);
        } else {
            socket = socketfactory.createSocket();
            InetSocketAddress localaddr = new InetSocketAddress(localAddress, localPort);
            InetSocketAddress remoteaddr = new InetSocketAddress(Host, port);
            socket.bind(localaddr);
            socket.connect(remoteaddr, timeout);
        }

        this.verifyHostname((SSLSocket)socket);
        return socket;
    }
}

public Socket createSocket(String Host, int port) throws IOException, UnknownHostException {
    SSLSocketFactory sf = this.getSslSocketFactory();
    SSLSocket sslSocket = (SSLSocket)sf.createSocket(Host, port);
    this.verifyHostname(sslSocket);
    return sslSocket;
}

public Socket createSocket(Socket socket, String Host, int port, boolean autoClose) throws IOException, UnknownHostException {
    SSLSocketFactory sf = this.getSslSocketFactory();
    SSLSocket sslSocket = (SSLSocket)sf.createSocket(socket, Host, port, autoClose);
    this.verifyHostname(sslSocket);
    return sslSocket;
}

private void verifyHostname(SSLSocket socket) throws SSLPeerUnverifiedException, UnknownHostException {
    synchronized(this) {
        if(!this.verifyHostname) {
            return;
        }
    }

    SSLSession session = socket.getSession();
    String hostname = session.getPeerHost();

    try {
        InetAddress.getByName(hostname);
    } catch (UnknownHostException var10) {
        throw new UnknownHostException("Could not resolve SSL sessions server hostname: " + hostname);
    }

    X509Certificate[] certs = (X509Certificate[])((X509Certificate[])session.getPeerCertificates());
    if(certs != null && certs.length != 0) {
        X500Principal subjectDN = certs[0].getSubjectX500Principal();
        List cns = this.getCNs(subjectDN);
        boolean foundHostName = false;
        Iterator i$ = cns.iterator();
        AntPathMatcher matcher  = new AntPathMatcher();
        while(i$.hasNext()) {
            String cn = (String)i$.next();
            if(matcher.match(cn.toLowerCase(),hostname.toLowerCase())) {
                foundHostName = true;
                break;
            }
        }

        if(!foundHostName) {
            throw new SSLPeerUnverifiedException("HTTPS hostname invalid: expected \'" + hostname + "\', received \'" + cns + "\'");
        }
    } else {
        throw new SSLPeerUnverifiedException("No server certificates found!");
    }
}

private List<String> getCNs(X500Principal subjectDN) {
    ArrayList cns = new ArrayList();
    StringTokenizer st = new StringTokenizer(subjectDN.getName(), ",");

    while(st.hasMoreTokens()) {
        String cnField = st.nextToken();
        if(cnField.startsWith("CN=")) {
            cns.add(cnField.substring(3));
        }
    }

    return cns;
}

protected SSLSocketFactory getSslSocketFactory() {
    SSLSocketFactory sslSocketFactory = null;
    synchronized(this) {
        if(this.sslContext != null) {
            sslSocketFactory = this.sslContext.getSocketFactory();
        }
    }

    if(sslSocketFactory == null) {
        sslSocketFactory = (SSLSocketFactory)SSLSocketFactory.getDefault();
    }

    return sslSocketFactory;
}

public synchronized void setSSLContext(SSLContext sslContext) {
    this.sslContext = sslContext;
}

}

0
acoder2013

хочу вставить ответ здесь:

в Apache HttpClient 4.5.5

Как обрабатывать недействительный сертификат SSL с клиентом Apache 4.5.5?

HttpClient httpClient = HttpClients
            .custom()
            .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, TrustAllStrategy.INSTANCE).build())
            .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
            .build();
0
aaron

Использование InstallCert для генерации файла jssecacerts и выполнения -Djavax.net.ssl.trustStore=/path/to/jssecacerts работало отлично.

0
Dexin Wang

Для HttpClient мы можем сделать это:

SSLContext ctx = SSLContext.getInstance("TLS");
        ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
        SSLContext.setDefault(ctx);

        String uri = new StringBuilder("url").toString();

        HostnameVerifier hostnameVerifier = new HostnameVerifier() {
            @Override
            public boolean verify(String arg0, SSLSession arg1) {
                return true;
            }
        };

        HttpClient client = HttpClientBuilder.create().setSSLContext(ctx)
                .setSSLHostnameVerifier(hostnameVerifier).build()
0
sorabh solanki

Я столкнулся с той же проблемой, вдруг все мои импортные товары пропали. Я попытался удалить все содержимое моей папки .m2. И пытался все заново импортировать, но все равно ничего не получалось. В конце концов я открыл веб-сайт, на который IDE жаловался, что его невозможно загрузить в моем браузере. И увидел сертификат, который он использовал, и увидел в моем

$ keytool -v -list  PATH_TO_Java_KEYSTORE

Путь к моему хранилищу ключей был /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts

этого конкретного сертификата там не было.

Поэтому все, что вам нужно сделать, это снова поместить сертификат в хранилище ключей Java JVM. Это можно сделать с помощью приведенной ниже команды.

$ keytool -import -alias ANY_NAME_YOU_WANT_TO_GIVE -file PATH_TO_YOUR_CERTIFICATE -keystore PATH_OF_Java_KEYSTORE

Если он запрашивает пароль, попробуйте пароль по умолчанию «changeit». Если вы получили ошибку разрешения при выполнении вышеуказанной команды. В Windows откройте его в режиме администрирования. В Mac и Unix использовать Sudo.

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

$ keytool -v -list  /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts 

Вы можете просмотреть только SHA-1, используя команду

$ keytool -list  /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts 
0
Adarsh S N

Эта ссылка объясняет пошаговое требование, которое у вас есть. Если вас не интересует, какой сертификат вы можете продолжить, перейдите по ссылке ниже. 

Примечание. Возможно, вы захотите дважды проверить, что вы делаете, поскольку это небезопасная операция.

0
Raghu Kiran

Использовал следующее вместе с DefaultTrustManager, и он работал в httpclient как charm. Благодаря тонну!! @Kevin и любой другой участник

    SSLContext ctx = null;
    SSLConnectionSocketFactory sslsf = null;
    try {

        ctx = SSLContext.getInstance("TLS");
        ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
        SSLContext.setDefault(ctx);

        sslsf = new SSLConnectionSocketFactory(
                ctx,
                new String[] { "TLSv1" },
                null,
                SSLConnectionSocketFactory.getDefaultHostnameVerifier());

    } catch (Exception e) {
        e.printStackTrace();
    }

     CloseableHttpClient client = HttpClients.custom()
            .setSSLSocketFactory(sslsf)
            .build();
0
Mohankumar Loganathan