Игнорировать сертификат 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();
Это устранило проблему до сих пор, я больше не получаю исключение, и соединение работает.
Проблема возникает снова, когда я использую тот же код в Servlet, который работает в Tomcat.
Почему?
Ответы
Ответ 1
Попробуйте использовать следующий код.
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());
}
Ответ 2
Является ли сертификат веб-сайта, выданный частным/принадлежащим ей компанией CA, или является самоподписанным?
... new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() ...
- Trustore is null:
Вы пытались загрузить хранилище/файл, содержащий доверенные ЦС + их цепочки?
- isTrusted всегда возвращает "true":
Вы переопределяете стандартный процесс проверки сертификата JSSE и доверяете всем, поэтому никакой безопасности вообще нет.
- Это исключение: означает, что проверка сертификата не удалась. RootCA или целая цепь CA отсутствует.
Итак, похоже, что Tomcat проигнорировал ваш SSLContext. Используемый таким образом, sslContext бесполезен в любом случае. Отладка результатов? Настройки JVM SSL? Трассировка стека исключений?
Ответ 3
Вы создали один сервлет. Правильно? Это не что иное, как веб-страница. Если вы хотите использовать веб-страницу с поддержкой SSL, вам необходимо приобрести сертификат SSL после этого сертификата. Если у вас нет этого сертификата, используйте вышеперечисленные коды. Вышеупомянутые коды подходят для всех проблем безопасности.
Вам необходимо приобрести сертификат SSL/TSL у таких компаний, как Verisign и Thawte.