gpt4 book ai didi

java - 使用 mongo-java-driver 使用 x509 证书对 MongoDB v2.6 进行身份验证时遇到问题

转载 作者:可可西里 更新时间:2023-11-01 09:27:26 27 4
gpt4 key购买 nike

我在使用 x509 证书从 Java/Groovy 进行身份验证时连接到 mongo v2.6 时遇到困难。我用 ssl 构建了 mongo,感觉我已经正确配置了它。

我们的项目有两个连接到 Mongo 的应用程序 - 一个用 NodeJS 编写,一个用 Java/Groovy 编写。 NodeJS 项目成功地能够使用 X509 证书和查询进行身份验证。此外,我还可以通过指定 ssl 并在命令行上提供 PEM 文件来 shell 进入 mongo。但是,我无法使用 Java Mongo 驱动程序连接到 mongo。如果能提供一些帮助,我将不胜感激,以下是我迄今为止采取的步骤:

使用 SCONS 构建 MongoDB 2.6 以通过 ssl 运行:

我已经从 mongodb github 页面下载了 2.6 版本的 MongoDB

然后,用 scons 构建它以包含 ssl

scons --64 --dd --ssl all
scons --ssl --prefix=/opt/mongo install

为 Mongo 生成 key ::

我生成了以下 key /证书

openssl req -new -newkey rsa:1024 -nodes -out myMongo.req -keyout myMongo.key -subj "/C=US/ST=myState/CN=myMongo/OU=myUnit/L=myLocation" -days 36500
openssl x509 -CA myCA.pem -CAkey myCa.key -CAserial myCa.srl -req -in myMongo.req -out myMongo.pem -days 36500

这给了我以下文件:

  • myMongo.key(包含私钥)
  • myMongo.pem(包含证书)
  • myMongo.req(包含证书请求)(我不确定是否需要这个,还没有用过)

按照mongo的说明,我将 key 和证书拼接成1个文件

cat myMongo.key myMongo.pem > combined.pem

按照 x509 配置的 mongo 说明: http://docs.mongodb.org/manual/tutorial/configure-x509/

openssl x509 -in combined.pem -inform PEM -subject -nameopt RFC2253

这给了我主题:“C=US,ST=myState,CN=myMongo,OU=myUnit,L=myLocation”然后我将该主题添加到数据库中的用户

db.getSiblingDB("$external").runCommand(
{
createUser: "C=US,ST=myState,CN=myMongo,OU=myUnit,L=myLocation",
roles: [
{ role: 'readWrite', db: 'mydbName' },
{ role: 'userAdminAnyDatabase', db: 'admin' }
],
writeConcern: { w: "majority" , wtimeout: 5000 }
}
)

在我的 mongod.conf 文件中,我指定了以下选项:

sslMode = requireSSL
sslPEMKeyFile = /path/to/my/combined.pem
sslCAFile = /path/to/myCA.pem

此时,我可以启动

mongod --config /path/to/my/mongod.conf

启动后只能通过指定访问shell

mongo --ssl -- sslPEMKeyFile /path/to/my/combined.pem

从 Java-Mongo-Driver 版本 2.12.0 连接到 MongoDB

我正在尝试遵循 java-mongo-driver github 页面上给出的示例:

"https://github.com/mongodb/mongo-java-driver/blob/master/src/examples/example/X509CredentialsExample.java "

代码失败并出现异常,我们将在下面提供该异常,但您尝试通过仅提供字符串格式的 DN 而不是实际将证书附加到请求来尝试连接似乎很奇怪。这不会破坏 X509 的全部目的吗?我们查看了 Ruby 示例,他们附加了一个 pem 文件。我的团队了解 Java keystore 和信任库,如果这是我们应该做的,他们会很乐意以愉快的方式发送该 pem 文件。此外,在使用节点驱动程序时,我们绝对指定了 PEM 文件的位置。

最后的结果是这样的。我们可以很好地实例化 MongoClient,我们甚至可以使用 db 对象获取一个集合。当我们尝试以任何方式查询任何集合时,我们会返回一个异常消息“无法连接到任何服务器”。

MongoClientOptions.Builder 允许我们添加此信息似乎是合乎逻辑的,因为这似乎是其他地方的做法。但是我们对该类进行了自省(introspection),以防它从文档中丢失,据我们所知,其中没有任何与 x509 相关的内容。

感谢您的帮助。

最佳答案

在您链接到的示例中,请注意它仅使用 SSLSocketFactory.getDefault(),它依赖于 JDK 定义的系统属性来指定 keystore 和信任库,例如

  • javax.net.ssl.keyStoreType=pkcs12
  • javax.net.ssl.keyStore=/path/to/pkc
  • javax.net.ssl.keyStorePassword=
  • javax.net.ssl.trustStoreType=jks
  • javax.net.ssl.trustStore=/path/to/truststore
  • javax.net.ssl.trustStorePassword=

您必须将您的客户端证书添加到 keystore ,并将 MongoDB 服务器的签名机构证书添加到信任库。

关于java - 使用 mongo-java-driver 使用 x509 证书对 MongoDB v2.6 进行身份验证时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22995541/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com