【问题标题】:How to sign a certificate using BouncyCastle or Java 11如何使用 BouncyCastle 或 Java 11 签署证书
【发布时间】:2021-09-19 07:32:54
【问题描述】:

我有一个现有的证书 (C1),包括私钥,并且没有标记为 CA 并且受内部根 CA (C0) 的信任 我想用它来:

客户端:

  • 生成新的密钥对 (C2)
  • 使用 C1 签署密钥对,使其具有验证路径 C2
  • 使用 C2 执行 SSL 客户端身份验证

服务器端:

  • 接受 SSL 客户端证书
  • 验证链,无论 C1 不是 CA

到目前为止,我已经找到了有关如何使用通用密钥签署新密钥的文章: Creating an X509 Certificate in Java without BouncyCastle?

但是:

  • 生成的 C2 不受信任,因此在协商时不被接受 => 我们可能必须在 apache 端禁用客户端证书验证并在 Java 端执行它
  • 以上文章暗示了使用私有 sun JDK 方法:关于如何使用标准 jdk 11 分类或 BouncyCastle 的任何提示?

【问题讨论】:

  • 如果 C1 未标记为 X.509 下不可能的 CA。

标签: java ssl x509certificate bouncycastle


【解决方案1】:

正如 Boriss the Spider 在 cmets 中指出的那样,如果不满足以下任何条件,则不允许证书签署其他证书:

  1. 证书主题必须是通过Basic Constraints 证书扩展的CA。请参阅我的blog post,了解基本约束在实践中的工作原理以及证书链接引擎如何对违规做出反应。
  2. 证书必须在 Key Usage 证书扩展中包含 certKeySign 用法

验证链,不管 C1 不是 CA

很难禁用基本约束和密钥使用扩展验证并保留其他验证步骤,这可能需要完全禁用客户端证书验证。这是一种简单的 PKI 滥用,会导致各种漏洞,因为您无法实施正确的证书验证。

【讨论】:

  • Mh,所以您认为没有可靠的方法来检查 C2 是否已被 C1 正确签名而不乱搞?
  • 我会说“不”。检查datatracker.ietf.org/doc/html/rfc5280#section-6 以确定您必须自己实施哪些检查。我不建议以您尝试的方式运行 PKI。您必须拥有适当的 CA 证书才能签署其他证书。即使你明白了——我建议为此使用专门的 CA 软件。不要推出自己的加密货币。
  • 总而言之,我明白使用这种一次性子证书的风险在很大程度上超过了潜在的优势,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
相关资源
最近更新 更多