我正尝试使用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