求助:无法从Elastic Beanstalk上的Tomcat连接AWS RDS PostgreSQL数据库
解决PostgreSQL认证类型10不支持的问题
错误原因
这个错误是因为你的AWS RDS PostgreSQL数据库使用了**SCRAM-SHA-256(认证类型10)**作为默认认证方式,但你项目中使用的PostgreSQL JDBC驱动版本过旧,不支持这种认证机制。新版本PostgreSQL(10及以上)默认启用SCRAM-SHA-256,而老版本驱动(42.2.0之前)仅支持MD5认证。
解决方案
1. 升级PostgreSQL JDBC驱动版本
这是最推荐的解决方案,既安全又适配新认证机制:
- 确保使用42.2.0及以上版本的PostgreSQL JDBC驱动(从该版本开始支持SCRAM-SHA-256),建议使用最新稳定版(如42.6.0)。
- 若使用Maven管理依赖,修改
pom.xml:<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.6.0</version> </dependency> - 若手动导入jar包,下载对应版本的jar文件,放入项目
WEB-INF/lib目录后,重新打包WAR包部署到Elastic Beanstalk。
2. 优化数据库连接代码(可选)
你的连接逻辑可以调整为更规范的写法,避免URL参数中密码的特殊字符转义问题:
if (System.getProperty("RDS_HOSTNAME") != null) { try { Class.forName("org.postgresql.Driver"); String dbName = System.getProperty("RDS_DB_NAME"); String userName = System.getProperty("RDS_USERNAME"); String password = System.getProperty("RDS_PASSWORD"); String hostname = System.getProperty("RDS_HOSTNAME"); String port = System.getProperty("RDS_PORT"); // 仅保留必要的URL参数,用户名密码通过重载方法传递 String jdbcUrl = "jdbc:postgresql://" + hostname + ":" + port + "/" + dbName + "?sslmode=require"; Connection con = DriverManager.getConnection(jdbcUrl, userName, password); return con; } catch (ClassNotFoundException | SQLException e) { throw e; } }
3. 降级RDS认证方式(不推荐,仅作为临时方案)
如果暂时无法升级驱动,可修改RDS参数组切换回MD5认证:
- 登录AWS控制台,进入RDS参数组,创建自定义参数组(不要修改默认参数组)。
- 在自定义参数组中,将
password_encryption参数设置为md5,保存修改。 - 将RDS实例关联到该自定义参数组,重启RDS实例。
- 重启后,必须重置数据库用户的密码(原密码是SCRAM加密的,重置后才会用MD5重新加密)。
额外检查
如果升级驱动后仍有问题,确认:
- RDS安全组已允许Elastic Beanstalk环境的安全组/IP段访问5432端口。
- WAR包中确实包含了新版JDBC驱动(解压WAR包检查
WEB-INF/lib目录)。
内容的提问来源于stack exchange,提问作者Eitan Rabinovitch
相关产品推荐
相关产品推荐

