【问题标题】:Java - Digital signature using private key for sending data to an external web serviceJava - 使用私钥将数据发送到外部 Web 服务的数字签名
【发布时间】:2011-05-10 20:58:39
【问题描述】:

我需要从运行在 Tomcat 6 上的 Java 应用程序连接到外部 Web 服务。我为我的域购买了 SSL 证书并安装在我的服务器上。现在我需要连接到外部服务并使用我的证书私钥对使用 SHA-256 哈希和 128 位盐长度的服务的任何数据进行数字签名。如何使用私钥创建此签名?我可以为盐选择任何值吗?他们能否使用我的 SSL 证书中的公钥对其进行解密?

我可以为此使用Bouncy Castle 库吗?任何有关该主题的代码或教程将不胜感激。

【问题讨论】:

  • 请注意,签名和加密不是一回事。如果您使用您的私钥签名,他们将能够使用您的公钥验证签名,但不会进行加密(因此没有解密)。

标签: java tomcat ssl digital-signature


【解决方案1】:

JCA 文档提供了使用Signature 的示例(在Generating and Verifying a Signature Using Generated Keys 下。您可以使用SHA256withRSA 而不是SHA1withDSA,因为SunRsaSignProvider 支持它(假设它是一个RSA 密钥)。您不应该为此需要 BouncyCastle。

如果你想使用 BouncyCastle,你需要按照以下方式做一些事情(我没有尝试过这个特定的代码):

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();

(如果您在 web 应用程序中执行此操作,您还需要 web 应用程序能够访问此私钥,如果 web 应用程序受到威胁,这可能会带来安全风险。这可能值得考虑如果远程方愿意接受,则使用不同的密钥/证书,甚至是自签名的。)

【讨论】:

  • 远程方必须接受我的证书?我正在尝试了解如何使用我购买的 SSL 证书中的私钥来签署我发送的这些消息,但我不知道如何在我的应用程序中检索它。
  • 远程方已经能够根据某些东西验证您的签名:这将是匹配证书中的公钥,该公钥也将该密钥与您的服务器的身份联系起来。它将需要获取该证书,或者至少以某种方式知道从哪个公钥来验证签名。 (例如,使用 XML-DSig,证书可以与签名消息捆绑在一起。)然后它可能会根据它信任的 CA 验证您的证书。
  • 从 webapp 获取私钥是另一个问题。通常,像 Tomcat 这样的容器将它们的密钥库(以及它们自己的配置)与 web 应用程序(通常是默认安全管理器的策略,启用时)隔离开来。这允许 web 应用程序被“沙盒化”,从而无法获得容器本身的管理员访问权限。您可能能够编辑安全策略以允许 web 应用程序加载密钥库,或者使密钥库文件可从 web 应用程序读取(您甚至可以通过 JNDI 传递它)。请注意,您的 web 应用程序中的缺陷可能会危及您的私钥。
  • 目前尚不清楚您想与哪种 Web 服务交谈,但您可能想查看 WS-Security,正如@Biju Kunjummen 建议的那样,而不是自己进行签名。 Apache Rampart 也可能感兴趣。
【解决方案2】:

我强烈建议为此使用 Web 服务堆栈: 例如。一种使用 Apache CXF 的 WS-Security 客户端方法 - http://cxf.apache.org/docs/ws-security.html

另一个很好的参考:http://www.jroller.com/gmazza/entry/cxf_x509_profile

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多