Windows系统补丁后Tomcat报Illegal key size异常,本地Main方法正常
解决Tomcat中出现
java.security.InvalidKeyException: Illegal key size的问题 嘿,这个问题我太熟了——本地跑Main方法好好的,一部署到Tomcat就炸锅,核心原因十有八九是Tomcat实际用的JRE环境和你替换policy文件的那个JDK不是同一个,毕竟Windows系统里很容易同时装多个JRE/JDK,一不小心就串了。下面一步步给你捋清楚怎么排查解决:
1. 先搞清楚Tomcat到底用的哪个JRE
Tomcat不会主动告诉你它用的哪个JRE,得自己找:
- 去Tomcat的
logs目录翻catalina.out或者localhost.log,找类似这样的日志行:
重点看Using CATALINA_BASE: "C:\apache-tomcat-8.5.xx" Using CATALINA_HOME: "C:\apache-tomcat-8.5.xx" Using JRE_HOME: "C:\Program Files\Java\jdk1.7.0_xx"Using JRE_HOME这一行,这就是Tomcat真正依赖的JRE路径。 - 如果懒得翻日志,也可以在Tomcat的
bin目录下新建一个setenv.bat文件(没有的话直接建),写两行内容:
然后双击echo 当前Tomcat使用的JAVA_HOME: %JAVA_HOME% pausestartup.bat启动Tomcat,控制台会直接弹出当前用的JDK路径,一目了然。
2. 给Tomcat用的JRE替换policy文件
你之前替换的是C:\Program Files (x86)\Java\jdk1.7.0_67\jre\lib\security里的文件,但如果Tomcat用的是64位JDK(路径是C:\Program Files\Java\jdk1.7.0_xx,不带(x86)),那之前的替换等于白做。
- 把
local_policy.jar和US_export_policy.jar复制到Tomcat的JRE路径下的lib/security目录里,替换掉原来的文件(替换前记得备份原文件,以防万一)。
3. 验证替换是否生效(可选但推荐)
可以在你的web应用里加个简单的测试代码,确认密钥长度限制已经解除:
// 可以写在Servlet里,或者一个工具类里调用 public void testKeySize() { System.out.println("当前JRE路径: " + System.getProperty("java.home")); int maxAESKeyLength = javax.crypto.Cipher.getMaxAllowedKeyLength("AES"); System.out.println("AES最大支持密钥长度: " + maxAESKeyLength); }
如果输出的maxAESKeyLength是2147483647,说明替换成功;如果还是128,那肯定是替换的路径不对,得回去重新找Tomcat的JRE路径。
4. 重启Tomcat,测试加密方法
最后一步很关键:一定要把Tomcat彻底关掉(包括后台可能残留的进程),然后重新启动,再测试你的加密功能。很多人替换完直接点重启,结果Tomcat没加载新的policy文件,白忙活一场。
内容的提问来源于stack exchange,提问作者deadend
相关产品推荐
相关产品推荐

