原先已经调试好的微信小程序登陆 使用 code 换取 openid 和 session_key时报错:
(而且时测试环境没有此类问题,但是生产环境才有此错误)
org.springframework.web.client.ResourceAccessException I/O error on GET request for "https://api.weixin.qq.com/sns/oauth2/access_token": nested exception is javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
多次调用时,发现重复出现上面的错误和如下错误:其中打印日志下面三个参数的字节数组都有数据;但返回值null
String decryptToString(String base64EncryptedData, String base64SessionKey, String base64Iv)
通过日志可以看出,程序没有走:LOGGER.debug("WeixinAESUtils byte[] decrypt: 没有调用这里3。。。?"); 这一句...
排查了好久,依然找不到问题之所在,待解决问题后继续更新
最终找到原因:原来是交代运维部署的环境配置有遗漏,导致环境配置不一致!!! 真是坑爹了呀!!
附上部署注意事项:
# 部署注意事项
1. 代码中使用了```SecureRandom.getInstance("SHA1PRNG")```用于生成安全密钥,在sun/oracle的jdk里,这个算法的提供者在底层依赖到操作系统提供的随机数据,在linux上,与之相关的是/dev/random和/dev/urandom,前者阻塞的,后者是非阻塞的,应配置JDK使用非阻塞算法
```
cd $JAVA_HOME/jre/lib/security
vim java.security
securerandom.source=file:/dev/./urandom
```
参考文档:https://hongjiang.info/jvm-random-and-entropy-source/
2. 代码中使用了AES对称加解密算法,依赖于BouncyCastleProvider,需添加到java.security中:
```
cd $JAVA_HOME/jre/lib/security
vim java.security
# 数字10按配置文件中实际数值,按已配置的最大值加1,并非固定数值
security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
```
同时,需要添加 bcprov-jdk16-146.jar, bcmail-jdk16.143 到 $JAVA_HOME/jre/lib/ext
参考文档:https://blog.csdn.net/u012454773/article/details/78841692