使用FastAPI+SQLAlchemy连接AWS RDS SSL时遇认证错误求助
报错信息:
asyncpg.exceptions.InvalidAuthorizationSpecificationError: no pg_hba.conf entry for host "106.213.85.14", user "user", database "db-name", no encryption make: *** [Makefile:85: migration] Error 1
使用的连接URL:
postgresql+asyncpg://username:password@aws-endpoint:port/db-name?rds_sslrootcert=true&sslmode=require
异步连接代码:
if settings.DB_SSL: ssl_context = ssl.create_default_context(cafile=settings.RDS_CERT_PATH) ssl_context.verify_mode = ssl.CERT_REQUIRED connect_args = {"ssl": ssl_context} engine = create_async_engine( settings.DB_SSL_DSN if settings.DB_SSL else settings.DB_DSN, echo=settings.DB_ECHO, pool_size=settings.DB_POOL_SIZE, max_overflow=settings.DB_MAX_OVERFLOW, future=True, connect_args=connect_args if settings.DB_SSL else None, ) async_session = sessionmaker(engine, expire_on_commit=False, class_=AsyncSession, future=True)
已开放RDS安全组所有入站流量,但仍报错,需排查自身可能存在的错误。
检查SSL配置冲突
你同时在URL中添加sslmode=require参数,又通过connect_args传递ssl_context,两种配置方式可能冲突,导致asyncpg未正确启用加密连接。建议二选一:要么保留URL的SSL参数,删除connect_args中的ssl配置;要么去掉URL的SSL参数,仅通过connect_args传入ssl_context。验证RDS CA证书路径
确认settings.RDS_CERT_PATH指向的证书文件存在、可读,且为AWS官方RDS根证书(如rds-ca-2019-root.pem)。路径错误或证书损坏会导致SSL握手失败,服务器判定连接未加密,触发pg_hba.conf错误。确认SSL开关状态
检查settings.DB_SSL是否被正确设置为True,否则connect_args不会被传入,URL中的SSL参数也可能因settings.DB_SSL_DSN未正确赋值而失效。可临时添加日志或打印,输出settings.DB_SSL值与实际使用的DSN。修正URL转义字符
URL中的&是HTML转义后的符号,Python代码中应直接使用&。若settings.DB_SSL_DSN保留&,asyncpg会将amp;sslmode=require识别为无效参数,导致SSL模式未正确配置。正确URL格式应为:postgresql+asyncpg://username:password@aws-endpoint:port/db-name?rds_sslrootcert=true&sslmode=require检查RDS SSL强制设置
确认RDS实例参数组中rds.force_ssl是否设为1(开启强制SSL)。若开启强制SSL但连接未加密,会触发该错误;若未开启,可能pg_hba.conf中对应规则要求加密连接,而你的连接未满足条件。查询pg_hba规则匹配情况
通过RDS执行SQL查询当前生效的pg_hba规则:SELECT * FROM pg_hba_file_rules;查看匹配你的主机、用户、数据库的规则类型,若为
hostssl则要求加密连接,需确保你的连接已正确启用SSL。
内容的提问来源于stack exchange,提问作者hail_hydra_07

