Java SSL TrustManager上的部分链验证

时间:2018-05-17 09:37:22

标签: java ssl trustmanager sslcontext

我有一个要求,即可以提供中间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,但我想探索不同的方法。

1 个答案:

答案 0 :(得分:1)

  

默认实现是期望构建整个链,直到找到可信的自签名根CA

不,不是。它是验证整个链,直到在您的信任库中找到可信签名证书。 '自签名'与它无关,并且“信任......根CA”#39;仅仅意味着它存在于您的信任库中。

所以您需要做的就是将该证书添加到您的信任库。你根本不需要编写任何代码。

但是,为什么你不相信中间签名者而不信任根签名者是一个谜。