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

时间:2021-01-30 19:07:33

标签: mysql ssl heroku discord discord.py

我一直在使用 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: 要求.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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

显然,您需要在您的应用和 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"
<块引用>

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

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