2009-11-12 19 views
13

Bir REST son noktasına çağrı yapmak için istemci tarafında Spring RESTTemplate kullanıyorum. Bu durumda istemci bir Spring uygulamasıdır ve Tomcat sunucu uygulamasıdır.Neden SSL el sıkışma için güvenilir mağazayı bulamıyorum?

HTTPS son noktaya bağlantı kurarak sorunları yaşıyorum. Güvenilir mağaza için geçerli bir yol bulamadığını belirten bir hata alıyorum. Bunu nerede belirleyebilirim? Bu kap seviyesinde mi yoksa uygulama konfigürasyonu (Bahar) seviyesinde mi yapıldı?

Yığın izleme: düzgün RESTTemplate harici yapılır SSLContext yapılandırmanız gerekir

org.springframework.web.client.ResourceAccessException: I/O error: 
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 
org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:330) 
org.springframework.web.client.RestTemplate.execute(RestTemplate.java:292) 
org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:227) 

cevap

10

. Bu başlangıç ​​olmalıdır:

String keystoreType = "JKS"; 
    InputStream keystoreLocation = null; 
    char [] keystorePassword = null; 
    char [] keyPassword = null; 

    KeyStore keystore = KeyStore.getInstance(keystoreType); 
    keystore.load(keystoreLocation, keystorePassword); 
    KeyManagerFactory kmfactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    kmfactory.init(keystore, keyPassword); 

    InputStream truststoreLocation = null; 
    char [] truststorePassword = null; 
    String truststoreType = "JKS"; 

    KeyStore truststore = KeyStore.getInstance(truststoreType); 
    truststore.load(truststoreLocation, truststorePassword); 
    TrustManagerFactory tmfactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 

    KeyManager [] keymanagers = kmfactory.getKeyManagers(); 
    TrustManager [] trustmanagers = tmfactory.getTrustManagers(); 

    SSLContext sslContext = SSLContext.getInstance("TLS"); 
    sslContext.init(keymanagers, trustmanagers, new SecureRandom()); 
    SSLContext.setDefault(sslContext); 
32

Daha spesifik olarak, herhangi bir sonraki HttpClient çağrıları SSL sertifika geçerlilik bakmayanbirini böylece hile olacaktır bu yöntemi çağıran:

public static void trustSelfSignedSSL() { 
    try { 
     SSLContext ctx = SSLContext.getInstance("TLS"); 
     X509TrustManager tm = new X509TrustManager() { 

      public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException { 
      } 

      public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException { 
      } 

      public X509Certificate[] getAcceptedIssuers() { 
       return null; 
      } 
     }; 
     ctx.init(null, new TrustManager[]{tm}, null); 
     SSLContext.setDefault(ctx); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 
+0

Nerede o kod yazmak? – kamaci

+3

İstediğiniz yere yazabilirsiniz, çünkü SSLContext sınıfının kendisi üzerinde statik bir çağrı yapıyordur. Aynı classloader bağlamında ve ilk HttpClient çağrısından önce aradığınız sürece, gitmek için iyi olmalısınız. –

+0

Sadece emin olmak için: Yukarıda açıklandığı gibi bir SSLContext'in TrustManager'ını değiştirmek kalıcı bir eylem değildir, değil mi? Yani uygulama her başlatıldığında yapılması gerekiyor. – ptikobj

İlgili konular