繁体   English   中英

使用 pymongo 连接到 aws 时出现 ServerSelectionTimeoutError

[英]ServerSelectionTimeoutError when connecting to aws with pymongo

我正在尝试使用密钥文件连接到托管在 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)

这个问题与我的几乎相同,但是错误不同,并且在那里发布的解决方案不适用于我的问题。

这里的地址和密钥已更改,我已经在这个问题上绕了几个小时没有运气,任何帮助将不胜感激。

由于以下问题,可能会导致此问题:

  1. pymongo 版本(建议使用 3.3.0,这对我有用)

  2. 这可能是 DNS 问题等,实际上您可以使用以下方法检查 DNS 问题:

telnet xx.xx.xx.xx 端口

  1. 可能是防火墙问题

  2. 可能是 ssl 密钥的问题。 尝试以下方法进行测试:

    import os
    
    import pymongo
    
    import ssl
    
    URL="url:port/db?ssl=true"
    
    client = pymongo.MongoClient(URL, ssl_cert_reqs=ssl.CERT_NONE)
    
    db = client.get_default_database()
    
    print db
    
    print db.collection_names()

我在使用 Pymongo 模块连接到 DocumentDB Azure(数据库)时遇到了同样的问题(SSL 握手)。

错误:

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__

对我来说,问题是我的 Python 设置只支持 TLS 1.0——不支持 TLS 1.1 或更高版本。

你可以这样检查:

蟒蛇 3

> from urllib.request import urlopen
> urlopen('https://www.howsmyssl.com/a/check').read()

蟒蛇 2

> from urllib2 import urlopen
> urlopen('https://www.howsmyssl.com/a/check').read()

检查密钥tls_version的输出。 如果它说的是TLS 1.0而不是TLS 1.1TLS 1.2 ,那可能是问题所在。

如果您使用的是 virtualenv,请确保在其中运行命令。

解决方案:使用较新版本的 OpenSSL 安装 Python

为了支持 TLS 1.1 或更高版本,您可能需要安装更新版本的 OpenSSL,然后再安装 Python。 这应该会给你一个支持 TLS 1.1 的 Python。

该过程取决于您的操作系统 - 这是OS X指南。

虚拟环境用户
对我来说,virtualenv 之外的 Python 支持 TLS 1.2,所以我删除了旧的 virtualenv,并使用相同的包创建了一个新的,然后它就可以工作了。 轻轻松松!

另见:

  • PyMongo 文档中 Python 3 部分中有关 TLS 1.0 的警告 尽管它属于 Python 3 部分,但它也适用于 Python 2

我遇到了同样的问题,并与部署在 AWS 上的 Mongo Atlas 支持进行了 30 分钟的讨论。 我运行下一个终端命令:

/Applications/Python\ 3.6/Install\ Certificates.command

我有同样的问题。 请检查您是否通过 VPN 连接。 当我断开连接时,它解决了我的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM