当前位置: 首页 > 知识库问答 >
问题:

相互认证的密钥存储库/信任存储库中必须包含什么?

太叔景曜
2023-03-14

我正在尝试用Java执行相互身份验证。我试图实现的结构是:具有自签名证书的服务器充当CA,对客户端证书进行签名。因此,这就是我在每个密钥库/信任库中保存的内容:

客户:

密钥库:

  • 客户端的SSL密钥对。
  • 由服务器签署的证书(与密钥对相关)。

信任库:

  • 服务器的自签名证书

服务器

密钥库:

  • 服务器的SSL密钥对。
  • 自签名证书(与密钥对相关)。

信任库:

  • 服务器的自签名证书

我能够执行服务器的身份验证,但当我在服务器上启用setNeedClientAuth(true)时,我在日志中看到以下错误:http://pastebin.com/raw.php?i=P52Qq89z因此,服务器似乎在进行身份验证,但客户端无法提供CA链,这可能是其密钥库的内容有问题吗?

我使用openSSL来生成密钥和证书,使用KeyStore Explorer来创建密钥库(在几天不成功地使用keyool之后)和JDK 1.7。0_51

更新:按照以下说明解决了问题:https://stackoverflow.com/a/12150604/2891462这是如何创建CA自签名证书的问题(显然,这只是JDK1.7中的一个问题)。

共有2个答案

柳培
2023-03-14

对于相互身份验证(2路SSL),只需要做两件事情

从服务器的密钥库导出的服务器证书(不是信任存储-如果您使用的是不同的信任和密钥存储)

其次是

客户端的证书应该存在于服务器的信任库中(而不是密钥库-以防您使用不同的信任和密钥库)

此外,这里还有一个很好的博客,可以读到同样的内容

羊煜
2023-03-14

您的配置中有几处错误。

查看调试日志时,证书没有表示CA=true的基本约束。

[
  Version: V1
  Subject: CN=Ficticious bank, OU=SoE, O=University, L=London, ST=England, C=UK
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
  Key:  Sun RSA public key, 2048 bits
  Validity: [From: Wed May 07 19:21:23 BST 2014,
               To: Thu May 07 19:21:23 BST 2015]
  Issuer: CN=Ficticious bank, OU=SoE, O=University, L=London, ST=England, C=UK
  SerialNumber: [    9a7143cf f5ecfbf8]

]
  Algorithm: [SHA1withRSA]
  ...
]

如果不是CA证书,它就不能作为CA工作。见RFC 3280(和5280):

   This extension MUST appear as a critical extension in all CA
   certificates that contain public keys used to validate digital
   signatures on certificates.

其次,您还希望用作服务器的最终实体证书(EEC)的此证书没有该服务器的有效名称:没有使用者替代名称,而且CN明显与任何主机名都不匹配。虽然默认的SSLSocket在默认情况下不进行任何主机名验证(您可以对其进行配置),但为服务器证书提供有效的主机名是很有用的,因为客户端原则上应该真正验证它。

总的来说,对CA和服务器证书使用完全相同的证书似乎没有多少好处。自签名证书在单独使用时非常有用。如果您也打算将其用作CA证书,那么最好将CA证书和服务器证书分开。从长远来看,它肯定是有用的,尤其是当您必须在您的示例中的“Thu May 07 19:21:23 BST 2015”更改服务器证书时,或者如果您可能需要出于任何其他原因重新颁发服务器证书。

除此之外,您对密钥存储和信任存储有正确的想法:

>

>

  • 密钥库:

    • 客户端私钥和证书链位于同一条目中(但CA证书本身可以省略)

    信任库:

    • 可以验证服务器证书的CA证书。

    服务器

    >

  • 密钥库:

    • 服务器私钥和证书链在同一个条目中(但是CA证书本身可以省略)。

    信任库:

    • 可以验证客户端证书的CA证书

  •  类似资料:
    • 我没有找到任何关于在前端端实现逻辑来管理Azure密钥库的可能性的信息。同时,我创建了一个Node JS服务器项目使用ENV来管理Azure Key Vault,它工作成功,但我想在我的Angular应用程序中得到同样的效果。

    • 对于PGP想要使用的签名和加密密钥,我是否可以使用2个JCE、RSA或DSA keypairs?把它们保存在密钥库中,当我想使用这些密钥时,只需按需重建PGP基础结构?

    • 我有一个premium storage account,在创建这个帐户后我就启用了加密,我找到了这个链接https://docs.microsoft.com/en-us/azure/storage/storage-service-encryption来检查blob是否加密。 现在,如果我使用Azure key vault加密OS盘和数据盘,它也用于保护静止数据,但加密存储帐户也会做同样的事情。有谁

    • 证书、私钥(客户端)和客户端证书都是pem格式的,我必须将它们添加到信任存储区和密钥存储区中。我该怎么做呢?到目前为止,我在cmd(windows)中有命令: > 要生成PKC(key:客户端私钥,cert:客户端cert,CA:CACERT):openssl pkcs12-inKey key.pem-in cert.pem-export-out keystored.p12-certfile CA

    • 同一空间/存储库中机密的逻辑分组 HSM的可能性 日志记录/审核 检索/更改机密的一个位置,许多应用程序可能依赖该位置而不触及应用程序。 我不知道如何在我的Spring Boot应用程序中处理存储库访问。当我使用azure-key-vault spring boot Starter时,我必须设置Applications.Properties中的访问权限,如本教程:如何使用spring boot S

    • 问题内容: 我需要将2个密钥存储到KeyStore中,这是相关代码: 尽管我得到了执行,但“私钥必须带有证书链” 那到底是什么?以及我将如何生成它? 问题答案: 您还需要提供私钥条目的证书(公钥)。对于由CA签名的证书,链是CA的证书和最终证书。对于自签名证书,您只有自签名证书。 示例: 要生成证书,请点击以下链接: 示例: