我有一个要求,即可以提供中间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有两个原因。
答案 0 :(得分:1)
默认实现是期望构建整个链,直到找到可信的自签名根CA
不,不是。它是验证整个链,直到在您的信任库中找到可信签名证书。 '自签名'与它无关,并且“信任......根CA”#39;仅仅意味着它存在于您的信任库中。
所以您需要做的就是将该证书添加到您的信任库。你根本不需要编写任何代码。
但是,为什么你不相信中间签名者而不信任根签名者是一个谜。