当前位置: 首页 > 知识库问答 >
问题:

无法对MongoDB v2进行身份验证。6个使用mongo java驱动程序的x509证书

楚俊杰
2023-03-14

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

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

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

我已经从mongob 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。密钥(包含私钥)

按照mongo的说明,我将密钥和证书连接到一个文件中

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=my位置”然后我将该主题添加到数据库上的用户

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 }
  }
)

在我的梦中。在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驱动程序版本2.12.0连接到MongoDB

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

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

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

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

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

谢谢你的帮助。

共有1个答案

尹赞
2023-03-14

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

  • javax.net.ssl.key存储类型=pkcs12
  • javax.net.ssl.key存储=/path/to/pkc
  • javax.net.ssl.key存储密码=
  • javax.net.ssl.trust存储类型=jks
  • javax.net.ssl.trust存储
  • javax.net.ssl.trust存储密码=

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

 类似资料:
  • 问题内容: 是否有人对如何使用HTTPClient 4.0.1通过x509证书执行客户端身份验证有任何友好的提示? 感谢您的时间。 问题答案: 这是一些代码,助您一臂之力。该是包含客户端证书的对象。如果服务器使用的是自签名证书,或者包含的cacerts文件中的JVM认可的不是CA所签名的证书,则需要使用。否则,要使用默认的cacerts文件,请传递给truststore参数。

  • 您好,我是Spring security的新手, 我的任务是通过匹配从x509客户端证书检索到的用户名,根据active directory对用户进行身份验证。到目前为止,我所做的是启用ssl相互身份验证 现在我有了安全措施,上面的部分工作正常。xml文件,我在其中配置了与x509参考和Active directory配置相关的所有内容 现在我面临的问题是,当我试图检索SecurityContex

  • 我正在尝试使用mongo java驱动程序3.4从java访问mongodb。我写了下面的代码来访问mongodb,即使我在连接时输入了错误的凭据,我仍然能够访问我的数据库。 当我试图从ubuntu的终端访问mongo数据库时。它要求认证。

  • 问题内容: 我正在尝试使用swift来对本地播放器进行身份验证,但是每次我为.authenticated属性获取错误值时,都无法使用。这是我正在使用的代码,应用启动时,主视图控制器会调用它。 它可以很好地显示登录视图,但是当我输入测试帐户登录名时,它只是将as 返回为false。iTunes Connect中的捆绑包标识符和info.plist完全相同,版本和应用程序名称也相同。iTunes Co

  • 我正在尝试使用urllib3连接到网页。代码如下所示。 如果我们假设url是需要使用用户名和密码进行身份验证的某个网页,那么我是否使用正确的代码进行身份验证? 我使用urllib2做这件事很舒服,但使用urllib3做不到同样的事情。 非常感谢

  • jwt不应该仅仅用于认证用户吗?我读到过可以在里面存储非敏感的东西,比如用户ID。将权限级别之类的东西存储在令牌中可以吗?这样我可以避免数据库调用。