JDK1.8解决微信支付相关的IllegalArgumentException: java.security.InvalidKeyException: Illegal key size问题
微信支付V3调用过程中遇到的java.security.InvalidKeyException: Illegal key size问题,通常是由于使用的加密密钥长度超过了Java默认支持的范围。
错误内容:
Caused by: java.lang.IllegalArgumentException: java.security.InvalidKeyException: Illegal key size
at com.wechat.pay.contrib.apache.httpclient.util.AesUtil.decryptToString(AesUtil.java:47)
at com.wechat.pay.contrib.apache.httpclient.util.CertSerializeUtil.deserializeToCerts(CertSerializeUtil.java:42)
at com.wechat.pay.contrib.apache.httpclient.cert.CertificatesManager.downloadAndUpdateCert(CertificatesManager.java:267)
at com.wechat.pay.contrib.apache.httpclient.cert.CertificatesManager.initCertificates(CertificatesManager.java:295)
at com.wechat.pay.contrib.apache.httpclient.cert.CertificatesManager.putMerchant(CertificatesManager.java:152)
at com.magicyo.pay.config.WechatPayConfig.getVerifier(WechatPayConfig.java:133)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
... 102 common frames omitted
Caused by: java.security.InvalidKeyException: Illegal key size
at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1039)
at javax.crypto.Cipher.implInit(Cipher.java:805)
at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
at javax.crypto.Cipher.init(Cipher.java:1396)
at javax.crypto.Cipher.init(Cipher.java:1327)
at com.wechat.pay.contrib.apache.httpclient.util.AesUtil.decryptToString(AesUtil.java:40)
... 112 common frames omitted
以下是解决这个问题的步骤:
(1)安装Java加密扩展(JCE)无限制强度管辖策略文件
对于Oracle JDK 8:
1.下载JCE无限制强度管辖策略文件:https://www.oracle.com/java/technologies/javase-jce8-downloads.html
2.解压文件并替换:将下载的local_policy.jar和US_export_policy.jar文件替换到<JAVA_HOME>/jre/lib/security/目录中。
对于Oracle JDK 9及更高版本:
JCE文件已经默认包含在JDK中,只需启用即可。
1.找到配置文件:<JAVA_HOME>/conf/security/java.security
2.启用无限制策略:
properties
crypto.policy=unlimited
确保其值为unlimited。如果没有这一行,手动添加。
对于OpenJDK:
OpenJDK 8u161及更高版本默认启用了无限制强度策略。
2. 使用Bouncy Castle库
如果安装JCE策略文件后问题仍然存在,可以使用Bouncy Castle库来替代JCE。
(1)添加Bouncy Castle依赖
在Maven项目的pom.xml中添加以下依赖:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.68</version>
</dependency>
(2)在代码中添加Bouncy Castle作为安全提供者
确保在应用启动时添加Bouncy Castle作为安全提供者:
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.Security;
public class Application {
public static void main(String[] args) {
Security.addProvider(new BouncyCastleProvider());
// 启动Spring应用或其他初始化代码
}
}
(3)检查微信支付配置中的密钥设置
确保微信支付的密钥配置正确,并且密钥长度符合要求。以下是一个示例配置:
@Configuration
public class WechatPayConfig {
@Bean
public Verifier getVerifier() throws Exception {
// 加载微信支付公钥
InputStream certStream = getClass().getResourceAsStream("/path/to/wechatpay/cert.pem");
// 初始化公钥验证器
Verifier verifier = new Verifier(certStream);
return verifier;
}
}
(4)检查依赖的库版本
确保所有相关库的版本都是兼容的,尤其是微信支付相关的库和Spring框架。
重新启动
完成以上步骤后,重新启动你的Spring应用,问题应该得到解决。
通过以上步骤,你应该能够解决微信支付相关的IllegalArgumentException: java.security.InvalidKeyException: Illegal key size问题。如果问题仍然存在,请检查所有相关的密钥配置和加密操作,确保它们都符合要求。