早上上班,正常巡检,发现有个微服务异常报错
[ERROR] 2023-12-11 09:39:52.550 [http-nio-2010-exec-4] cn.zcyun.xcloud.personal.openapi.utils.YimaHttp - https请求异常:{}sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
一开始以为是自身业务有问题,但是转念一想,该服务是个微服务,本身不牵扯到SSL证书。一般配置SSL证书是在负载均衡里面配置。
于是,恍然大悟,是该服务访问外界的SSL。
登录服务器,使用docker inspect -f '{{.State.Pid}} 容器id'
找到process id,然后nsenter -n -t $Pid
进入后。使用tcpdump -i eth0 tcp port 443 -w 443.pcap -c 200
。
等了十几分钟,还没有结束。手动ctrl+c结束,然后看到收到了几十个包。使用tsz 443.pcap
下载到本地。
然后,发现了一个ip地址124.70.28.136。
这个地址是啥呢?
直接访问,是一个ELB。
在笔记本中搜索,原来发现是我们的商城网站pc.stesh.cn的地址。
为什么容器访问会报错呢?
在容器网络中,继续使用curl https://pc.stesh.cn
提示证书错误,需要使用-k
访问。但是使用浏览器可以正常访问。
这是为何呢?
登录华为云,检查该ELB的SSL证书配置,发现证书里面只是配置了1个,没有中间证书链和根证书链
网站证书 > CA 中间证书机构 > CA 根证书机构
-----BEGIN CERTIFICATE-----
网站证书
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
CA 中间证书机构
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
CA 根证书机构
-----END CERTIFICATE-----
日常,我们采用acme.sh脚本定期申请泛域名证书。现在将证书fullchain中的信息全部拷贝到华为云SSL证书配置框内,提示报错。但是删掉前两个是正常。
于是,使用证书链补全网站对证书进行补全,然后复制到华为云ELB SSL证书配置业内,居然成功了。
对比了证书链补全的信息与acme.sh申请出来的证书发现,前者没有空行,而后者有空行。
现在想想,搞了一个乌龙。上次补充证书的时候,由于华为云报错,我只粘贴了最后一段。而且导致pc.stesh.cn访问异常。现在正常了。