SSL认证错误>主机名不匹配

pro*_*use 6 python mysql ssl google-cloud-sql pymysql

我正在尝试使用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'})
Run Code Online (Sandbox Code Playgroud)

不幸的是,我一直收到以下错误:

ssl.CertificateError: hostname 'SQL_IP_ADDRESS' doesn't match '$ALIAS_FROM_SELF_SIGNED_SSL_CERT'
Run Code Online (Sandbox Code Playgroud)

我已经查找了问题,但是找不到不涉及通过猴子补丁ssl代码跳过ssl验证的修复程序。我明确列出了SQL主机的IP地址,但是ssl验证在ssl.match_hostname期间暂停,因为ssl证书是使用其他主机名自签名的。

我确定我的密钥是有效的,因为我可以使用Ruby(Windows / Linux)和linux mysql CLI与它们连接。ssl.match_hostname似乎是一个问题。它类似于这个问题,并且这一个,但都回避这个问题。

有没有一种方法可以正确处理Python中的自签名SSL证书。

clo*_*oop 8

虽然您的答案问题的解决方案在这里作为合并请求被拒绝: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
)
Run Code Online (Sandbox Code Playgroud)