我有一个要求,可以提供一个中间CA来信任,但不能提供签名的CA。使用它作为信任存储,我希望能够信任具有由此中间 CA 签名的证书的 SSL 服务器。默认实现是期望构建整个链,直到找到受信任的自签名根 CA。我相信这就是整个 X509 平台的基础。但出于某些原因,我只能提供中间 CA。
代码是通常的SSLContext创建:
// keystore part is pseudocode to make a point
KeyStore keyStore = someWayToGenerateKeyStore;
keyStore.add(intermediateCa);
//keyStore.add(rootCaThatSignedTheIntermediateCaAbove); it will work if I add this. But I don't want to for reasons.
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(keyStore);
SSLContext ctx = SSLContext.getInstance("TLSv1.2");
ctx.init(new KeyManager[], tmf.getTrustManagers(), new SecureRandom());
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setSslContext(ctx);
client = new WebSocketClient(sslContextFactory);
OpenSSL有一个参数似乎有效。所以我想这不是一个完全非正统的方法。
openssl verify -CApath /dev/null -partial_chain -trusted g1 g0
要求在信任库中仅具有中间 CA 有两个原因。
- 这样可以更轻松地在当前依赖于单个自签名 CA 证书的系统中传递一个受信任的证书。许多组件的通信和设置目前需要单个证书,而更改该证书需要进行重大重构。
- 我们希望确保只信任由给定的中间 CA 证书签名的证书。如果我们将链中的其他 CA 证书添加到信任存储中,SSL 实现将信任由其他 CA 签名的任何证书,这也是我们希望避免的。可能还有其他方法可以做到这一点,例如检查issuer_dn但我想探索不同的方法。
默认实现是期望构建整个链,直到找到受信任的自签名根 CA
不,不是。它是验证整个链,直到在您的信任库中找到受信任的签名证书。"自签名"与此无关,而"受信任...root CA' 只意味着它存在于您的信任库中。
因此,您需要做的就是将该证书添加到您的信任库。您根本不需要编写任何代码。
但是,为什么要信任中间签名者而不信任根签名者是一个谜。