解读JDK8踩坑JCE加密限制版本问题
作者:gblfy
一、解决方案1
声明:jdk1.8已经经过线上环境使用
1. 调研
JDK8的加密策略存在限制版本和无限制版本,随着越来越多的第三方工具只支持 JDK8,业务环境中,发现有些方法会报异常。
2. 常见的异常
1、使用AES加解密
- 异常1:
java.security.InvalidKeyException: Illegal key size or default parameters
- 异常2:
java.lang.SecurityException: JCE cannot authenticate the provider BC
3. 安全性机制导致的访问https会报错
Received fatal alert: handshake_failure; nested exception is javax.net.ssl.SSLHandshakeException:
Received fatal alert: handshake_failure,accessUrl
这是因为某些国家的进口管制限制,JDK默认的加解密有一定的限制。
4. 解决方案
比如默认不允许 256 位密钥的 AES 加解密,解决方法就下载官方JCE无限制强度加密策略文件,覆盖即可。
官方网站提供了JCE无限制权限策略文件的下载:
- JDK6的下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
- JDK7的下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
- JDK8的下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
5. 操作流程
从官网下载jce策略文件(补丁包),进入到jdkjre\lib\security目录 ,覆盖原有策略文件
注:如果测试通过下面的第6步可以跳过,如果不行请继续操作
6. 移动jar配置策略
第1步:
把包bcprov-jdk15on-1.56.jar复制一个,放到linux的$JAVA_HOME/jre\lib\ext下面
第2步:
配置我的安全属性文件
vim /$JAVA_HOME/jre/lib/security/java.security
security.provider.1=sun.security.provider.Sun security.provider.2=sun.security.rsa.SunRsaSign security.provider.3=sun.security.ec.SunEC security.provider.4=com.sun.net.ssl.internal.ssl.Provider security.provider.5=com.sun.crypto.provider.SunJCE security.provider.6=sun.security.jgss.SunProvider security.provider.7=com.sun.security.sasl.Provider security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI security.provider.9=sun.security.smartcardio.SunPCSC #下面这一行是我新添加的 security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
重启服务再次测试
二、解决方案2
2.1. 声明
官网说从jdk的某个版本以后,只需简单配置策略文件配置即可
从Java 1.8.0_151和1.8.0_152开始,为JVM启用无限制强度管辖策略 有了一种新的更简单的方法。
如果不启用此功能,则不能使用AES-256:
2.2. 编辑策略文件
vim /$JAVA_HOME/jre/lib/security/java.security
2.3. 修改默认属性
在 jre/lib/security 文件夹中查找文件 java.security,现在用文本编辑器打开java.security,并找到定义java安全性属性crypto.policy的行,它可以有两个值limited或unlimited - 默认值是limited。
将其设置为:
crypto.policy=unlimited
现在重新启动指向JVM的Java应用程序即可。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。