2011-06-25 138 views
3

我已經使用org.codehaus.mojo axistools-maven-plugin插件版本1.4生成代碼。我正嘗試通過https連接到Web服務。我已將服務器證書安裝到jssecacerts中,並將此密鑰庫複製到/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/文件夾中。所以這意味着我在客戶端密鑰庫中擁有服務器證書。我還將服務器私鑰和證書導入到kestore.ImportKey密鑰存儲中。我想我將不得不使用這個作爲信任商店。現在,我如何在java客戶端連接所有這些? 我在客戶端使用自動生成的存根。我試圖使用以下但不起作用。如何在Axis2 Java客戶端中使用自簽名證書?

System.setProperty("javax.net.ssl.trustStore","certs/keystore.ImportKey"); 
System.setProperty("javax.net.ssl.trustStorePassword", "importkey"); 

我收到以下異常。

faultString: 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 

證書是有效的,因爲我通過同一主機的HTTPS客戶端使用相同的證書。另外,我能夠看到使用相同證書的成功請求。實際上,我不確定如何使用自簽名服務器證書通過https編寫Axis2 soap Java客戶端。任何人都可以點我一步一步的例子。

回答

2

感謝@Jcs

這是我如何解決了這個問題。當我嘗試在瀏覽器中打開Web服務URL時,它要求提供客戶端證書。這意味着,因爲我已經在jvm中導入了jssecacert服務器證書,所以我的客戶端丟失了客戶端證書。所以,而不是設置javax.net.ssl.trustStorejavax.net.ssl.trustStorePassword屬性,我設置javax.net.ssl.keyStorejavax.net.ssl.keyStorePassword屬性,它工作正常。我在將私鑰和證書導入密鑰庫之前錯過了。 ImportKey基本上是客戶的身份,我收到很長時間以來從某人說,這些是服務器證書。這是誤導我的。所以,讓我總結一下如果有人在尋找它的解決方案。

  1. 下載服務器證書並導入到系統路徑中的JVM cacerts或jssecacerts。 我用this post

  2. 在瀏覽器中打開webservice URL,如果它詢問客戶端證書,則表示服務器設置爲期望來自客戶端的證書。在自簽名證書的情況下,您必須已經擁有來自服務器的自簽名證書。在實際調用Web服務之前,將它們導入密鑰庫並設置密鑰存儲區的系統屬性,而不是信任庫,如下所示。這是因爲您已經將服務器證書導入到客戶端信任庫(cacerts)。

代碼:

MySoap12Stub stub = (MySoap12Stub) new MyLocator().getMySoap12(new java.net.URL(WSUrl)); 

System.setProperty("javax.net.ssl.keyStore", "certs/keystoreQA.Importkey"); 
System.setProperty("javax.net.ssl.keyStorePassword", "importkey"); 

另外在我的情況下,服務器要求用戶令牌的密碼設置成SOAP頭。這是我設置到SOAP消息頭這樣的:

((Stub) stub).setHeader(HeaderHandler.getSecurityHeader(User, password)); 

public class HeaderHandler { 

    public static SOAPHeaderElement getSecurityHeader(String user,String password) throws Exception { 
     SOAPHeaderElement wsseSecurity = new SOAPHeaderElement(new PrefixedQName(
      "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", 
      "Security", "wsse")); 
     wsseSecurity.setActor(null); 
     wsseSecurity.setMustUnderstand(true); 

     SOAPElement usernameToken = wsseSecurity.addChildElement("UsernameToken", "wsse"); 
     usernameToken.setAttribute("xmlns:wsu","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"); 
     SOAPElement username = usernameToken.addChildElement("Username", "wsse"); 
     username.addTextNode(user); 

     SOAPElement password = usernameToken.addChildElement("Password", "wsse"); 
     password.setAttribute("Type","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"); 
     password.addTextNode(password); 
     return wsseSecurity; 
    } 
} 

我希望這解釋了詳細說明了如何使用自簽名的證書和WSSE用戶Axis2客戶機使用usertoken和密碼通過HTTPS調用Web服務令牌和密碼。

乾杯!現在很好走。

2

在客戶端,您不需要證書私鑰來信任服務器。既然你在你的問題中寫道你導入了證書和密鑰keystore.ImportKey我認爲它們已經被導入爲PrivateKeyEntry(你可以用keytool驗證密鑰庫中的條目類型)。

但是,如果要將證書用作信任錨,則應該將證書導入爲TrustedCertificateEntry。它可以與keytool實現:

keytool -importcert -trustcacerts -alias myTrustAnchor -file /path/to/cert.crt -keystore /path/to/keystore 

然後你就可以在你的應用程序配置信任:

System.setProperty("javax.net.ssl.trustStore","/path/to/keystore"); 
相關問題