2013-11-12 2 views
3

Я создаю Client.Following веб-службы являются пункты, которые будут отмечены:Почему я использовать веб-службы в качестве приложения Java, но не представляется возможным с struts2

  • я не должен добавить сертификат на cacerts или jssecacert (любое хранилище ключей).
  • Так что я использую наивного доверителя (доверяет всем сертификатам)
  • Я могу использовать веб-сервис и получать результат, когда я делаю это как обычное Java-приложение.
  • Если я копирую один и тот же код в свои struts2, он не работает.

Код:

import java.net.MalformedURLException; 
import java.net.URL; 
import java.security.GeneralSecurityException; 

import javax.net.ssl.*; 

public class main { 

/** 
* @param args 
*/ 

static { 
    System.out.println("Inside static block"); 
    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 
     @Override 
     public boolean verify(String hostname, SSLSession arg1) { 
      // TODO Auto-generated method stub 
      if (hostname.equals("***.***.**.**")) { 
       System.out.println("verify success"); 
       return true; 
      } 
      System.out.println("Verify unsuccessful"); 
      return false; 
     } 
    }); 
} 



public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    // Create a trust manager that does not validate certificate chains 
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
     public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
      return null; 
     } 

     public void checkClientTrusted(
       java.security.cert.X509Certificate[] certs, String authType) { 
     } 

     public void checkServerTrusted(
       java.security.cert.X509Certificate[] certs, String authType) { 
     } 
    } }; 
    // Install the all-trusting trust manager 
    try { 
     SSLContext sc = SSLContext.getInstance("SSL"); 
     sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
     HttpsURLConnection 
       .setDefaultSSLSocketFactory(sc.getSocketFactory()); 
    } catch (GeneralSecurityException e) { 
    } 
    // Now you can access an https URL without having the certificate in the 
    // truststore 
    try { 
     URL url = new URL(
       "https://path.service.asmx?WSDL"); 
    } catch (MalformedURLException e) { 
    } 

    Service o_service = new Service(); 
    ServiceSoap o_serServiceSoap = o_service.getServiceSoap(); 
    System.out.println(o_serServiceSoap.getUserInformation("information", 
      "information", "information", "information", "information")); 

} 

} 

тот же код при копировании в мой Struts2 проект дает следующее исключение:

Caused by: javax.net.ssl.SSLHandshakeException: SSLHandshakeException invoking https://path.service.asmx: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1338) 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1322) 
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) 
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:627) 
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) 
    ... 79 more 
Caused by: 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 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source) 
    at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.setupWrappedStream(URLConnectionHTTPConduit.java:168) 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1282) 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1238) 
    at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.onFirstWrite(URLConnectionHTTPConduit.java:195) 
    at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:47) 
    at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69) 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1295) 
    ... 82 more 
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.validator.PKIXValidator.doBuild(Unknown Source) 
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source) 
    at sun.security.validator.Validator.validate(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source) 
    ... 101 more 
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source) 
    at java.security.cert.CertPathBuilder.build(Unknown Source) 

Может кто-нибудь помочь мне с этим? Благодарю.

+1

В этом бите 'catch (GeneralSecurityException e) {}' вы можете проглотить причину проблемы. замените его на 'catch (GeneralSecurityException e) {throw new RuntimeException (e); } ' – artbristol

+1

вы помещаете это в класс действия? главный метод? – NGoyal

+1

Эта ошибка иногда возникает, когда она не может получить доступ к хранилищу доверия и/или хранилищу ключей (проверьте свойства системы javax.net.ssl.keystore и javax.net.ssl.truststore, чтобы узнать, к кому вы обращаетесь) – BigMike

ответ

2

[...] 79 более Вызванный: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX здание путь не удалось: sun.security.provider.certpath.SunCertPathBuilderException : не смог найти правильный путь сертификации к запрошенной цели в com.sun.net.ssl.internal.ssl.Alerts.getSSLException (Unknown Source) в [...]

это важно часть вашего stacktrace.

This article esplains, что происходит и как его исправить.

Вы можете попробовать следующее: Mkyong article (на основе вышеприведенного), что может быть немного проще.

Также убедитесь, что вы настроили сервер приложений для поддержки SSL и HTTPS (Tomcat Example).

+0

Я просмотрел эту статью. Но мой первый и самый важный критерий заключается в том, что я не хочу устанавливать сертификат. Есть ли другой путь ? –

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

  • Нет связанных вопросов^_^