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

标签 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 to connect to any server

在mongo日志中我可以看到:

ERROR: SSL: error:14094416:SSL routines:SSL3_READ_BYTES:sslv3 alert certificate unknown


我的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());

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

最佳答案

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

使用一个拟人化的例子,让我们假设 Alice 正在 Security Corp 找工作。Alice 有 Bob 的推荐(签名证书),Bob 又由 Charlie 推荐(签名)。如果 Security Corp 只能访问 Bob 对 Alice 的推荐(签名),并且 Security Corp 信任 Charlie 但不知道 Bob 是谁,他们没有理由信任 Alice。 Security Corp 需要访问 Charlie 对 Bob 的推荐,以便它可以信任 Bob 对 Alice 的推荐。

我希望这是有道理的!

关于java - Java 中的 MongoDB ssl 仅适用于中间证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27732450/

相关文章:

IE8 上的 Node.js HTTPS Hello world 服务器

java - 从 java 端将文件上传到 REST 可以,但从 python 不行

java - 获取Java中的所有异常并远程发送

node.js - 将 Bluebird 用于 Mongoose ,得到 ".bind is not a function"

mongodb - mongoose 事务中创建集合的正确方法

ssl - HTTP/2 用于部署在 Intranet 上的应用程序/缺乏 SSL 可能性

java - 过滤涉及安全约束的请求

java - 有没有办法确保将线程分配给指定的一组对象?

mongodb - 使用其他 docker 容器连接本地系统 mongodb 数据库

javascript - 如何从网络服务器为 FF 和 IE 安装 SSL 客户端证书?