Pymongo:SSL 握手失败:违反协议发生 EOF (_ssl.c:590)
Pymongo: SSL handshake failed: EOF occurred in violation of protocol (_ssl.c:590)
使用 pymongo 连接到 MongoDB 时,SSL 握手失败,其中 SSL=True
Traceback (most recent call last):
File "pymongo_ssl.py", line 7, in <module>
print mongoClient.database_names()
File "/home/modak/.virtualenvs/enod-venv/local/lib/python2.7/site-packages/pymongo/mongo_client.py", line 1149, in database_names
"listDatabases")["databases"]]
File "/home/modak/.virtualenvs/enod-venv/local/lib/python2.7/site-packages/pymongo/database.py", line 491, in command
with client._socket_for_reads(read_preference) as (sock_info, slave_ok):
File "/usr/lib/python2.7/contextlib.py", line 17, in __enter__
return self.gen.next()
File "/home/modak/.virtualenvs/enod-venv/local/lib/python2.7/site-packages/pymongo/mongo_client.py", line 859, in _socket_for_reads
with self._get_socket(read_preference) as sock_info:
File "/usr/lib/python2.7/contextlib.py", line 17, in __enter__
return self.gen.next()
File "/home/modak/.virtualenvs/enod-venv/local/lib/python2.7/site-packages/pymongo/mongo_client.py", line 823, in _get_socket
server = self._get_topology().select_server(selector)
File "/home/modak/.virtualenvs/enod-venv/local/lib/python2.7/site-packages/pymongo/topology.py", line 214, in select_server
address))
File "/home/modak/.virtualenvs/enod-venv/local/lib/python2.7/site-packages/pymongo/topology.py", line 189, in select_servers
self._error_message(selector))
pymongo.errors.ServerSelectionTimeoutError: SSL handshake failed: EOF occurred in violation of protocol (_ssl.c:590)
Python代码
from pymongo import MongoClient
MONGO_URI='mongodb://localhost:27017'
mongoClient = MongoClient(MONGO_URI, ssl=True, ssl_ca_certs='ca-certs.pem')
print mongoClient.database_names()`
您的 Python 设置可能仅支持 TLS 1.0,不支持 TLS 1.1 或更高版本。这至少是我遇到的问题。
您可以这样查看:
Python 3
> from urllib.request import urlopen
> urlopen('https://www.howsmyssl.com/a/check').read()
Python 2
> from urllib2 import urlopen
> urlopen('https://www.howsmyssl.com/a/check').read()
检查键 tls_version
的输出。如果它说 TLS 1.0
而不是 TLS 1.1
或 TLS 1.2
那可能是问题所在。
如果您使用的是 virtualenv,请确保 运行 里面的命令。
解决方案:使用更新版本的 OpenSSL
安装 Python
为了支持 TLS 1.1 或更高版本,您可能需要安装更新版本的 OpenSSL,然后再安装 Python。这应该会给你一个支持 TLS 1.1 的 Python。
该过程取决于您的操作系统 – 这是 OS X 的指南。
virtualenv 用户
对我来说,我的 virtualenv 之外的 Python 有 TLS 1.2 支持,所以我删除了我的旧 virtualenv,并创建了一个具有相同包的新的,然后它就可以工作了。轻松愉快!
另见
- The warning about TLS 1.0 在 PyMongo 文档的 Python 3 部分。虽然它在 Python 3 部分下,但它也适用于 Python 2
尝试这样的事情。使用 mongoengine 为我工作:
ent#preReq: pip3 install certifi
from pymongo import MongoClient
import pymongo
import certifi
client = pymongo.MongoClient(URI, tlsCAFile=certifi.where())
使用 pymongo 连接到 MongoDB 时,SSL 握手失败,其中 SSL=True
Traceback (most recent call last):
File "pymongo_ssl.py", line 7, in <module>
print mongoClient.database_names()
File "/home/modak/.virtualenvs/enod-venv/local/lib/python2.7/site-packages/pymongo/mongo_client.py", line 1149, in database_names
"listDatabases")["databases"]]
File "/home/modak/.virtualenvs/enod-venv/local/lib/python2.7/site-packages/pymongo/database.py", line 491, in command
with client._socket_for_reads(read_preference) as (sock_info, slave_ok):
File "/usr/lib/python2.7/contextlib.py", line 17, in __enter__
return self.gen.next()
File "/home/modak/.virtualenvs/enod-venv/local/lib/python2.7/site-packages/pymongo/mongo_client.py", line 859, in _socket_for_reads
with self._get_socket(read_preference) as sock_info:
File "/usr/lib/python2.7/contextlib.py", line 17, in __enter__
return self.gen.next()
File "/home/modak/.virtualenvs/enod-venv/local/lib/python2.7/site-packages/pymongo/mongo_client.py", line 823, in _get_socket
server = self._get_topology().select_server(selector)
File "/home/modak/.virtualenvs/enod-venv/local/lib/python2.7/site-packages/pymongo/topology.py", line 214, in select_server
address))
File "/home/modak/.virtualenvs/enod-venv/local/lib/python2.7/site-packages/pymongo/topology.py", line 189, in select_servers
self._error_message(selector))
pymongo.errors.ServerSelectionTimeoutError: SSL handshake failed: EOF occurred in violation of protocol (_ssl.c:590)
Python代码
from pymongo import MongoClient
MONGO_URI='mongodb://localhost:27017'
mongoClient = MongoClient(MONGO_URI, ssl=True, ssl_ca_certs='ca-certs.pem')
print mongoClient.database_names()`
您的 Python 设置可能仅支持 TLS 1.0,不支持 TLS 1.1 或更高版本。这至少是我遇到的问题。
您可以这样查看:
Python 3
> from urllib.request import urlopen
> urlopen('https://www.howsmyssl.com/a/check').read()
Python 2
> from urllib2 import urlopen
> urlopen('https://www.howsmyssl.com/a/check').read()
检查键 tls_version
的输出。如果它说 TLS 1.0
而不是 TLS 1.1
或 TLS 1.2
那可能是问题所在。
如果您使用的是 virtualenv,请确保 运行 里面的命令。
解决方案:使用更新版本的 OpenSSL
安装 Python为了支持 TLS 1.1 或更高版本,您可能需要安装更新版本的 OpenSSL,然后再安装 Python。这应该会给你一个支持 TLS 1.1 的 Python。
该过程取决于您的操作系统 – 这是 OS X 的指南。
virtualenv 用户
对我来说,我的 virtualenv 之外的 Python 有 TLS 1.2 支持,所以我删除了我的旧 virtualenv,并创建了一个具有相同包的新的,然后它就可以工作了。轻松愉快!
另见
- The warning about TLS 1.0 在 PyMongo 文档的 Python 3 部分。虽然它在 Python 3 部分下,但它也适用于 Python 2
尝试这样的事情。使用 mongoengine 为我工作:
ent#preReq: pip3 install certifi
from pymongo import MongoClient
import pymongo
import certifi
client = pymongo.MongoClient(URI, tlsCAFile=certifi.where())