最近公司领导用阿里云的工具扫描服务器上的项目,发现很多的高危漏洞;
其中有一个是shiro-jar-1.4版本存在高风险漏洞,所以赶紧解决它:
项目情况:这个项目是公司以前的旧项目,没有源代码,只有服务器上面的 war 包文件。
第一种方法升级 shiro-1.4.jar 到 shiro-1.6.jar,开始干活:
在官网下载了shiro-1.6的相关jar包文件:
下载shior-1.6jar 包地址: https://pan.baidu.com/s/1aKpXD1ceugMuoXu0ot16Cw 提取码: 8ay6
然后把项目服务停掉,把shiro-1.4的jar 包删除了,上传1.6的版本jar 包,重启服务器;
呃,启动正常访问不了,查看错误日志:
提示项目jdk的版本不一致!!!!!!
接着查看shiro.jar包的jdk编译版本:
shiro-1.4的jar ,Build-Jdk: 1.8.0_77
shiro-1.6的jar, Build-Jdk: 11.0.7
检查jar包shiro-1.4是jdk1.8编译的,shiro-1.6是jdk11编译的;
所以撤回项目还原了。
决定另外搭建一套环境,配置服务器的jdk为11 版本。
兴奋的启动。。。
呃,结果有出错了:
java.lang.NoClassDefFoundError:javax/xml/soap/SOAPException;
查了很多资料找到问题原因:
jdk9 以下的版本包含:javax.xml.soap 这个模块;
jdk9及以上这个路径下就没有这个模块了,
所以jar包升级失败了。。。此路不通。
下面就开始尝试另外一种方法:修改Shiro源代码AbstractRememberMeManager中的Key值:
在shiro 的配置文件 :shiro-context.xml, 进行修改:
DESKey值是写死的:4AvVhmFLUs0KTA3Kprsdag==;
所以修改成动态的Key值就完美解决问题了:
public class GenerateCipherKey {
public static byte[] getCipherKey() {
KeyGenerator kg;
try {
kg = KeyGenerator.getInstance(“AES”);
} catch (NoSuchAlgorithmException e) {
String msg=“shiro 密钥随机生成异常”;
throw new IllegalStateException(msg ,e);
}
kg.init(128);
SecretKey sk = kg.generateKey();
byte[] cipherKey = sk.getEncoded();
return cipherKey;
}
}