Спасибо @ Jcs
Так я решил проблему.Когда я попытался открыть URL веб-сервиса в браузере, он запросил сертификат клиента.Это означает, что, поскольку я уже импортировал сертификат сервера в jssecacert
в jvm, мой клиент пропустил сертификат клиента.Таким образом, вместо установки свойств javax.net.ssl.trustStore
и javax.net.ssl.trustStorePassword
я устанавливаю свойства javax.net.ssl.keyStore
и javax.net.ssl.keyStorePassword
, и все работает нормально.Я пропустил до того, что закрытый ключ и сертификат были импортированы в хранилище ключей.ImportKey
- это, в основном, идентификация клиента, которую я давно получил от того, кто сказал, что это сертификаты сервера.Это вводило меня в заблуждение.Итак, позвольте мне обобщить решение, если кто-то его ищет.
Загрузите сертификат сервера и импортируйте его в JVM cacerts или jssecacerts по системному пути.Я использовал этот пост .
Открыть URL-адрес веб-службы в браузере и, если он запрашивает сертификат клиента, это означает, что сервер настроен на получение сертификата от клиента.В случае самоподписанного сертификата у вас уже должен быть самоподписанный сертификат с сервера.Импортируйте их в хранилище ключей и задайте системные свойства для хранилища ключей, а не хранилища доверенных сертификатов, прежде чем фактически выполнять вызов веб-службы, как показано ниже.Это связано с тем, что вы уже импортировали сертификат сервера в доверенное хранилище клиента (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, вызывающем веб-службы через https, используя usertoken и пароль.
Ура!хорошо идти сейчас.