2015-10-28 2 views
15

я получаю следующее исключение:Игнорировать сертификат SSL в Servlet

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.

Почему?

ответ

4

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

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()); 
} 
+0

Я предполагаю, что это должно было устранить исключение CertificateException, которое появилось, когда я добавил хранилище ключей и импортировал .crt. Оказывается, я не могу использовать это обходное решение, я бы предпочел избежать первоначального исключения SunCertPathBuilderException. – Tim

+0

Тем не менее, я попробовал ваше решение, и теперь получаю эту ошибку: 'java.security.KeyStoreException: проблема с доступом к trust storejava.security.cert.CertificateParsingException: подписанное переполнение, байты = 266 на com.sun.net.ssl.internal. ssl.TrustManagerFactoryImpl.engineInit (TrustManagerFactoryImpl.java:55) ' – Tim

+1

Ваш ответ заставил меня проверить все это, и у меня была ошибка в моем коде. Поскольку вы единственный, кто ответил, справедливо, что вы получаете награду :) Спасибо – Tim

2

Это сертификат веб-сайта, выданный частным/принадлежащим ей компанией CA, или он самоподписан?

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

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

-1

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

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

Смежные вопросы