【问题标题】:ServerSelectionTimeoutError when connecting to aws with pymongo使用 pymongo 连接到 aws 时出现 ServerSelectionTimeoutError
【发布时间】:2017-02-17 00:43:50
【问题描述】:

我正在尝试使用密钥文件连接到托管在 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 的问题与我的问题几乎相同,但错误不同,那里发布的解决方案不适用于我的问题。

这里的地址和密钥已更改,我已经为此转了几个小时,但没有运气,将不胜感激。

【问题讨论】:

标签: python mongodb amazon-web-services ssl pymongo


【解决方案1】:

这个问题可能是由于以下问题引起的:

  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()

【讨论】:

    【解决方案2】:

    我在使用 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__

    【讨论】:

    • 获胜。谢谢。
    【解决方案3】:

    对我来说,问题在于我的 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.1TLS 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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 最好在对问题发表评论的情况下说出这种答案
        • 这篇文章并不是回答问题的实际尝试。请注意StackOverflow doesn't work like a discussion forum,这是一个问答网站,每个帖子都是问题或问题的答案。帖子也可以有comments - 像这样的小句子 - 可用于批评或要求作者澄清。这应该是评论或new question
        猜你喜欢
        • 1970-01-01
        • 2019-01-20
        • 1970-01-01
        • 2019-06-01
        • 1970-01-01
        • 2020-03-19
        • 2015-09-10
        • 2015-06-22
        • 1970-01-01
        相关资源
        最近更新 更多