我正在尝试使用密钥文件连接到AWS实例上托管的MongoDB。我能够ssh到实例并连接到数据库没有问题。当我尝试使用pymongo从远程位置连接到数据库时,我收到此错误:
ServerSelectionTimeoutError: SSL handshake failed: EOF occurred in violation of protocol
端口27017已打开,源设置为0.0.0.0/0。
from pymongo import MongoClient
client = MongoClient('mongodb://ec2-123-45-678-910.compute-1.amazonaws.com',
27017,
ssl=True,
ssl_keyfile='/path_to/mykey.pem')
db = client.test
coll = db.foo
coll.insert_many(records)
ServerSelectionTimeoutError: SSL handshake failed: EOF occurred in violation of protocol (_ssl.c:645)
This问题几乎与我的问题完全相同,但错误不同,此处发布的解决方案不适用于我的问题。
这里的地址和密钥已经更改,我已经在这里圈了几个小时没有运气,任何帮助都将不胜感激。
答案 0 :(得分:3)
由于以下问题,此问题可能会导致:
1)pymongo的版本(建议使用3.3.0,这对我有用)
2)它可能是DNS问题等,实际上您可以使用以下方法检查DNS问题:
telnet xx.xx.xx.xx port
3)可能是防火墙问题
4)ssl key可能存在问题。请尝试以下方法进行测试:
导入os
导入pymongo
导入ssl
URL = “URL:端口/分贝SSL =真”
client = pymongo.MongoClient(URL,ssl_cert_reqs = ssl.CERT_NONE)
db = client.get_default_database()
打印数据库
print db.collection_names()
答案 1 :(得分:2)
我与Pymongo模块有相同的问题(SSL握手)连接到DocumentDB Azure(数据库)。
错误:
ServerSelectionTimeoutError: SSL handshake failed: EOF occurred in violation of protocol (_ssl.c:590)
我使用的是pymongo == 3.4.0
解决此问题:
通过安装3.3.0版本
更改pymongo的版本 pip install pymongo==3.3.0
<强>尝试:强>
import pymongo
pymongo.__version__
答案 2 :(得分:1)
对我来说,问题是我的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,请务必在里面运行命令。
为了支持TLS 1.1或更高版本,您可能需要安装较新版本的OpenSSL,然后再安装Python。这应该会给你一个支持TLS 1.1的Python。
此过程取决于您的操作系统 - 这里是OS X的指南。
virtualenv用户
对我来说,我的virtualenv之外的Python有TLS 1.2支持,所以我删除了我的旧virtualenv,并创建了一个具有相同包的新的,然后它工作。容易腻!
另见:
答案 3 :(得分:0)
我遇到了同样的问题,并与部署在AWS上的Mongo Atlas支持进行了30分钟的交谈。我运行下一个终端命令:
/Applications/Python\ 3.6/Install\ Certificates.command
答案 4 :(得分:0)
我有同样的问题。请检查您是否通过VPN连接。当我断开连接时,它解决了我的问题。