故障描述
在我们的生产环境中,我们制作了一个健康检查页面,并通过脚本去监控他的健康状态,可是在前天(2020-5-30 周六)下午 18:50 左右的时候收到告警健康检查页面故障,等我登录服务器排查故障的时候发现是curl命令报错,报错的内容为:
[root@ip-10-0-10-100 ~]# curl -v https://xxxxxx.cn/hcaextension/hcmini/v1/healthyCheck
* Trying 54.223.xxx.xx...
* TCP_NODELAY set
* Connected to xxxxxxxx.cn (54.223.xx.xx) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (OUT), TLS alert, certificate expired (557):
* SSL certificate problem: certificate has expired
* Closing connection 0
curl: (60) SSL certificate problem: certificate has expired
More details here: https://curl.haxx.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
在通过测试,发现AWS EC2为:Linux 、Linux2 的操作系统不能够正常使用,在AWS EC2 -Centos 7.7、阿里云以及物理机房中测试是没有问题的。
分析过程
经过查看报错信息,发现是由于SSL握手的时候证书验证错误导致的,以下是排查的步骤:
1. Curl 的-k参数可以忽略SLL证书的验证,可以添加-k参数临时避免遇到此错误,
如下是我的测试,发现可以正常的访问页面:
curl -k https://xxxxxx.cn/hcaextension/hcmini/v1/healthyCheck
{"code":0,"msg":"成功","messageid":"29250cf5-176b-4993-a724-e5c9d7cc2ace"}
2. 通过进一步分析证书“xxxxx.cn”,我们发现证书链是存在问题的,我们的证书自身并没有过期,但是一个证书链证书过期了,我们提取了证书链的信息,您可以参考附件的信息。
因为我们的证书是上传在了AWS的ALB 中,在我打算删除过期的证书链的时候问题来了......
AWS的ALB 无法修改编辑、更新、下载之前上传的证书,最后联系aws的工作人员得到了如下回复
感谢您联系我们,我们并没有权限来为您删除或者调整IAM中证书的信息。目前我们了解到您证书的信息已经丢失了,您可以通过如下CLI命令来取回证书、证书链 (如果已上传一个) 和有关证书的元数据: aws iam get-server-certificate --server-certificate-name xxxx.cn 但是无法从 IAM 下载或检索私有密钥,所以您是无法完整的从下载所有的证书信息。删除过期证书链的建议也是一种尝试解决方案,也可能存在将过期的证书链删除后,由于证书链不完整导致的其他问题。您目前已经丢了证书的信息,您的证书应该是从第三方厂商申请的,鉴于目前的情况,我们更建议您来联系您申请证书的厂商,说明您的情况,尝试可否找到合适找回证书信息以及处理证书链过期的方案。
解决方法
1、应急方法:
更新证书链,将过期的证书链信息去除,尝试是否可以正常访问:
https://docs.amazonaws.cn/IAM/latest/UserGuide/id_credentials_server-certs.html
2、重新上传更新证书