感谢 @Jcs
这是我解决问题的方法。当我尝试在浏览器中打开webservice URL时,它要求提供客户端证书。这意味着,因为我已经在jvm中的jssecacert
中导入了服务器证书,我的客户端缺少客户端证书。所以,我设置了javax.net.ssl.keyStore
和javax.net.ssl.keyStorePassword
属性,而不是设置javax.net.ssl.trustStore
和javax.net.ssl.trustStorePassword
属性,现在它可以正常工作了。我之前错过了将私钥和证书导入密钥库的事实。ImportKey
基本上是我很久以前从某人那里收到的客户端身份标识,他说那些是服务器证书,这让我产生了误导。因此,如果有人正在寻找解决方案,让我总结一下。
下载服务器证书并将其导入到JVM cacerts或系统路径上的jssecacerts中。
我使用了这篇文章。
在浏览器中打开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用户令牌和密码的情况下,使用自签名证书来调用通过https连接的Web服务的Axis2客户端。
干杯!现在可以开始了。