Python 使用PyMongo和x509 SSL证书连接到MongoDB数据库时出现ServerSelectionTimeoutError错误

Python 使用PyMongo和x509 SSL证书连接到MongoDB数据库时出现ServerSelectionTimeoutError错误,python,mongodb,ssl,pymongo,Python,Mongodb,Ssl,Pymongo,我正在尝试连接到另一台服务器上的MongoDB数据库。唯一的问题是,连接到服务器需要Kerberos的专用版本。为了克服这个问题,我使用SSH隧道为Pymongo打开一个本地端口,以便与数据库进行接口,我们专门为这种情况设计了安全证书,作为预防措施。我知道,由于Mongo Shell和Robo 3T都能够连接到数据库并显示数据,因此隧道运行正常。但是,在PyMongo版本3.7.1中,我得到以下错误: ServerSelectionTimeoutError: hostname '127.0.0.

我正在尝试连接到另一台服务器上的MongoDB数据库。唯一的问题是,连接到服务器需要Kerberos的专用版本。为了克服这个问题,我使用SSH隧道为Pymongo打开一个本地端口,以便与数据库进行接口,我们专门为这种情况设计了安全证书,作为预防措施。我知道,由于Mongo Shell和Robo 3T都能够连接到数据库并显示数据,因此隧道运行正常。但是,在PyMongo版本3.7.1中,我得到以下错误:

ServerSelectionTimeoutError: hostname '127.0.0.1' doesn't match either of '<redacted server1>', '<redacted server1 wildcard domain>', '127.0.0.1'
此错误最重要的部分是主机名“127.0.0.1”与“127.0.0.1”不匹配。。这对我来说毫无意义,因为它显然是匹配的,Mongo Shell和Robo 3T使用x509 SSL证书连接到数据库时没有任何疑虑

对于域外的Mongo shell,似乎没有问题:

$  pkinit -f <user>
     <user> PIN:  *****************

$  /usr/local/ossh/bin/ssh -4K -nNT -L 27017:127.0.0.1:<mongo_port> <user>@<server1>

$ ./mongo --host 127.0.0.1 --port 27017 --ssl --sslCAFile ~/ssl_cert_location/mongodb6.pem

    MongoDB shell version v4.0.1
    connecting to: mongodb://127.0.0.1:27017/
    MongoDB server version: 3.6.5
    WARNING: shell and server versions do not match
  MongoDB Enterprise > use admin
    switched to db admin
$pkinit-f
别针:*****************
$/usr/local/ossh/bin/ssh-4K-nNT-L 27017:127.0.0.1:@
$./mongo--host 127.0.0.1--port 27017--ssl--sslCAFile~/ssl\u cert\u location/mongodb6.pem
MongoDB外壳版本4.0.1
连接到:mongodb://127.0.0.1:27017/
MongoDB服务器版本:3.6.5
警告:shell和服务器版本不匹配
MongoDB企业>使用管理
切换到数据库管理
因此,隧道正常工作,MongoDB没有SSL x509证书的任何问题。这就引出了一个问题:为什么Pymongo不能处理给定的x509证书?我没有在主机名列表中使用任何前导点或尾随点,这似乎是所有线程在搜索此错误时所关注的。我明确给出了x509证书中作为备用DNS主机名之一列出的确切主机名


我将非常感谢任何人能给我关于这个错误的任何帮助。提前谢谢。

这里是一些来自驱动程序的代码。 您的证书将被解析,并尝试从subjectAltName部分加载DNS名称

请注意,驱动程序区分subjectAltName中的“DNS”和“IP地址”键控条目。 我猜想您在证书中添加了“127.0.0.1”作为DNS主机名,而驱动程序将字符串“127.0.0.1”作为IP地址 因此没有对手

这就是代码失败并出现令人困惑的错误的原因。匹配失败不在于直接值,而在于 一个是IP地址,另一个是主机名

混淆发生在稍早的时候,变量
host\u ip
被分配给指定的主机名是否可以解析为 是否有IP地址。 在主机名“127.0.0.1”的情况下,我认为它被正确解析并分配给
host\u ip变量

现在这个检查将失败 并且它与证书DNS主机名部分中的“127.0.0.1”不匹配

修复 您的证书的
subjectAltName
字段可能如下所示:

subjectAltName=DNS:,DNS:,IP:127.0.0.1

我现在也有同样的问题。前一天它工作得很好,但现在突然它不是来自pymongo,而是其他任何方式。您解决了问题吗?评论不错,但请检查此链接:。一切都从这里开始。因此,SAN解析是一个已知的错误,正在修复中。Link需要登录到viewSry,问题是,在[alt_names]IP.1=99.999.99.001的情况下,尝试通过使用SAN的SSL通过mongo shell访问mongoDB是不可能的。它必须用作DNS.1=99.999.99.001。MongoDB支持:目前支持在SAN中使用CN或DNS名称进行主机名验证。此票据用于实现对SAN中IP地址类型的支持。这仍然是一个悬而未决的问题,通过IP建立连接的唯一方法是如上所述使用DNS。它工作了好几天,但突然收到错误消息:“pymongo.errors.ServerSelectionTimeoutError:hostname'10.132.35.142'与'10.132.35.142'、'132.52.152.23'都不匹配,这是mongoDB正在调查的问题
$  pkinit -f <user>
     <user> PIN:  *****************

$  /usr/local/ossh/bin/ssh -4K -nNT -L 27017:127.0.0.1:<mongo_port> <user>@<server1>

$ ./mongo --host 127.0.0.1 --port 27017 --ssl --sslCAFile ~/ssl_cert_location/mongodb6.pem

    MongoDB shell version v4.0.1
    connecting to: mongodb://127.0.0.1:27017/
    MongoDB server version: 3.6.5
    WARNING: shell and server versions do not match
  MongoDB Enterprise > use admin
    switched to db admin