Игнорировать SSL-сертификат в сервлете

Я получаю следующее исключение:

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

Я провел небольшое исследование и изменил свой код подключения следующим образом:

SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
            public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                return true;
            }
        }).build();

CloseableHttpClient client = HttpClients.custom()
            .setRedirectStrategy(new LaxRedirectStrategy()) 
            .setSslcontext(sslContext)   
            .setConnectionManager(connMgr)
            .build();

Это устранило проблему до сих пор, я больше не получаю исключение, и соединение работает.

Проблема возникает снова, когда я использую тот же код в сервлете, работающем в Tomcat.

Почему ?


person Tim    schedule 28.10.2015    source источник


Ответы (3)


Попробуйте следующий код.

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

public class DummyX509TrustManager implements X509TrustManager {

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

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

    @Override
    public void checkClientTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString)
            throws CertificateException {
    }
};


final TrustManager[] trustAllCerts = new TrustManager[] { new DummyX509TrustManager() };
try {
    SSLContext sslContext= SSLContext.getInstance("SSL"); 
    sslContext.init(null, trustAllCerts, null);

    CloseableHttpClient client = HttpClients.custom()
        .setRedirectStrategy(new LaxRedirectStrategy()) 
        .setSslcontext(sslContext)   
        .setConnectionManager(connMgr)
        .build();
} catch (KeyManagementException e) {
    throw new IOException(e.getMessage());
} catch (NoSuchAlgorithmException e) {
    throw new IOException(e.getMessage());
}
person shazin    schedule 02.11.2015
comment
Я предполагаю, что это было сделано для устранения CertificateException, которое появилось, когда я добавил хранилище ключей и импортировал .crt. Оказывается, я не могу использовать этот обходной путь, я бы предпочел избежать первоначального исключения SunCertPathBuilderException. - person Tim; 02.11.2015
comment
Тем не менее, я попробовал ваше решение, и теперь я получаю эту ошибку: java.security.KeyStoreException: problem accessing trust storejava.security.cert.CertificateParsingException: signed overrun, bytes = 266 at com.sun.net.ssl.internal.ssl.TrustManagerFactoryImpl.engineInit(TrustManagerFactoryImpl.java:55) - person Tim; 02.11.2015
comment
Ваш ответ заставил меня проверить все это, и у меня была ошибка в моем коде. Поскольку вы единственный, кто ответил, справедливо, что вы получили награду :) Спасибо. - person Tim; 02.11.2015

Сертификат веб-сайта выдан частным/корпоративным ЦС или он самоподписанный?

... new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() ...
  • Trustore пуст:
    Пытались ли вы загрузить хранилище ключей/файл, содержащий доверенные ЦС и их цепочки?
  • isTrusted всегда возвращает "true":
    Вы переопределяете стандартный процесс проверки сертификата JSSE и доверяете всем, поэтому никакой безопасности.
  • Это исключение: означает, что проверка сертификата не удалась. Отсутствует RootCA или вся цепочка CA.

Таким образом, похоже, что Tomcat проигнорировал ваш Контекст SSL. При таком использовании sslContext в любом случае бесполезен. Результаты отладки? Настройки JVM SSL? Трассировка стека исключений?

person Seb B.    schedule 08.11.2015

Вы разработали один сервлет. Верно? Это не что иное, как веб-страница. Если вам нужна веб-страница с поддержкой SSL, вы должны приобрести сертификат SSL после установки этого сертификата. Если у вас нет этого сертификата, используйте вышеуказанные коды. Вышеупомянутые коды подходят для всех вопросов безопасности.

Вы должны купить сертификат SSL/TSL у таких компаний, как Verisign и Thawte.

person Manik Mahendru    schedule 09.11.2015