gpt4 book ai didi

java - 确保已颁发的证书不会自行颁发证书

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:17:03 28 4
gpt4 key购买 nike

我需要一些帮助来确保我们的 PKI 基础设施安全。这是它的工作原理:

  • 我们有一个(自签名的)CA 证书,我们的服务器可以完全控制它。
  • 所有客户端(用 Java 编写)都配置了一个只包含此 CA 证书的信任库。
  • 在安装客户端期间,服务器会颁发由我们的 CA 证书签名的客户端证书(其客户端 ID 为 CN)。
  • 然后客户端能够相互连接,当连接建立时,通过验证客户端各自的证书来执行相互的客户端身份验证。我们像这样初始化处理客户端身份验证的 TrustManager:

.

private TrustManager[] getClientCATrustManagers() throws NoSuchAlgorithmException, IOException, KeyStoreException, CertificateException {       
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("PKIX");
KeyStore trustStore = getClientCATrustStore();
trustManagerFactory.init(trustStore);

return trustManagerFactory.getTrustManagers();
}

getClientCATrustStore() 返回仅包含我们的 CA 的信任库。

这引出了我的问题。我对链验证的理解是,只要链的根是可信的并且链上的证书都没有过期,那么链就被认为是有效的。我对此担心的是,我会看到客户将能够使用其自己的证书颁发新证书的风险。 这是潜在风险吗?如果是,我该如何预防?我看到了两种可能的解决方案:

  1. 我创建了自己的 TrustManager 来防止这种情况发生。是否有任何实现已经做到了这一点?
  2. 当服务器颁发客户端证书时,我以某种方式指定不允许客户端证书颁发它自己的证书。这可能吗?如果可能,怎么做?

最佳答案

如果根是可信的并且所有中间证书都存在且有效,那么您关于证书链有效且可信的说法是正确的。

而且您关于客户根据自己的证书颁发另一个证书的潜在风险也是正确的。但有一些方法可以降低这种风险。

X509 证书(第 3 版)包含指示允许做什么或不允许做什么的扩展。

例如,您可能会对以下 2 个特定部分感兴趣:

  • 基本约束

  • key 使用

基本约束标识证书是否为 CA,这意味着如果它本身被指定为 CA,则它只能用于验证证书签名。它还指定路径长度。这限制了该 CA 可以签署/颁发的 CA 中间证书的数量。 this SO question 中对此路径长度有一个很好的解释。 .听起来您希望 CA 证书上的路径长度为 0。

Key Usage 表明这个实体被允许做什么。通常,CA 证书具有以下关键使用属性:证书签名、CRL 签名。而非 CA 或“终端实体”证书可以具有:数字签名、不可否认性、 key 加密、数据加密。

这些扩展都受 RFC5280 管辖.

这里是重要的部分。为了使这些证书扩展有意义,它们必须由使用它们的应用程序检查和强制执行。

您的客户端应用程序可以查看扩展并验证其他客户端证书的路径长度是否为 0(意味着 CA 和客户端证书之间没有中间证书)。

关于java - 确保已颁发的证书不会自行颁发证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18380783/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com