Bluemix RSA Private key cannot be used to encrypt

前言:
如果我们使用IBM的JDK,然后采用私钥进行RSA加密,就可能报错,如下:
java.security.InvalidKeyException: Private key cannot be used to encrypt.
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
   at java.lang.Thread.run(Thread.java:777)
   at com.ibm.crypto.provider.RSASSL.engineInit(Unknown Source)
   at javax.crypto.Cipher.init(Unknown Source)
   at javax.crypto.Cipher.init(Unknown Source)
   at java.security.Signature$CipherAdapter.engineInitSign(Signature.java:1239)
   at java.security.Signature$Delegate.init(Signature.java:1116)
   at java.security.Signature$Delegate.chooseProvider(Signature.java:1076)
   at java.security.Signature$Delegate.engineInitSign(Signature.java:1140)
   at java.security.Signature.initSign(Signature.java:522)
   at net.vx4.lib.tls.core.TLSSignature.createSignature(TLSSignature.java:120)
看到这个错误,我们很好理解,就是私钥不能用于RAS加密:
Private key cannot be used to encrypt.
其实IBM JDK这么做也是有道理的,如果我们采用公钥加密,那么只有拥有私钥的人,才能解密,这样信息是绝对安全的。可是如果我们用私钥加密,那么任何拥有公钥的人,都能解密,这样信息是不安全的。不过有时候也需要这么做,因为可以保证消息的可靠性。
所以默认情况下,IBM JDK这么做,也是完全可以理解的。那我们需要采用私钥加密,那要怎么办?
只需要添加这个属性就可以了: -Dcom.ibm.crypto.provider.DoRSATypeChecking=false

那么如何在Bluemix上解决这个问题,好吧,CF又来了,又是2行命令,修改环境变量:
cf set-env  [Your App's Name]   IBM_JAVA_OPTIONS "-Dcom.ibm.crypto.provider.DoRSATypeChecking=false"
cf restage  [Your App's Name]
执行成功以后,在Bluemix官网中,就能看到“环境变量”里的“用户自定义”里看到刚才设置的环境变量,上上篇的博客里已经提到了,这里不再啰嗦。




你可能感兴趣的:(rsa,private,key,私钥,bluemix)