使用pymysql连接Amazon RDS报错:check_hostname启用时无法设置verify_mode为CERT_NONE
解决pymysql连接Amazon RDS时的SSL参数冲突错误
错误原因
报错Cannot set verify_mode to CERT_NONE when check_hostname is enabled源于SSL参数配置冲突:当check_hostname(主机名验证)开启时,verify_mode(证书验证模式)不能设为CERT_NONE(不验证证书)。你的代码中设置了ssl_verify_identity=True,会自动开启check_hostname,但pymysql的默认参数组合可能导致verify_mode被设为CERT_NONE,引发矛盾。
解决方案
方案1:显式配置SSL上下文(推荐)
手动创建SSL上下文,确保证书验证模式与主机名验证一致,同时修正PORT参数类型(需为整数):
import pymysql import sys import boto3 import os import ssl ENDPOINT="mysqldb.123456789012.us-east-1.rds.amazonaws.com" PORT=3306 # 改为整数类型 USER="jane_doe" REGION="us-east-1" DBNAME="mydb" os.environ['LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN'] = '1' session = boto3.Session(profile_name='default') client = session.client('rds') token = client.generate_db_auth_token(DBHostname=ENDPOINT, Port=str(PORT), DBUsername=USER, Region=REGION) try: # 创建符合要求的SSL上下文 ssl_context = ssl.create_default_context(cafile='certbundle.pem') ssl_context.check_hostname = True ssl_context.verify_mode = ssl.CERT_REQUIRED conn = pymysql.connect( auth_plugin_map={'mysql_clear_password': None}, host=ENDPOINT, user=USER, password=token, port=PORT, database=DBNAME, ssl=ssl_context ) cur = conn.cursor() cur.execute("""SELECT now()""") query_results = cur.fetchall() print(query_results) except Exception as e: print("Database connection failed due to {}".format(e))
方案2:调整SSL参数组合(仅测试环境推荐)
若允许关闭主机名验证,可修改参数消除冲突:
# ... 其他代码不变 ... try: conn = pymysql.connect( auth_plugin_map={'mysql_clear_password': None}, host=ENDPOINT, user=USER, password=token, port=int(PORT), # 转整数 database=DBNAME, ssl_ca='certbundle.pem', ssl_verify_identity=False, ssl={'verify_mode': ssl.CERT_REQUIRED} ) # ... 后续代码 ...
额外检查点
- 确保
ssl_ca参数指向实际存在的certbundle.pem证书文件路径,而非占位符SSLCERTIFICATE - 确认IAM用户拥有
rds-db:connect权限,且RDS实例已启用IAM数据库认证
内容的提问来源于stack exchange,提问作者Magic Maverick
相关产品推荐
相关产品推荐

