繁体   English   中英

Java中的MongoDB SSL仅适用于中间证书

[英]MongoDB ssl in java works only with intermediate certificate

我正在通过SSL连接使用MongoDB 2.6.3。
我没有使用客户端验证,并且SSL配置仅为:

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

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

问题是:我试图通过仅通过SignerCA指定信任存储来通过Java连接,并且一切正常。 但是,当我仅使用RootCA指定信任库时,我得到:

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

在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时,由于某种原因我无法连接...
我很乐意提供建议。 谢谢。

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

为了举例说明,让我们假设Alice在Security Corp找工作。Alice有Bob的推荐(签名证书),而Charlie又推荐了(签名)证书。 如果Security Corp仅能访问Bob的Alice推荐(签名),并且Security Corp信任Charlie但不知道Bob是谁,则他们没有理由信任Alice。 Security Corp需要访问Charlie推荐的Bob,以便可以信任Bob推荐的Alice。

我希望这是有道理的!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM