ssl shakehand failed握手失败

2020-12-08  本文已影响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这个加密方式,处理办法如下。

  1. 找到本地jdk安装目录,打开jre/lib/security/java.security文件
  2. 找到文件中secp256k1(跟在jdk.disabled.namedCurves = 后面),删除就行了。
上一篇下一篇

猜你喜欢

热点阅读