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;
        }
    }