Я пытаюсь получить доступ к защищенному веб-сервису .NET SOAP в приложении для Android с помощью библиотеки KSOAP2. Я проверил другие ответы о переполнении стека, но до сих пор ни один из них не помог мне.
Для аутентификации требуются имя пользователя и пароль. Метод также принимает строку и возвращает сложный тип. Я получил это для работы с идентичной, но небезопасной службой (то есть, без имени пользователя / пароля, но передача String и возвращение сложного типа работает нормально).
Я могу подключиться к безопасному веб-сервису, используя soapUI. Все, что мне нужно сделать, это дать ему правильный параметр 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, поэтому попытался выполнить этот ответ , но это не сработало. Затем я использовал [ответ Лалита] ( веб-сервис SOAP на 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 / security или мне нужно написать некоторый код Java для доступа к этому сертификату?
2) Это вообще проблема с сертификатом, если SoapUI удалось успешно подключиться к веб-сервису без установки сертификата?
3) Если это не проблема с сертификатом, кто-нибудь может посоветовать, какой код мне нужно использовать для создания запроса Soap, который успешно аутентифицируется, а затем выполняет вызов метода? Я предполагаю, что это тот случай, когда мой сгенерированный Java-запрос выглядит максимально похожим на сгенерированный SoapUI-запрос.