我需要从运行在Tomcat 6上的Java应用程序连接到外部Web服务。我在我的服务器上购买并安装了我的域的SSL证书。现在,我需要连接到外部服务并使用我的证书私钥对使用SHA-256哈希和128位盐长度的服务数据进行数字签名。如何使用私钥创建此签名?我可以选择盐的任何值吗?他们是否可以使用SSL证书中的公钥解密它?
我可以使用Bouncy Castle库吗?任何有关该主题的代码或教程都将受到赞赏。
答案 0 :(得分:0)
JCA文档提供了使用Signature
的示例(在Generating and Verifying a Signature Using Generated Keys下。您使用SHA256withRSA
代替SHA1withDSA
,因为{{3}支持AsymmetricKeyParameter keyParam = PrivateKeyFactory.createKey(...);
// You might need to cast to private key to RSAPrivateKey
// and get its attributes manually here.
SHA256Digest digest = new SHA256Digest();
RSADigestSigner signer = new RSADigestSigner(digest);
signer.init(true, keyParam);
signer.update(... data to sign, start, length, ...);
byte[] signature = signer.generatedSignature();
(假设它是一个RSA密钥)。你不应该为此需要BouncyCastle。
如果你想使用BouncyCastle,你需要在这些方面做一些事情(我还没有尝试过这个特定的代码):
{{1}}
(如果您是在webapp中执行此操作,则还需要Web应用程序才能访问此私钥,如果Web应用程序遭到入侵,这可能会带来安全风险。可能值得考虑如果远程方愿意接受,则使用不同的密钥/证书,甚至是自签名。)
答案 1 :(得分:0)
我强烈建议您使用Web服务堆栈: 例如。使用Apache CXF的WS-Security客户端方法 - http://cxf.apache.org/docs/ws-security.html
另一个好的参考:http://www.jroller.com/gmazza/entry/cxf_x509_profile