java中的MongoDB ssl仅适用于中间证书

时间:2015-01-01 16:19:37

标签: java mongodb ssl ca

我使用带有SSL连接的MongoDB 2.6.3 我没有使用客户端验证,SSL配置只是:

  

sslMode = requireSSL
    sslPEMKeyFile = /path/to/MyServerCertificate.pem

我使用的证书已签名,并由具有根CA的CA颁发给我的服务器,如下所示:
RootCA ---> SignerCA ---> MyServerCertificate

问题是:我试图通过指定信任存储与仅限SignerCA 来通过java进行连接,一切正常。但是,当我使用仅RootCA 指定信任存储时,我得到:

  

com.mongodb.MongoServerSelectionException:Unabe连接到任何服务器

在mongo日志中我可以看到:

  

错误:SSL:错误:14094416:SSL例程:SSL3_READ_BYTES:sslv3警报证书未知


我的java代码:

Builder options = MongoClientOptions.builder();

KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("path/to/keystore"), "pass".toCharArray());

TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustFactory.init(ks);

SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustFactory.getTrustManagers(), null);

options.socketFactory(sc.getSocketFactory());
new MongoClient("loclahost", options.build());

当我使用的密钥库仅包含RootCA时,由于某种原因我无法连接...
我很乐意提出建议。感谢。

1 个答案:

答案 0 :(得分:1)

您所看到的问题是因为TrustManager无法在您的证书,签名者CA和根CA之间建立链接。由于您的证书仅包含对签名者CA的引用,因此就TrustManager而言,证书与根CA之间没有链接。您需要提供签名者CA以显示该链接存在于受信任的颁发机构。

为了使用一个人格化的例子,让我们假装爱丽丝正在寻找安全公司的工作。爱丽丝有一个建议书(签名证书),鲍勃反过来被查理推荐(签名)。如果Security Corp只能访问Bob对Alice的推荐(签名),而Security Corp信任Charlie但不知道Bob是谁,则他们没有理由信任Alice。 Security Corp需要访问Charlie对Bob的推荐,以便它可以信任Bob对Alice的推荐。

我希望这是有道理的!