一、前言
业务系统包含PC端和移动端,移动端为微信小程序。在小程序客户端发送消息未得到回应,查询系统后台日志发现报错日志。JDK或者JRE中自带的“local_policy.jar ”和“US_export_policy.jar”是支持128位密钥的加密算法,而当我们要使用256位密钥算法的时候,已经超出它的范围,无法支持,所以才会报:“java.security.InvalidKeyException: Illegal key size or default parameters”的异常。根据百度查询处理博主替换了jdk中相关的两个jar包,重启系统,发现还是报这个错误。博主进一步排查发现原来博主部署方式是tomcat多实例部署,替换的也是该实例下的jar包,但是在操作系统层面也安装了jdk8版本,并且配置了jre环境变量,而tomcat运行时优先使用jre环境变量中的java版本,找不到JRE_HOME环境变量的情况下使用JAVA_HOME环境变量中的java版本。这就是这篇博文的由来因果。
二、解决微信小程序加解密报错
1、微信小程序后端报错
报错信息:Forwarding to error page from request [/wx/*******/callback/] due to exception [java.security.InvalidKeyException: Illegal key size]
2、检查JAVA环境变量
$ echo $JRE_HOME
$ echo $JAVA_HOME
3、检查java版本
$ java -version
4、下载支持256位加解密算法的环境变量
可以从官网或者CSDN下载支持256位加解密算法的两个jar包(local_policy.jar和US_export_policy.jar),CSDN下载链接:java支持256位加密算法所需jar包。
5、将下载jar包替换现有jar包
将下载的jar包上传到服务器上,根据第二步查看的java环境变量情况,确定需要替换的目录,如果有JRE_HOME环境变量则优先替换JRE_HOME环境变量路径下的jar包,如果没有则替换JAVA_HOME环境变量路径下的jar包。
6、重启应用
替换后重启系统服务,再次发起消息,查看系统后台日志不再报错,客户端也可以正常收到消息回复啦!
$ ./bin/shutdown.sh
$ ./bin/startup.sh
三、tomcat运行依赖java环境变量优先级实验
博主实际运行环境比较特殊,为了验证tomcat对应java环境的使用优先级顺序,博主准备了两个java版本,并配置启用了manager服务。通过manager服务可以查看tomcat实例依赖的JVM环境java版本。
1、上传两个java版本到服务器
[root@s142 local]# ll |grep -E “java|jdk”
lrwxrwxrwx. 1 root root 12 Apr 6 15:34 java -> jdk1.8.0_291
lrwxrwxrwx. 1 root root 12 Apr 6 15:34 java241 -> jdk1.8.0_241
drwxr-xr-x. 7 root root 245 Dec 11 2019 jdk1.8.0_241
drwxr-xr-x. 8 root root 273 Apr 8 2021 jdk1.8.0_291
-rw-r–r–. 1 root root 194545143 Mar 13 2020 jdk-8u241-linux-x64.tar.gz
-rw-r–r–. 1 root root 144935989 Jun 16 2021 jdk-8u291-linux-x64.tar.gz
2、配置java环境变量
操作系统安装两个java版本,一个用于指定JAVA_HOME环境变量,一个用于配置JRE_HOME环境变量配置。我们在操作系统查看现在的java版本都是JAVA_HOME环境变量配置的版本。
[root@s142 local]# cat /etc/profile
…
#java env test
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java241/jre
export PATH=${JAVA_HOME}/bin:$PATH
…
(base) [wuhs@s142 tomcat8]$ java -version
java version “1.8.0_291”
Java™ SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot™ 64-Bit Server VM (build 25.291-b10, mixed mode)
3、部署一个tomcat实例
部署一个tomcat实例,如何部署manager见博文Tomcat之服务管理页面manager部署。
4、启动服务
(base) [wuhs@s142 tomcat8]$ java -version
java version “1.8.0_291”
Java™ SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot™ 64-Bit Server VM (build 25.291-b10, mixed mode)
(base) [wuhs@s142 tomcat8]$ ./bin/startup.sh
5、查看JVM版本
启动tomcat实例,我们可以看到tomcat实例运行在JRE_HOME环境变量的java版本上。
6、修改环境变量
我们修改环境变量配置,取消JRE_HOME环境变量配置。
[root@s142 local]# cat /etc/profile
…
#java env test
export JAVA_HOME=/usr/local/java
#export JRE_HOME=/usr/local/java241/jre
export PATH=${JAVA_HOME}/bin:$PATH
[root@s142 local]# java -version
java version “1.8.0_291”
Java™ SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot™ 64-Bit Server VM (build 25.291-b10, mixed mode)
7、重启服务
(base) [wuhs@s142 tomcat8]$ ./bin/shutdown.sh
(base) [wuhs@s142 tomcat8]$ ./bin/startup.sh
8、再次查看JVM版本
此时可以看到JVM版本是JAVA_HOME配置指定的版本。
9、启动日志查看
实际上,在单实例运行中,我们可以看到启动日志已经将环境变量设置显示了出来,不管如何配置tomcat内部使用的都是JRE_HOME这个配置,只是在找不到操作系统JRE_HOME配置的时候,JRE_HOME配置就会取JAVA_HOME的值赋值给JRE_HOME。
(base) [wuhs@s142 tomcat8]$ ./bin/startup.sh
Using CATALINA_BASE: /home/wuhs/tomcat8
Using CATALINA_HOME: /home/wuhs/tomcat8
Using CATALINA_TMPDIR: /home/wuhs/tomcat8/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /home/wuhs/tomcat8/bin/bootstrap.jar:/home/wuhs/tomcat8/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
10、总结
实际上Tomcat实例运行时依赖的java环境是取值于JRE_HOME,如果找不到则使用JAVA_HOME赋值给JRE_HOME。如果是多实例环境运行,为了减少系统可能的多java版本带来的影响,建议使用JRE_HOME定义java环境。