我尝试使用SSL证书和python模块PyMySQL连接到Google Cloud MYSQL服务器,其中包含以下行:
connection = pymysql.connect(host=os.environ['SQL_HOST_IP'], user=os.environ['SQL_USER'], password = os.environ['SQL_PASSWORD'],
db='main', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor,
ssl={'key': 'client-key.pem', 'cert': 'client-cert.pem', 'ca': 'server-ca.pem'})
不幸的是,我一直收到以下错误:
ssl.CertificateError: hostname 'SQL_IP_ADDRESS' doesn't match '$ALIAS_FROM_SELF_SIGNED_SSL_CERT'
我已查找该问题,但无法找到一个修复程序,该修复程序不会将ssl代码用于monkeypatching ssl跳过ssl验证。我明确列出了SQL主机的IP地址,但ssl验证在ssl.match_hostname期间暂停,因为ssl证书是使用不同的主机名自签名的。
我确定我的密钥有效,因为我可以使用Ruby(Windows / Linux)和linux mysql CLI连接它们。这似乎是ssl.match_hostname的问题。它与this question和this one类似,但两者都回避了这个问题。
有没有办法在Python中正确处理自签名SSL证书。
答案 0 :(得分:3)
虽然您的答案问题的解决方案在此处被拒绝为合并请求:https://github.com/PyMySQL/PyMySQL/pull/555
您可以选择禁用 check_hostname 。这适用于版本'0.7.11'
ssl_options = {
'key': 'client-key.pem',
'cert': 'client-cert.pem',
'ca': 'server-ca.pem',
'check_hostname': False
}
connection = pymysql.connect(
host=os.environ['SQL_HOST_IP'],
user=os.environ['SQL_USER'],
password = os.environ['SQL_PASSWORD'],
db='main',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor,
ssl=ssl_options
)