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

Python3上Pymongo的SSL握手问题

别俊誉
2023-03-14

尝试连接到Azure CosmosDB mongo服务器会导致SSL握手错误。

我正在使用<code>Python3连接到我的Azure CosmosDB。如果我使用Python27运行代码,连接工作正常,但使用python 3时会导致以下错误:

import pymongo
from pymongo import MongoClient
import json
import sys

def check_server_status(client, data):
   '''check the server status of the connected endpoint'''
   db = client.result_DB
   server_status = db.command('serverStatus')
   print('Database server status:')
   print(json.dumps(server_status, sort_keys=False, indent=2, separators=(',', ': ')))
   coll = db.file_result
   print (coll)
   coll.insert_one(data)

def main():
    uri = "mongodb://KEY123@backend.documents.azure.com:10255/?ssl=true&replicaSet=globaldb"
    client = pymongo.MongoClient(uri)
    emp_rec1 = {
        "name":"Mr.Geek",
        "eid":24,
        "location":"delhi"
        }
    check_server_status(client, emp_rec1)

if __name__ == "__main__":
    main()

在<code>Python3

pymongo.errors.ServerSelectionTimeoutError: SSL 握手失败: backendstore.documents.azure.com:10255: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:749)

以下是我使用Python27运行相同代码时的成功输出:

数据库服务器状态:{“_t”:“OKMongoResponse”,“ok”:1}集合(数据库(MongoClient(主机=['backend.documents.azure.com:10255'),document_class=dict,tz_aware=False,connect=True,ssl=True,replicaset=globaldb'),u result_DB'),u file_result'))

共有3个答案

汤枫
2023-03-14

PyMongo官方文档“TLS / SSL和PyMongo的TLS错误疑难解答”部分介绍了如下问题。

TLS 错误通常分为两类:证书验证失败或协议版本不匹配。类似于以下内容的错误消息表示 OpenSSL 无法验证服务器的证书:

[SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败

这通常是因为OpenSSL无法访问系统的根证书或者证书过期。Linux用户应该确保从他们的Linux供应商那里安装了最新的根证书更新。使用从python.org下载的Python 3.6.0或更新版本的macOS用户可能需要运行Python附带的脚本来安装根证书:

打开“/Applications/Python

较旧的PyPy和PyPy3可移植版本的用户可能必须设置一个环境变量来告诉OpenSSL在哪里可以找到根证书。这可以使用pypi的认证模块轻松完成:

$ pypy -m pip install certifi
$ export SSL_CERT_FILE=$(pypy -c "import certifi; print(certifi.where())")

您可以尝试按照上面的描述来修复您的问题,这似乎适用于Linux和Mac用户。在Windows上,我无法在Python3.73.6中重现您的问题。如果您有任何疑虑,请随时告诉我。

东郭展
2023-03-14

解决了此更改的问题:

client = pymongo.MongoClient(uri, ssl_cert_reqs=ssl.CERT_NONE)
申思远
2023-03-14

在Windows上,您可以这样做

pip安装证书

然后在代码中使用它:

import certifi
ca = certifi.where()

client = pymongo.MongoClient(
"mongodb+srv://username:password@cluster0.xxxxx.mongodb.net/xyzdb?retryWrites=true&w=majority", tlsCAFile=ca)
 类似资料:
  • 我尝试为Dovecot启用SSL。因此,我使用OpenSSL生成/安装证书。但是当我试图测试conncection时,客户机报告错误。也许有人能帮我。指引我正确的方向? 命令行输入:openssl s_client-connect localhost:pop3s 结果/错误: Dovecot版本:2.0.9 Openssl版本:1.0.1e-FIPS2013年2月11日 SSL的Dovecot配置

  • 我正在尝试在我的Kafka服务器上启用SSL身份验证。我在Kafka文档中遵循7.2节。 遵循了所有步骤,但是当调用Producer.bat文件将数据发送到主题时,我得到了下面的错误。

  • 堆栈:React,NGINX 1.14.0,GUnicorn,Django 2.2.8,Python 3.6.9 错误: 在浏览器:当React调用Django API(当然在请求头中有)时,大约30秒后在浏览器控制台出现CORS错误。 在浏览器控制台:CORS策略阻止从源“https://mydomain”访问“https://mydomain:8000/somethy/”处的XMLHttpRe

  • 我已经在预打包的jetty服务器前面安装了http反向代理。jetty服务器是预配置的应用程序,不太灵活。此Jetty服务器将只接受SSL请求。 我将nginx配置为使用自己的SSL证书在443上侦听SSL流量。然后在nginx后面,我在另一台运行jetty服务器的机器上有另一台服务器,在端口443上有自己的证书。 我的Nginx配置如下所示, 如果我在https上点击jetty服务器,就会得到一

  • 99.110.244:443 2017/09/28 13:03:51[错误]34080#34080:*1062 SSL握手中的对等方关闭连接(104:由对等方重置连接),同时与上游进行SSL握手,客户端:10.210.0.81,服务器:webshop.domain.be,请求:“get/http/1.1”,上游:“https://10.1.10.61:443/,主机:”webshop.domain

  • 我正在学习SSL通信,我遇到了这个问题。我正在编写一个简单的客户端,它试图与本地apache服务器握手。服务器启用https。我将服务器证书添加到所有可能的信任存储(jdk中的一个 注意:我从以下教程中获取了代码: http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#KRB 停留