Heroku SSL 连接错误不支持的协议

Posted

技术标签:

【中文标题】Heroku SSL 连接错误不支持的协议【英文标题】:Heroku SSL connection error unsupported protocol 【发布时间】:2021-05-04 09:51:13 【问题描述】:

我使用 Heroku 来托管我的 Discord 机器人已经有一段时间了。它已成功连接到托管在 ClearDB 上的 mysql 数据库。但是,最近,每当我使用该机器人并尝试连接到数据库时,它都会抛出此错误:

2026 (HY000): SSL connection error: error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol

到目前为止,它一直运行良好,我没有改变任何东西。对于背景,我所做的只是删除了一个管道,并使我的应用程序成为一个没有任何管道的独立应用程序。以防万一这有帮助。

这是因为 Heroku 已经更新了吗?如何修复我的机器人?如果您需要更多信息,请告诉我。

任何帮助表示赞赏,并提前感谢您!

编辑: 数据库连接代码:

import mysql.connector

def create_conn():
    conn = None
    try:
        conn = mysql.connector.connect(host="HOST",
                                       database="DB",
                                       user="USER",
                                       password="PWD")
    except Exception as e:
        print(e)
    return conn


def execute_query(query, params, fetchall=True):
    conn = create_conn()
    if conn:
        cursor = conn.cursor()
        cursor.execute(query % params)
        try:
            if fetchall:
                results = cursor.fetchall()
            else:
                results = cursor.fetchone()
        except:
            results = None
        conn.commit()
        cursor.close()
        conn.close()
        return results
    else:
        return False

数据库连接曾经可以工作,当我在我的测试机器树莓派上运行它时仍然可以工作。

编辑 2: requirements.txt:

aiohttp==3.6.3
async-timeout==3.0.1
attrs==20.3.0
CacheControl==0.12.6
cachetools==4.2.0
certifi==2020.12.5
cffi==1.14.4
chardet==3.0.4
click==7.1.2
cryptography==3.3.1
cssselect==1.1.0
cssutils==1.0.2
discord==1.0.1
discord-pretty-help==1.2.0
discord.py==1.6.0
emoji==0.6.0
Flask==1.1.2
google-api-core==1.24.1
google-api-python-client==1.12.8
google-auth==1.24.0
google-auth-httplib2==0.0.4
google-cloud-core==1.5.0
google-cloud-firestore==2.0.2
google-cloud-storage==1.35.0
google-crc32c==1.1.0
google-resumable-media==1.2.0
googleapis-common-protos==1.52.0
grpcio==1.34.0
gunicorn==20.0.4
httplib2==0.18.1
idna==2.8
importlib-metadata==3.3.0
itsdangerous==1.1.0
jeepney==0.6.0
Jinja2==2.11.2
keyring==21.8.0
lxml==4.6.2
MarkupSafe==1.1.1
msgpack==1.0.2
multidict==4.7.6
mysql-connector-python==8.0.22
numpy==1.19.4
pandas==1.1.5
premailer==3.7.0
proto-plus==1.13.0
protobuf==3.14.0
pyasn1==0.4.8
pyasn1-modules==0.2.8
pycparser==2.20
python-dateutil==2.8.1
python-dotenv==0.15.0
pytz==2020.4
requests==2.25.1
rsa==4.7
schedule==0.6.0
SecretStorage==3.3.0
six==1.15.0
typing-extensions==3.7.4.3
uritemplate==3.0.1
urllib3==1.26.2
Werkzeug==1.0.1
yagmail==0.14.245
yarl==1.5.1
zipp==3.4.0

【问题讨论】:

你用工作台检查过吗,如果建立连接,还看看服务器是否正在运行 你升级了 OpenSSL .. 看看这个***.com/questions/53058362/… @Yan 如果您使用 Heroku 和 ClearDB 连接到 GitHub 存储库,您应该如何升级 OpenSSL? 您使用的是哪个堆栈?你在 ruby​​ 堆栈上运行吗? @KrishnanShankar 很难说,但你说过你已经删除了一个管道并运行了一个独立的应用程序。底层操作系统版本是否可能不同。签出此 SO ***.com/questions/61649764/… ... 可能需要更新配置以设置最低 TLS 版本。 【参考方案1】:

我不太确定如何执行此操作,但我很确定您必须禁用 SSL 才能使其工作,希望这会有所帮助。

【讨论】:

它可能有效,但不能真正解决问题。此外,这并不安全,凭据和数据将以明文形式传输【参考方案2】:

显然,您需要在应用和 MySQL 之间强制建立 SSL 连接。

如果您使用的是ruby stack,请按照给定的选项操作,您的 SSL 错误问题将得到解决。

从 ClearDB 仪表板下载 CA、客户端和私钥文件,并将它们放在应用程序文件系统的根目录中。 确保您已安装 OpenSSL,您可以在此处找到适用于 Unix/Linux/OS X 和适用于 Windows 的此处。 *由于 Heroku 上使用的 MySQL 客户端库配置,您需要从私钥文件中删除密码,可以这样做:
$ openssl rsa -in cleardb_id-key.pem -out cleardb_id-key-no-password.pem

您现在可以删除 cleardb_id-key.pem 并将 cleardb_id-key-no-password.pem 重命名为 cleardb_id-key.pem,您将在您的应用中使用它。

*使用修改后的 CLEARDB_DATABASE_URL 的值设置 DATABASE_URL 配置变量,如下所示:

$ heroku config:add DATABASE_URL="mysql2://abc1223:dfk243@us-cdbr-east.cleardb.com/my_heroku_db?
sslca=cleardb-ca-cert.pem&sslcert=cleardb_id-cert.pem&sslkey=cleardb_id-key.pem&reconnect=true"

注意到我们如何将“reconnect=true”参数添加到 URL 的末尾了吗?这样您的应用程序将在连接超时时自动重新连接到 ClearDB。

从这里,只需重新启动您的应用程序(如果 Heroku 尚未为您这样做),只要您在 DATABASE_URL 中指定正确的文件名和证书路径,您的应用程序现在将通过 SSL 连接到清除数据库。

【讨论】:

【参考方案3】:

以防万一您可以通过以下方式打开 ssl:

conn = mysql.connector.connect(host="HOST",
                                   database="DB",
                                   user="USER",
                                   password="PWD", 
                                   ssl_disabled=True)

【讨论】:

以上是关于Heroku SSL 连接错误不支持的协议的主要内容,如果未能解决你的问题,请参考以下文章

MySQL主从服务器slave无法连接master:SSL连接错误:协议版本不匹配

ssl 套接字不支持错误

curl: (35) 首次请求时连接出现未知 SSL 协议错误

发生ssl错误 无法建立到该服务器的安全连接

Rails Heroku Cloudflare SSL 和 websockets

在 HttpsURLConnection 中禁用 SSL 作为协议