环境
- JDK1.8.0_271
- springboot 2.2.6.RELEASE
- web3sdk 2.5.0
情况介绍
项目是通过连接bcos链,获取节点信息并上传到另一https服务接口。
项目启动的时候会先从https服务接口获取token,然后连接bcos链获取链信息,通过token上传https服务。
问题
项目启动的时候,先打印获取到token信息,然后通过web3sdk连接bcos链。这个时候问题出现了,ssl shakehand failed
并且没有任何异常信息。
握手失败定位过程
debug
没有找到什么有用的问题
打印握手信息
加上启动参数-Dssl.debug=true -Djavax.net.debug=all
即可打印握手信息,发现在客户端发送ClientHello
包之后,发现连接关闭了javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify
。
Wireshark抓包
image.png抓了包之后以为是SNI问题,最后排除了这个情况。因为我直接用的是IP,不需要SNI配合(自己理解的,具体还需要查资料确认)。
问题的本质
回归到问题的本质上,调用bcos是一个单独的jar,在这个jar单独写测试用例,发现连接成功...
然后在项目中写测试用例,又握手失败...
仔细查log发现获取token使用的是Spring注解@PostConstruct
,这玩意在类创建后就开始执行,而不是项目启动成功之后。
神奇的事情发生了,调整为项目启动成功之后再获取token(implements ApplicationRunner或CommandLineRunner),这就成了...
......
其他问题
PKIX path validation failed: java.security.cert.CertPathValidatorException: Algorithm constraints check failed on disabled algorithm: secp256k1
这个问题是因为我的jdk版本禁用了secp256k1这个加密方式,处理办法如下。
- 找到本地jdk安装目录,打开
jre/lib/security/java.security
文件 - 找到文件中
secp256k1
(跟在jdk.disabled.namedCurves = 后面),删除就行了。
网友评论