如何使用 BouncyCastle 或 Java 11 签署证书
How to sign a certificate using BouncyCastle or Java 11
我有一个现有证书 (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 的任何提示?
正如 Boriss the Spider 在评论中指出的,如果不满足以下任何条件,则不允许证书签署其他证书:
- 证书主体必须是 CA,通过 Basic Constraints certificate extension. See my blog post 关于基本约束在实践中的工作方式以及证书链引擎如何对违规做出反应。
- 证书必须包含
certKeySign
在 Key Usage 证书扩展中的用法
Validate the chain regardless of C1 not being a CA
很难禁用基本约束和密钥使用扩展验证并保留其他验证步骤,这可能需要完全禁用客户端证书验证。这是一个简单的 PKI 误用,它会打开各种漏洞,因为您无法实施正确的证书验证。
我有一个现有证书 (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 的任何提示?
正如 Boriss the Spider 在评论中指出的,如果不满足以下任何条件,则不允许证书签署其他证书:
- 证书主体必须是 CA,通过 Basic Constraints certificate extension. See my blog post 关于基本约束在实践中的工作方式以及证书链引擎如何对违规做出反应。
- 证书必须包含
certKeySign
在 Key Usage 证书扩展中的用法
Validate the chain regardless of C1 not being a CA
很难禁用基本约束和密钥使用扩展验证并保留其他验证步骤,这可能需要完全禁用客户端证书验证。这是一个简单的 PKI 误用,它会打开各种漏洞,因为您无法实施正确的证书验证。