我正嘗試使用KSOAP2庫訪問Android應用程序中的安全.NET SOAP Web服務。我已經檢查了堆棧溢出的其他答案,但到目前爲止,他們都沒有幫助我。Android中的KSOAP2請求.NET Web服務中的身份驗證
認證需要用戶名和密碼。該方法也接受一個字符串並返回一個複雜的類型。我已經得到這個工作與一個相同但不安全的服務(即沒有用戶名/密碼,但傳遞字符串和返回複雜類型工作正常)。
我可以使用soapUI連接到安全的web服務。我所要做的就是給它一個正確的String參數,通過SoapUI請求屬性設置用戶名和密碼,並且將WSS-PasswordType設置爲「PasswordText」。
我很困惑如何通過我的Java代碼實現這一點。 soapUI的要求(工作)看起來是這樣的:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header><wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-1" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>(my username) </wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">(my password) </wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">eic5EdyTomcBLocwyph5Mw==</wsse:Nonce>
<wsu:Created>2012-02-08T09:47:55.225Z</wsu:Created>
</wsse:UsernameToken></wsse:Security>
</soapenv:Header>
<soapenv:Body>
<tem:GetClientByNationalID>
<!--Optional:-->
<tem:nationalID>(the nationalID) </tem:nationalID>
</tem:GetClientByNationalID>
</soapenv:Body>
</soapenv:Envelope>
我想我應該在SOAP頭路過的用戶名和密碼,然後讓我嘗試以下this answer但這並沒有工作。然後,我使用[Lalit的回答](SOAP web service on android)編輯我的請求的標題,以使其與SoapUI生成的請求相同,但我仍然收到相同的錯誤。這裏是我的代碼現生產:
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header>
<n0:Security mustUnderstand="1" xmlns:n0="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<n0:UsernameToken n1:Id="UsernameToken-1" xmlns:n1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<n0:Username>(my username)</n0:Username>
<n0:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">(mypassword)</n0:Password>
<n0:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">eic5EdyTomcBLocwyph5Mw==</n0:Nonce>
<wsu:Created>2012-02-08T09:47:55.225Z</wsu:Created>
</n0:UsernameToken>
</n0:Security>
</v:Header>
<v:Body>
<GetClientByNationalID xmlns="http://tempuri.org/" id="o0" c:root="1">
<nationalID i:type="d:string">(testnationalID)</nationalID>
</GetClientByNationalID>
</v:Body>
這是我仍然在logcat中得到錯誤:
02-10 10:53:49.261: W/System.err(1187): javax.net.ssl.SSLHandshakeException:
java.security.cert.CertPathValidatorException: Trust anchor for certification path
not found.
這使它看起來像一個證書的問題,所以我用InstallCert從服務器導入證書,並用Keytool驗證它在我的密鑰庫中。這沒有什麼區別。另一方面,我認爲這不是證書問題,因爲在安裝證書之前,SoapUI工作。
現在我很困惑,所以這裏是我的問題:
1)添加證書到cacerts的密鑰存儲在我的JRE的lib /安全性不夠,或者我需要寫一些Java代碼,然後訪問這個證書?
2)這是一個證書問題,如果SoapUI能夠成功連接到webservice而無需安裝證書?
3)如果它不是一個證書問題,任何人都可以建議我需要使用什麼樣的代碼來生成一個Soap請求,以便成功驗證並執行方法調用?我認爲這是一個讓我的java生成的請求看起來與SoapUI生成的請求儘可能相似的例子。
你有沒有檢查這些鏈接[首頁](http://stackoverflow.com/questions/6441158/how-can-i-access-an-ssl-connection-through-android),[Second](http:/ /stackoverflow.com/questions/6825226/trust-anchor-not-found-for-android-ssl-connection) – 2012-02-08 12:46:32
我不確定這些鏈接是否適用於我使用KSOAP2時 - 是否仍然需要設置我的SSL連接手動? – breadbin 2012-02-08 14:05:04
@breadbin嗨,你是如何添加
AndroidDev
2014-05-22 10:15:04