Https 如何在Axis2 Java客户端中使用自签名证书?
我已经使用Https 如何在Axis2 Java客户端中使用自签名证书?,https,client,certificate,axis2,Https,Client,Certificate,Axis2,我已经使用org.codehaus.mojo AxistTools maven插件生成了代码。我正在尝试通过https连接到web服务。我已将服务器证书安装到jssecacerts中,并将此密钥存储复制到/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/文件夹中。这意味着我在客户机密钥库中有服务器证书。我还将服务器私钥和证书导入kestore.ImportKey密钥存储。我想我将不得不使用这
org.codehaus.mojo AxistTools maven插件生成了代码。我正在尝试通过https连接到web服务。我已将服务器证书安装到jssecacerts中,并将此密钥存储复制到/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/
文件夹中。这意味着我在客户机密钥库中有服务器证书。我还将服务器私钥和证书导入kestore.ImportKey密钥存储。我想我将不得不使用这个作为信任商店。现在,如何在java客户机中将所有这些连接在一起?
我在客户端使用自动生成的存根。我试着使用下面的方法,但不起作用
System.setProperty("javax.net.ssl.trustStore","certs/keystore.ImportKey");
System.setProperty("javax.net.ssl.trustStorePassword", "importkey");
我得到以下例外
faultString: javax.net.ssl.SSLHandshakeException:
sun.security.validator.ValidatorException:
PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
证书是有效的,因为我在同一主机上通过HTTPS客户端使用相同的证书。此外,我还能够看到使用相同证书的成功curl请求。实际上,我不知道如何使用自签名服务器证书在https
上编写Axis2 soap Java客户端。谁能告诉我一个循序渐进的例子 在客户端,您不需要证书私钥来信任服务器。由于您在问题中写道您在keystore.ImportKey
中导入了证书和密钥,因此我认为它们已作为PrivateKeyEntry
导入(您可以使用keytool
验证密钥库中的条目类型)
但是,如果要将证书用作信任锚点,则应将证书作为TrustedCertificateEntry
导入。可以使用keytool
:
keytool -importcert -trustcacerts -alias myTrustAnchor -file /path/to/cert.crt -keystore /path/to/keystore
然后,您可以在应用程序中配置信任库:
System.setProperty("javax.net.ssl.trustStore","/path/to/keystore");
谢谢@Jcs
这就是我解决问题的方法。当我尝试在浏览器中打开webservice URL时,它要求提供客户端证书。这意味着,因为我已经在jvm的jssecacert
中导入了服务器证书,所以我的客户端缺少客户端证书。因此,我没有设置javax.net.ssl.trustStore
和javax.net.ssl.trustStorePassword
属性,而是设置javax.net.ssl.keyStore
和javax.net.ssl.keystrepassword
属性,并且工作正常。我错过了将私钥和证书导入密钥库这一事实ImportKey
基本上是客户端身份,我很久以前就收到有人说这些是服务器证书。这误导了我。因此,如果有人在寻找,让我总结一下解决方案
下载服务器证书并导入系统路径上的JVM cacerts或jssecacerts。
我用过
在浏览器中打开webservice URL,若它请求客户端证书,则表示服务器设置为期望从客户端获得证书。对于自签名证书,您必须已经拥有来自服务器的自签名证书。在实际调用web服务之前,将它们导入密钥库,并为密钥库而不是信任库设置系统属性,如下所示。这是因为您已经将服务器证书导入客户端信任存储(cacerts
)
代码:
此外,在我的例子中,服务器希望在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;
}
}
我希望本文详细解释了如何在axis2客户机上使用usertoken和password通过https调用web服务时使用自签名证书、WSSE用户令牌和密码
干杯!很好,现在就走
((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;
}
}