【问题标题】:Java verify Certificate is associated with a KeyJava 验证证书与密钥相关联
【发布时间】:2011-10-08 01:49:26
【问题描述】:

我有从不同地方收到的证书和私钥。仅给定这两个抽象对象,我是否可以验证证书是否与给定的 PrivateKey 关联,或者是否是给定 PrivateKey 的证书?

我知道这些是否用于 RSA 密钥,我可以将它们转换为 RsaPublicKey / RsaPrivateKey 并验证指数和模数是否匹配,但如果它们是 ECDSA 怎么办?其他类型呢?

我最终想将密钥存储到一个以证书作为其证书链的密钥库中,如果我尝试使用另一个密钥的证书加载密钥,我希望这会引发异常或导致某种错误。不过好像没关系?

【问题讨论】:

    标签: java cryptography bouncycastle jce


    【解决方案1】:

    首先,可以肯定的是,您可以使用您的私钥对随机数据块进行签名,并使用公钥对其进行验证。公钥是证书的一部分。它适用于所有签名算法。

    私钥结构包含匹配的公钥也很常见。你应该检查一下 - 搜索匹配的键会更容易。

    【讨论】:

    • 我认为这对我们有用。我不一定知道我手头有什么密钥类型,但我可以尝试一个 RSA 签名验证,然后是一个 ECDSA。如果其中任何一个有效,我会认为它们是有效的一对。
    【解决方案2】:

    不应该拥有私钥。它是私人的。您只需要他们的 public 密钥,然后通过 Certificate.verify(PublicKey key) 使用该密钥验证证书。

    将私钥提供给您的人只是严重损害了他们的安全。他们需要创建一个新的私钥、签名证书等,并部署它,并停止对先前密钥的所有使用。他们还需要将新的私钥保密。

    【讨论】:

    • 您如何从 OP 所说的内容中确定它不是 他的 私钥而不是其他人的私钥?
    • @GregS 因为他说 (a) 他“收到”了它们,并且 (b) 他“从不同地方收到了 [它们]”。
    • 我的意思是,在某些情况下,我将拥有一个包含证书的文件和一个包含私钥的文件。如果用户已经加载了私钥并尝试为不同的密钥加载证书,我最关心的是给用户一个错误。反之亦然。
    • @ejp 我承认我可能想错了。我们最终将使用私钥/证书来创建 CMS 签名数据块。问题是我们不能保证我们在同一个文件或包中同时获得用户的私钥和证书。此外,证书可能与私钥位于不同的媒体上,因此在加载第一个证书后可能需要一些时间来查找和加载另一个证书。因此,我们不要求用户同时加载两者,并且希望在他们加载时添加一个检查,以确保他们加载的内容是正确的。
    • @tal 用户需要一步提供签名数据,否则你会遇到一个不值得解决的可行性问题。理想情况下,签名应该由用户完成,例如一个可以在他同意的情况下访问他已经存在的私钥的小程序(例如,他的 HSM 中的密码或 PIN)。随身携带私钥违背了 PKU 的每一条原则。
    猜你喜欢
    • 1970-01-01
    • 2018-08-06
    • 2017-03-23
    • 2019-09-18
    • 2014-06-09
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 2021-04-13
    相关资源
    最近更新 更多