1

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

1 回答 1

1

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

不,不是。它是验证整个链,直到在您的信任库中找到受信任的签名证书。“自签名”与它无关,而“受信任...根 CA”仅表示它存在于您的信任库中。

因此,您需要做的就是将该证书添加到您的信任库中。您根本不需要编写任何代码。

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

于 2018-05-17T10:16:37.567 回答