报错信息:(因为涉及到源码,只敲报错的部分)
java.security.InvalidKeyException: Private Key cannot be used to encrypt
at com.bim.crypto.provider.RSA.engineInit(Unknown source)
at javax.crypto.Cipher.a(Unknown source)
at javax.crypto.Cipher.a(Unknown source)
背景:
在使用RSA加密时,报java.security.InvalidKeyException:Private key cannot be used to encrypt,直接翻译错误就是,不能够使用私钥加密。
奇怪的是,本地测试时没有这个问题,只有服务器才会报错,那问题就出在环境的差异上。
分析:
本地用的是sun JDK,中间件是Tomcat,测试和生产环境使用的都是openJDK ,中间件是Websphere,可能问题就出来这里。经过仔细查看错误日志,报错包含ibm,更怀疑是中间件websphere的问题,
经过查询,问题出在jdk上面,测试环境中间件WebSphere使用的是OPEN JDK,OPEN JDK有一个属性,-Dcom.ibm.crypto.provider.DoRSATypeChecking默认为true,私匙不能用于加密。其实OPEN JDK这么做也是可以理解,如果使用公钥加密,那么只有私钥才可以解密,这样保证了信息的安全。可如果我们用私钥加密,那么拥有公钥的都能解密,这样信息就不安全的。但我们这是使用对方提供的demo,只能使用私钥加密。
解决方法:
我们将OPEN JDK的属性,-Dcom.ibm.crypto.provider.DoRSATypeChecking 设置为false
我们在webspehre种添加 通用JVM参数-Dcom.ibm.crypto.provider.DoRSATypeChecking=fasle
Websphere设置通用JVM参数步骤:
1.登录webpshere
2、服务器-服务器类型-Websphere Application Server --应用程序服务器进入到server中
3、服务器基础结构-Java和进场管理-进程定义
4、Java虚拟机-此页可以看到通用JVM参,添加
-Dcom.ibm.crypto.provider.DoRSATypeChecking=fasle
5、应用--保存
6、重启生效
ps:内网环境无法截图,找不到的可以留言或私信