MySQL 使用Python连接出现SSL连接错误

MySQL 使用Python连接出现SSL连接错误

在使用Python连接MySQL时,很可能会遇到SSL连接错误。这个错误会提示你SSL连接证书不正确或者无效,导致连接失败。本篇文章将结合实例详细介绍这个问题及其解决方法。

阅读更多:MySQL 教程

问题分析

当我们在用Python连接MySQL时,可能会收到以下错误信息:

ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)
Mysql

这个问题的产生是由MySQL服务端使用的SSL证书与Python中使用的SSL证书不一致所导致的。简单来说,Python本地存储的SSL证书认可的CA机构有限,而MySQL服务端所使用的机构可能不在这个认可列表中。

解决办法

方法一:取消SSL验证

这个方法非常简单,并且在一些特殊场合下是可接受的。在MySQL连接配置中,我们可以通过传递sslmode='DISABLED'的参数来关闭SSL验证,代码如下:

import mysql.connector

cnx = mysql.connector.connect(user='user', password='password',
                              host='host',
                              database='database', sslmode='DISABLED')
Python

但是,我们需要注意的是,关闭SSL验证可能会使数据传输变得不安全。因此,这个方法只应该在数据传输不涉及敏感信息的情况下使用。

方法二:将服务端SSL证书加入认可列表

如果我们希望确保数据传输的安全,我们可以将MySQL服务端的SSL证书加入Python本地存储的认可列表中。具体地,在Python的SSL认可证书存储目录中加入MySQL服务端的证书即可。这个目录的位置在不同系统下可能会有所不同,你可以通过执行以下代码获取当前系统的SSL证书存储目录:

import ssl

print(ssl.get_default_verify_paths())
Python

这个方法需要先获得MySQL服务端的证书。具体的做法是通过MySQL客户端工具从服务端获取证书。但是,在某些情况下,我们可能无法获得这个证书,那么该怎么办呢?

方法三:使用自签名SSL证书

我们可以使用自签名的SSL证书作为MySQL服务端的证书。这个证书只在我们自己的环境中使用,没有经过第三方机构的认证。这样,在Python本地存储的认可证书列表中添加这个自签名证书之后,它就会被认可并且可以被用作SSL连接的证书。

具体的做法参见以下步骤:

  1. 在MySQL服务器上使用openssl命令生成证书:
    openssl req -newkey rsa:2048 -nodes -keyout private.key -x509 -days 365 -out certificate.pem
    Mysql

    该命令将生成 private.keycertificate.pem 两个文件,前者是证书密钥,后者是自签名证书。

  2. 将证书放置在MySQL服务器的指定目录下。在我的Ubuntu系统上,该目录是/etc/mysql/ssl。如果该目录不存在,则需要手动创建。

  3. 配置MySQL服务器以使用SSL证书。在MySQL配置文件中,我们需要以下配置:

   [mysqld]
   ssl-ca=/etc/mysql/ssl/certificate.pem
   ssl-cert=/etc/mysql/ssl/certificate.pem
   ssl-key=/etc/mysql/ssl/private.key
Mysql
  1. 配置Python,在MySQL连接配置中添加以下参数:

    ssl_ca='/etc/mysql/ssl/certificate.pem'
    
    Python

    具体的完整代码如下:

    import mysql.connector
    ssl_config = {
        'ssl_ca': '/etc/mysql/ssl/certificate.pem'
    }
    
    cnx = mysql.connector.connect(user='user, password='password',
                                  host='host',
                                  database='database', sslmode='VERIFY_CA', ssl_verify_cert=True, ssl_config=ssl_config)
    
    Python

方法四:使用非标准SSL端口

在一些场合下,我们可以使用MySQL非标准SSL端口对MySQL进行SSL连接,以避免被传统SSL协议所限制。在MySQL连接配置中,我们可以通过传递ssl_port='port_number'的参数来指定端口号,代码如下:

import mysql.connector

cnx = mysql.connector.connect(user='user', password='password',
                              host='host', port='port_number',
                              database='database', sslmode='REQUIRED')
Python

需要注意的是,不同的MySQL SSL连接协议版本可能使用不同的非标准SSL端口,需要在使用前确认。

总结

通过本篇文章的介绍,我们了解了Python中使用MySQL Connector连接MySQL时出现的SSL连接错误,以及如何解决这个问题。除了关闭SSL验证以外,我们还可以通过将服务端SSL证书加入认可列表、使用自签名SSL证书以及使用非标准SSL端口等方式来解决这个问题。希望本文能够帮助到大家在日常工作中解决这个问题。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册