我需要一些帮助来确保我们的 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 的信任库。
这引出了我的问题。我对链验证的理解是,只要链的根是可信的,并且链上的证书都没有过期,那么这个链就被认为是有效的。对此我担心的是,我看到了客户将能够使用自己的证书来颁发新证书的风险。这是一个潜在的风险,如果是,我该如何预防?我看到了两个潜在的解决方案:
- 我创建了自己的 TrustManager 来防止这种情况。是否有任何实现已经这样做了?
- 当客户端证书由服务器颁发时,我以某种方式指定不允许客户端证书颁发它自己的证书。这可能吗?如果可以,怎么做?