Python - MySQL SSL连接

7
我已经设置了一个使用SSL的MySQL服务器,并且我也有CA证书。
当我使用MySQL Workbench连接到服务器时,我不需要证书。我还可以在Mac上使用Python和MySQLdb连接到服务器而不需要CA证书。
但是,当我尝试在Windows机器上使用完全相同的Python和MySQLdb设置进行连接时,我遇到了访问被拒绝的问题。看起来我需要CA。当我输入CA时,会出现以下错误:
_mysql_exceptions.OperationalError: (2026, 'SSL connection error')
下面是我的代码以打开连接:
db = MySQLdb.connect(host="host.name",    
                 port=3306,
                 user="user",         
                 passwd="secret_password",  
                 db="database", 
                 ssl={'ca': '/path/to/ca/cert'})  

有人能指出在Windows上的问题是什么吗?

5个回答

5

我刚刚使用Python 2.7和MySQLdb(1.2.4)使以下内容正常工作:

database = MySQLdb.connect(host='hostname', user='username', db='db_name',
    passwd='PASSWORD', ssl={'ca': '/path/to/ca-file'})

根据您提供的信息,问题可能不仅仅在于此。我想知道您本地的CA文件是否存在错误,或者服务器上的证书是否有误?您能否从服务器获取CA文件的副本?


1

试试这个

import ssl
from databases import Database
sslctx = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, 
    cafile='ca.pem')
sslctx.verify_mode = ssl.CERT_REQUIRED
sslctx.check_hostname = True
sslctx.load_cert_chain(certfile='client.crt', keyfile='pkey.key')

database = Database(DATABASE_URL, ssl=sslctx)

databases 库提供对 PostgreSQL、MySQL 和 SQLite 的支持。同时也对异步框架非常有用。


0

我知道这有点老了,但我找到了一种方法使其工作。使用pymysql而不是MySQLdb,并将连接编写为:

import pymysql

conn = pymysql.connect(user = 'user', password = 'passwd'
, database = 'db', host = 'hst', ssl = {'ssl' : {'ca': 'pathtosll/something.pem'}})

人们经常忽略的一点(包括我自己)是,ssl 需要是一个包含键 'ssl' 的字典,其值为另一个字典,其中包含一个键 'ca'。这应该对您有用。

我不知道这个嵌套的 ssl 字典的原因,甚至在 pymysql 代码中也找不到为什么会起作用。我只是使用一个(非嵌套)字典,如下所示:pymysql.connect(..., ssl={'ca': 'ca.pem'}),它可以正常工作。 - Andrey Semakin

0
import pymysql

conn = pymysql.connect(host= # your host, usually localhost,
user = # your username,
passwd = # your password,
db = #your database name ,
ssl ={'ssl': r'path of your pem file'})

4
请在您的代码旁添加一些描述。 - Itamar Mushkin

0

我正在使用pymysql,但在使用SSL密钥和证书连接时遇到了一些问题:对于“ssl”属性,我将其设置为内部的字典。请尝试以下操作:

db = MySQLdb.connect(host="host.name",
    port=3306,
    user="user",
    passwd="secret_password",
    db="database",
    ssl={'ssl':
            {'ca': '/path/to/ca/ca',
             'key': '/path/to/ca/key',
             'cert': '/path/to/ca/cert'
            }
         }
)  

2
你确定这不是将选项移出路径,以便停止使用SSL吗? - Andy
@Andy 的确,虽然它“解决”了错误,但它完全禁用了 TLS。 - Sahbi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接