如何告诉Python MySQL连接器使用哪个SSL / TLS协议?特定的(例如TLS1.2)或最低的。
如何检查已建立的连接上使用的协议?
我有一个使用mysql-connector-python
(8.0.18)的应用程序。我连接这样的东西:
cnx = mysql.connector.connect(user='x', password='y', host='localhost', database='xyz')
通常,这不会给我带来麻烦,但是最近在Web托管提供商服务器上,它停止了工作。我现在遇到的错误是:
mysql.connector.errors.InterfaceError: 2026 (HY000): SSL connection error: error:1408F10B:SSL routines:ssl3_get_record:wrong version number
并且(通过Flask-SQLAlchemy设置进行连接):
_mysql_connector.MySQLInterfaceError: SSL connection error: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
我可以确认的是,如果我改为这样做ssl_disabled=True
,则它可以正确连接(但我假设没有SSL / TLS):
cnx = mysql.connector.connect(user='x', password='y', host='localhost', database='xyz', ssl_disabled=True)
我无法更改提供程序服务器,但是他们说如果我指定要使用的特定版本(例如TLS1.2),则它应该正确连接。他们还提到使用ssl.OP_NO_SSLv3
标志,但是这是SSLContext设置的一部分,我不确定如何将其应用于我的连接。
我看到在他们的MySQL实例(我无法编辑)上,它们没有设置以下值:
SHOW VARIABLES LIKE 'tls_version'
SHOW STATUS LIKE 'Ssl_cipher'
SHOW STATUS LIKE 'Ssl_version'
根据我最近的理解和Andreas的帮助,我最终获得了以下连接:
cnx = mysql.connector.connect(user='u', password='p', host='localhost', database='db', ssl_ca='', ssl_version=ssl.PROTOCOL_TLSv1_2)
从源头上看,显然所有kwargs
提供的内容也mysql.connector.constants.DEFAULT_CONFIGURATION
被接受。其中包括文档中未包含的一些内容,例如ssl_version
和ssl_cipher
。从kwargs
到连接的映射似乎发生在中MySQLConnectionAbstract.connect
。请注意,设置ssl_version
可能还需要其他一些变形。我需要提供ssl_ca
它(可能会随您的MySQL实例包含的内容而有所不同SHOW VARIABLES LIKE '%ssl%'
)。
考虑到这一点,我获得了以下MVCE代码:
import mysql.connector
import ssl
cnx = mysql.connector.connect(user='u', password='p', host='localhost', database='db', ssl_ca='', ssl_version=ssl.PROTOCOL_TLSv1_2)
cursor = cnx.cursor()
cursor.execute("SELECT 1")
for (number,) in cursor:
print('Number:', number)
print('SSL active:', cnx._ssl_active)
print('Connection SSL version:', cnx._ssl.get("version"))
print("Socket SSL version:", cnx._socket.sock.ssl_version)
cursor.close()
cnx.close()
对我来说输出:
Number: 1
SSL active: True
Connection SSL version: _SSLMethod.PROTOCOL_TLSv1_2
Socket SSL version: _SSLMethod.PROTOCOL_TLSv1_2
如果我不指定而进行相同的连接,则会ssl_version
得到:
Number: 1
SSL active: True
Connection SSL version: None
Socket SSL version: _SSLMethod.PROTOCOL_TLS
如果ssl.PROTOCOL_TLSv1_2
用ssl.PROTOCOL_SSLv23
它替换,则至少应尝试使用其他协议,但如果出现问题(例如,不受支持),则可能会失败。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句