2017-03-04 694 views
4

我試圖使用SSL證書和Python模塊PyMySQL使用以下行來連接到谷歌雲MySQL服務器:SSL證書錯誤>主機名不匹配

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' 

我查找了問題,卻找不到不涉及的Monkeypatching SSL代碼跳過SSL驗證修復。我明確列出了SQL主機的IP地址,但ssl驗證在ssl.match_hostname期間暫停,因爲ssl證書是使用不同的主機名進行自簽名的。

我確定我的密鑰是有效的,因爲我可以使用Ruby(Windows/Linux)和linux mysql CLI連接它們。這似乎是ssl.match_hostname的一個問題。這與this questionthis one類似,但都回避了這個問題。

有沒有辦法在Python中正確處理自簽名SSL證書。

+0

我有完全相同的問題,你有解決它嗎? – antoinet

+0

@proximate_cause如果您能夠解決此問題,建議您將答案張貼爲更好地幫助社區的解決方案。如果沒有,這個問題通常是由防火牆或代理服務器引起的。建議調查任何本地網絡配置,並測試不受任何限制的不同網絡的連接。 – Jordan

回答

1

雖然解決你的答案的問題被拒絕的合併請求在這裏: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 
) 
相關問題