使用Java获取证书和签名值

时间:2014-02-04 16:47:41

标签: java certificate digital-signature

我需要调用webservice。为了调用该Web服务,我需要在Java中为Java请求提供证书链和签名值(webservice中的数据类型为String)。

我使用wsimport从wsdl生成源代码并在我的Java程序中使用它。我有一个数字签名证书文件(certificateFile.pfx)(我可以使用密码)。

最终的SOAP消息示例应该类似于

<soapenv:Envelope
    xmlns:soapenv = "http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:v = "http://www.something.com">
    <soapenv:Header/>
    <soapenv:Body>
        <v:Auth>
            <v:userID>xxxxxxxxxx</v:userID>
            <v:password>xxxxxxxxxx</v:password>
            <v:certChain>xxxxxxxxxx</v:certChain>
            <v:signature>xxxxxxxxxx</v:signature>
        </v:Auth>
    </soapenv:Body>
</soapenv:Envelope>

从WSDL生成java源代码后,对于Auth,我正在设置这样的值。 (以下所有4个字段都是字符串数据类型)

Auth authInfo = new Auth();
authInfo.setUserID(userId);
authInfo.setPassword(password);
authInfo.setCertChain("");
authInfo.setSignature("");

这里我没有为CertChain和Signature设置什么。

由于我有证书文件,我试过这个

XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
// Load the KeyStore and get the signing key and certificate.
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(new FileInputStream(new File(certificateName)),
                            certificatePassword.toCharArray());
KeyStore.PrivateKeyEntry keyEntry =
    (KeyStore.PrivateKeyEntry) ks.getEntry(
        certificateAlias,
        new KeyStore.PasswordProtection(
            certificatePassword.toCharArray()));
X509Certificate cert =
    (X509Certificate) keyEntry.getCertificate();

并使用

authInfo.setSignature(new String(cert.getSignature()));

但都没有效果。 cert.getSignature()返回的二进制数据实际上不是字符串。

我没有得到为这两个字段设置的内容。如何使用我的证书文件获取Java中的certificateChain值和签名值?遗憾的是,我无法联系网络服务提供商以获取更多相关信息。我想如果我在字节数组中得到certificateChain和签名,我可以new String(byte[])并在SOAP字段中使用该值。如何获得byte[]certificateChiain和签名?

我该如何解决这个问题?有什么建议吗?

2 个答案:

答案 0 :(得分:3)

您可能需要将签名编码为Base64编码。 Base64是处理二进制数据(如签名)的最广泛使用的方法,应该通过基于文本的协议(如WDSL)传输。有很多好的库可以从Base64进行编码和解码,例如apache commonsGuava

答案 1 :(得分:0)

如果您使用cert.getEncoded - &gt;这将返回证书值,而不是签名。你想看到你的签名,所以你需要使用

byte[] signature = cert.getSignature();
 System.out.println(Base64.encode(encoded));