【问题标题】:Flask + sqlalchemy certificate verify failed: IP address mismatchFlask + sqlalchemy 证书验证失败:IP 地址不匹配
【发布时间】:2021-02-26 00:47:48
【问题描述】:

我正在使用 ssl 连接从烧瓶应用程序连接到远程 mysql 数据库(在我的本地网络上)。

app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://user:password@192.168.1.24/AwesomeDB?ssl_ca=client-ssl/ca.pem&ssl_cert=client-ssl/client-cert.pem&ssl_key=client-ssl/client-key.pem"

对数据库的任何调用都会引发这个神秘的错误。

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on '192.168.1.24' ([SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: IP address mismatch, certificate is not valid for '192.168.1.24'. (_ssl.c:1122))")

我可以从终端登录mysql监视器就好了。

mysql -u user -p -h 192.168.1.24 --ssl-ca=client-ssl/ca.pem --ssl-cert=client-ssl/client-cert.pem --ssl-key=client-ssl/client-key.pem

我使用的是 macos 11.0.1 和 python 3.9.0。 我已经尝试按照here 的描述安装和链接certifi。没有 ssl 一切正常。请帮忙。

编辑:问题不是特定于 macOS,我尝试从 ubuntu 连接,结果相同。

【问题讨论】:

标签: python mysql ssl sqlalchemy


【解决方案1】:

我在尝试使用 Flask SQL alchemy over SSL 连接到 CLoudSQL(GCP) 时遇到了类似的问题。当与 Flask SQL alchemy 一起使用时,看起来 CLoudSQL 以某种方式更喜欢 mysqlconnector 而不是 pymysql 驱动程序。所以用 SQLALCHEMY_DATABASE_URI 中的 mysqlconnector 替换 pymysql 驱动程序就可以了。

确保你已经安装了 mysqlconnector 包

pip install mysql-connector-python via pip

这是工作代码的小sn-p

>>> from flask import Flask
>>> from flask_sqlalchemy import SQLAlchemy
>>>
>>> app = Flask(__name__)
>>>
>>> app.config["SQLALCHEMY_TRACK_MODIFICATIONS"]=False 
>>>
>>> app.config["SQLALCHEMY_DATABASE_URI"] = 'mysql+mysqlconnector://{username}:{password}@{db_hostname}/{database}?ssl_ca=server-ca.pem'
>>>
>>> db = SQLAlchemy(app)
>>>
>>> class User(db.Model):
...   id = db.Column(db.Integer, primary_key=True)
...   username = db.Column(db.String(80), unique=True, nullable=False)
...   email = db.Column(db.String(120), unique=True, nullable=False)
...   def __repr__(self):
...     return '<User %r>' % self.username
...
>>> db.create_all()
>>>
>>> admin = User(username='admin', email='admin@example.com')
>>> guest = User(username='guest', email='guest@example.com')
>>>
>>> db.session.add(admin)
>>> db.session.add(guest)
>>> db.session.commit()
>>>
>>> User.query.all()
[<User 'Flask'>, <User 'admin'>, <User 'guest'>]

注意:在可能的情况下,最好使用 pymysql 适配器,因为它是more performant,即使 Oracle 正式支持 mysqlconnector。两者都是用纯 python 实现的。

【讨论】:

【解决方案2】:

如文档中所述,“如果服务器使用自动生成的自签名证书或与主机名不匹配(从客户端看到),则可能还需要指明 ssl_check_hostname=false”

https://docs.sqlalchemy.org/en/14/dialects/mysql.html#ssl-connections

所以你可以试试:

app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://user:password@192.168.1.24/AwesomeDB?ssl_ca=client-ssl/ca.pem&amp;ssl_cert=client-ssl/client-cert.pem&amp;ssl_key=client-ssl/client-key.pem&amp;ssl_check_hostname=false"

看看情况如何。这对我有用。

【讨论】:

    猜你喜欢
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多