apache-tomcat-9.0.74的JDBC密码加密及解密失败解决咨询
方式一:使用Tomcat自带加密工具(Digester)
- 生成加密密码:
进入Tomcat的bin目录,执行对应系统的命令:
执行后会得到加密后的字符串,例如# Linux/Mac ./digest.sh -a SHA-256 你的明文密码 # Windows digest.bat -a SHA-256 你的明文密码5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 - 配置
server.xml的Resource节点:
将password字段替换为加密后的字符串,并添加digest="SHA-256"属性,同时修正参数拼写错误:<Resource name="jdbc/PegaRULES" auth="Container" type="javax.sql.DataSource" driverClassName="org.postgresql.Driver" url="jdbc:postgresql://db1.rds.amazonaws.com:5432/dbdev" username="pegaadmin" password="5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8" digest="SHA-256" maxActive="100" maxIdle="30" maxWait="60000" validationQuery="SELECT 1" validationInterval="30000" testWhileIdle="true" timeBetweenEvictionRunsMillis="10000" />
方式二:使用自定义加密工厂类
即你尝试的第三方工具方案,但需确保工具与Tomcat版本兼容,具体排查见问题2的解决步骤。
排查修复步骤:
修正配置拼写错误
你的Resource配置中timeBetweenEvictionRunsMills是错误参数名,正确应为timeBetweenEvictionRunsMillis(第二个M大写),该错误可能导致数据源初始化异常,引发解密失败假象。验证工具与Tomcat版本兼容性
Tomcat 9.0.74可能对JDBC数据源接口做了微调,确认SecureTomcatDataSourceImpl是否实现了Tomcat 9.x对应的org.apache.tomcat.jdbc.pool.DataSourceFactory接口;若工具提供商有适配9.0.74的新版本jar包,直接替换使用。检查密钥一致性
确认生成加密密码时使用的密钥(若工具自定义密钥)与Tomcat运行时加载的密钥完全一致,部分工具会读取配置文件或系统属性中的密钥,需确保Tomcat启动时正确加载该配置。查看日志定位具体异常
查看Tomcat的logs/catalina.out或localhost.log,找到解密失败的具体错误信息:- 若为
ClassNotFoundException:确认SecureTomcatDataSourceImpl的全限定类名是否正确,jar包是否确实放在Tomcat的lib目录下; - 若为加密算法异常:检查工具使用的算法是否在Tomcat依赖的JDK版本中被允许(Java 8u151+默认支持强加密算法,无需额外JCE扩展)。
- 若为
适配Tomcat版本变更
对比Tomcat 9.0.73与9.0.74的官方更新日志,重点查看JDBC数据源相关变更,若涉及DataSourceFactory接口方法调整,可修改SecureTomcatDataSourceImpl的实现代码以适配新接口(若有源码权限)。替代方案:切换到Tomcat官方加密方式
若第三方工具无法快速适配,直接使用问题1中Tomcat自带的Digester加密方式,无需额外引入jar包,兼容性更强。
内容的提问来源于stack exchange,提问作者Debraj Bhowmik

