使用mongo java驱动程序使用x509证书对MongoDB v2.6进行身份验证时遇到问题

使用mongo java驱动程序使用x509证书对MongoDB v2.6进行身份验证时遇到问题,java,mongodb,ssl,groovy,x509,Java,Mongodb,Ssl,Groovy,X509,使用x509证书从Java/Groovy进行身份验证时,我很难连接到mongo v2.6。我已经用ssl构建了mongo,并且感觉它配置正确 我们的项目有两个连接Mongo的应用程序——一个是用NodeJS编写的,另一个是用Java/Groovy编写的。NodeJS项目能够使用X509证书和查询成功地进行身份验证。此外,我还可以通过指定ssl并在命令行上提供PEM文件,来支持mongo。但是,我无法使用Java mongo驱动程序连接到mongo。我非常感谢您的帮助,以下是我迄今为止采取的步骤:

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

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

使用SCON构建MongoDB 2.6以与ssl一起运行:

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

然后,使用SCON构建它以包括ssl

scons --64 --dd --ssl all
scons --ssl --prefix=/opt/mongo  install
正在为Mongo:生成密钥:

我生成了以下密钥/证书

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的说明,我将密钥和证书连接到一个文件中

cat myMongo.key myMongo.pem > combined.pem
遵循x509配置的mongo说明:

这给了我一个主题:“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
启动后,我只能通过指定

mongo --ssl -- sslPEMKeyFile /path/to/my/combined.pem
从Java Mongo驱动程序版本2.12.0连接到MongoDB

我试图遵循java mongo驱动程序github页面上给出的示例:

“”

代码失败了,我们将在下面提供一个异常,但是您试图通过仅提供字符串格式的DN而不是实际将证书附加到请求来进行连接,这似乎很奇怪。这不正是X509的初衷吗?我们看了Ruby示例,他们附加了一个pem文件。我的团队了解java密钥库和信任库,如果这是我们应该做的,他们会很高兴地发送pem文件。此外,当使用节点驱动程序时,我们绝对指定PEM文件的位置

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

MongoClientOptions.Builder允许我们添加这些信息,这似乎是合乎逻辑的,因为其他地方似乎就是这样做的。但是我们对这个类进行了一次内省,以防文档中缺少它,而且据我们所知,这个类中没有与x509相关的内容


非常感谢您的帮助。

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

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

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

jyemin,感谢您的响应。我仍然无法让它为Java工作。我已经粘贴了我的示例。你介意看一下吗?它基本上是Java Mongo驱动程序X509示例中的一个rip,并添加了您提到的属性。@Lentejas,您能否查看客户端应用程序日志,看看是否有任何日志消息包含更具体的SSL相关异常?它将从这里生成:并且应该包含一个更具体的SSL相关异常。您还记得异常是什么吗?你能解决这个问题吗?我怀疑我的头也碰到了同样的问题。
mongo --ssl -- sslPEMKeyFile /path/to/my/combined.pem