Ubuntu22.04升级后pg_connect认证失败:pg_hba.conf的md5/trust问题
解决PostgreSQL md5认证失败问题(Ubuntu 22.04 + PHP)
核心问题分析
Ubuntu 22.04默认搭载的PostgreSQL版本(多为14及以上),默认密码加密方式是scram-sha-256;而你之前在Ubuntu 20.04上用的PostgreSQL 12依赖md5加密。即使修改password_encryption配置,已存在用户的密码哈希不会自动转换,这是导致认证失败的核心原因。另外PHP 7.3对SCRAM加密的支持有限,进一步加剧了md5认证流程的不匹配。
分步解决
1. 配置PostgreSQL默认密码加密为md5
编辑postgresql.conf,取消password_encryption的注释并设置为md5:
password_encryption = md5
修改后重启PostgreSQL服务:
sudo systemctl restart postgresql
2. 重置用户密码生成md5格式哈希
现有用户的密码是SCRAM格式,必须重新设置密码,让PostgreSQL生成md5哈希:
ALTER USER "sws****" WITH PASSWORD '你的用户密码';
执行该SQL前,确保已完成第一步的配置重启,保证新密码按md5规则生成。
3. 恢复pg_hba.conf的md5认证规则
将之前改为trust的行改回md5:
host all all 0.0.0.0/0 md5
修改后重载PostgreSQL配置(无需重启服务):
sudo systemctl reload postgresql
4. 验证PHP连接
用简单代码测试pg_connect是否正常工作:
<?php $conn = pg_connect("host=localhost dbname=你的数据库名 user=sws**** password=你的用户密码"); if (!$conn) { echo "连接失败: " . pg_last_error(); } else { echo "连接成功"; pg_close($conn); } ?>
补充说明
- 若后续升级PHP到8.x版本,其对SCRAM-SHA-256的支持更完善,但作为教学场景,md5更适合演示基础认证逻辑,同时要向学生强调
trust认证的安全风险,明确生产环境绝对禁用该方式。
内容的提问来源于stack exchange,提问作者Steven Smith
相关产品推荐
相关产品推荐

