我需要调用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
和签名?
我该如何解决这个问题?有什么建议吗?
答案 0 :(得分:3)
您可能需要将签名编码为Base64编码。 Base64是处理二进制数据(如签名)的最广泛使用的方法,应该通过基于文本的协议(如WDSL)传输。有很多好的库可以从Base64进行编码和解码,例如apache commons或Guava。
答案 1 :(得分:0)
如果您使用cert.getEncoded - &gt;这将返回证书值,而不是签名。你想看到你的签名,所以你需要使用
byte[] signature = cert.getSignature();
System.out.println(Base64.encode(encoded));