2016-01-24 3 views
0

Я довольно новичок в Java-Spring мире, и я не могу справиться с моей ситуацией. Мне нужно работать с некоторыми API через HTTPS, которые имеют сертификаты, выданные не доверенным ЦС. У меня есть код для этого:Java-Spring: как отключить проверку сертификата для конкретного HTTP-запроса?

RestTemplate restTemplate = new RestTemplate(); 
HttpHeaders headers = new HttpHeaders(); 
headers.add("Content-Type", "application/json;charset=UTF-8"); 
headers.add("Accept", "*/*"); 
ResponseEntity<byte[]> responseEntity = restTemplate.getForEntity(url, byte[].class, headers); 

Конечно, потому что сертификаты не является доверенным, я использовал, чтобы получить Java ошибка:

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 

Поэтому я отключил проверку сертификата с кодом:

public class SSLCertificateValidation { 
public static void disable() { 
     try { 
      SSLContext sslc = SSLContext.getInstance("TLS"); 
      TrustManager[] trustManagerArray = { new NullX509TrustManager() }; 
      sslc.init(null, trustManagerArray, null); 
      HttpsURLConnection.setDefaultSSLSocketFactory(sslc.getSocketFactory()); 
      HttpsURLConnection.setDefaultHostnameVerifier(new NullHostnameVerifier()); 
     }  
     catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private static class NullX509TrustManager implements X509TrustManager { 
     public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
      System.out.println(); 
     } 
     public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
      System.out.println(); 
     } 
     public X509Certificate[] getAcceptedIssuers() { 
      return new X509Certificate[0]; 
     } 
    } 

    private static class NullHostnameVerifier implements HostnameVerifier { 
     public boolean verify(String hostname, SSLSession session) { 
      return true; 
     } 
    } 
} 

Теперь мое приложение работает с этими API, но, с другой стороны, я работаю с некоторыми услугами AWS из этого приложения. И теперь я получаю ошибку AWS:

c.a.h.AmazonHttpClient - Unable to execute HTTP request: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 
javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 

Есть ли способ отключить проверку сертификата только для определенных URL-адресов? Может, кто-нибудь протянет мне руку помощи, пожалуйста? Я действительно не знаю, что мне теперь делать.

PS Я знаю об установке сертификата в java cacerts. Но, к сожалению, это не подходит для моей ситуации.

ответ

-1

Вместо отключения проверки SSL попробуйте установить сертификат в java cacerts, таким образом (я принимаю самозаверяющий сертификат) рассматривается как доверенный сертификат.

Лучший способ получить сертификат будет для владельца сервиса, чтобы предоставить его вам, а другой мудрый вы должны иметь возможность экспортировать файл сертификата довольно легко из браузера.

Я не буду вдаваться в излишние подробности об установке сертификата, потому что есть некоторые действительно хорошие ответы на этот вопрос How to properly import a selfsigned certificate into Java keystore that is available to all Java applications by default?

+0

Я знаю об установке сертификата на ява cacerts. Но, к сожалению, это не хорошо для моей ситуации. Я ищу ответ на вопрос, который я задал. – user3742622