您当前的位置:首页 > 电脑百科 > 站长技术 > 服务器

一个因CA根证书过期引起的故障

时间:2020-06-23 10:09:52  来源:  作者:

服务器上的应用服务对外发送的一些https请求都失败了,真相竟然是。。。

问题

10点左右,同事反馈咨询线上的Sentry服务器现在是否正常。之后去检查Sentry服务,运行正常,但是该应用服务对接的Sentry频道已经很久没有事件进来了。

感觉不太对劲,再去检查下Sentry worker专用的容器, 发现该Worker服务中中有些错误日志:

E, [2020-06-01T04:02:03.670850 #6] ERROR -- sentry: ** [Raven] Unable to record event with remote Sentry server (Raven::Error - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (certificate has expired)):
/usr/local/bundle/gems/sentry-raven-2.7.3/lib/raven/transports/http.rb:34:in `rescue in send_event'
/usr/local/bundle/gems/sentry-raven-2.7.3/lib/raven/transports/http.rb:16:in `send_event'
/usr/local/bundle/gems/sentry-raven-2.7.3/lib/raven/client.rb:37:in `send_event'
/usr/local/bundle/gems/sentry-raven-2.7.3/lib/raven/instance.rb:81:in `send_event'
/App/src/worker.rb:26:in `perform'
/usr/local/bundle/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:187:in `execute_job'
/usr/local/bundle/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:169:in `block (2 levels) in process'
/usr/local/bundle/gems/sidekiq-5.1.3/lib/sidekiq/middleware/chain.rb:128:in `block in invoke'
/usr/local/bundle/gems/sentry-raven-2.7.3/lib/raven/integrations/sidekiq.rb:9:in `call'
/usr/local/bundle/gems/sidekiq-5.1.3/lib/sidekiq/middleware/chain.rb:130:in `block in invoke'
/usr/local/bundle/gems/sidekiq-5.1.3/lib/sidekiq/middleware/chain.rb:133:in `invoke'
E, [2020-06-01T04:02:03.671130 #6] ERROR -- sentry: ** [Raven] Failed to submit event: <no message value>

奇怪?sentry-worker在连sentry server 时请求域名的证书过期了?

分析

针对上面的错误信息,先去检查了相关调用的域名证书的有效期,发现都在有效期内。而且印象中都是年初刚更换的。所以排除了是域名证书问题。

然后根据错误日志,尝试在自己电脑上用下curl 命令,巧合的很,也遇到了类似的错误.

$ curl https://sentry.xxx.com
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.

我又去找了其它一台centos主机,发现curl返回的结果是正常的,从web端和centos客户端curl都成功的看,像是我本机电脑的curl和sentry-worker主机出了问题。

之后用到网上找到使用openssl命令排查ssl错误的方法:

$ openssl s_client -showcerts -servername sentry.xxx.com -connect sentry.xxx.com:443
CONNECTED(00000003)
depth=3 C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root
verify error:num=10:certificate has expired
notAfter=May 30 10:48:38 2020 GMT
---
Certificate chain
 0 s:/OU=Domain Control Validated/OU=GoGetSSL Wildcard SSL/CN=*.xxx.com
   i:/C=LV/L=Riga/O=GoGetSSL/CN=GoGetSSL RSA DV CA
-----BEGIN CERTIFICATE-----
#...省略

从上面执行命令返回的内容来看,这里的CA证书AddTrust External CA Root 在May 30 10:48:38 2020 GMT 这个时间过期了。

上网查了下相关的资料,发现他们官方发过一篇通告:
Sectigo-AddTrust-External-CA-Root-Expiring-May-30-2020.

解决方案

现在算是找到为什么请求https会出现证书过期的原因了。接下来看下如何解决:

  1. 修改服务器ca配置
  2. 更新ca库信息

主机(Ubuntu)

修改服务器CA配置

修改服务器ca证书配置文件:/etc/ca-certificates.conf

sed -i "/AddTrust_External_Root.crt/d" /etc/ca-certificates.conf
更新CA库

使用update-ca-certificates 该命令用以更新目录/etc/ssl/certs来保存SSL证书,并生成ca-certificates.crt:

$ sudo update-ca-certificates --fresh
Clearing symlinks in /etc/ssl/certs...
done.
Updating certificates in /etc/ssl/certs...
147 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

重启主机上的应用程序。

容器(Docker-Alpine OS)

容器同主机上的修改差不太多。修改ca配置文件,之后执行更新命令。以下以alpine系统为例:

修改配置文件:

sed -i "/AddTrust_External_Root.crt/d" /etc/ca-certificates.conf

更新ca证书链:

update-ca-certificates -f -v

当然上面的两条命令最好是放在Dockerfile中,你知道,在容器里做的任何修改都是不可靠的(除非挂载了共享或卷)

Dockerfile示例,在CMD之前添加一行:

省略...
RUN sed -i "/AddTrust_External_Root.crt/d" /etc/ca-certificates.conf 
    && update-ca-certificates -f -v

macOS

我自己电脑上的curl也是同样的问题,目前没找到好的自动修改的方式。不过找到了系统上的ca文件路径。

先备份下文件:

sudo cp /etc/ssl/cert.pem ~/etc-ssl-cert.pem-20200601

之后,运行以下命令可以禁用掉过期的CA证书:

sudo sed -i "/^### AddTrust/,/^-.*END/ s/^/#/g" /etc/ssl/cert.pem

上面是注释掉,当然你也可以直接编辑文件删除这些行。

验证

修改更新完ca配置后,再次执行curl 命令去访问之前的网站

$ curl https://sentry.xxx.com

这次访问正常了.

其他问题

当时出现问题时,还有另外一个现象,就是用curl访问其他网站(如,bing.com、qq.com)都是正常的. 怀疑是不是目标域名使用的证书链不一样, 导致了只有我们业务域名出现了问题呢?

验证下猜想

使用openssl 检查下我们业务域名证书的链

# openssl s_client  -connect sentry.xxx.com:443
CONNECTED(00000003)
depth=2 C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust RSA Certification Authority
verify return:1
depth=1 C = LV, L = Riga, O = GoGetSSL, CN = GoGetSSL RSA DV CA
verify return:1
depth=0 OU = Domain Control Validated, OU = GoGetSSL Wildcard SSL, CN = *.xxx.com
verify return:1
---
Certificate chain
 0 s:/OU=Domain Control Validated/OU=GoGetSSL Wildcard SSL/CN=*.xxx.com
   i:/C=LV/L=Riga/O=GoGetSSL/CN=GoGetSSL RSA DV CA
 1 s:/C=LV/L=Riga/O=GoGetSSL/CN=GoGetSSL RSA DV CA
   i:/C=US/ST=New Jersey/L=Jersey City/O=The USERTRUST Network/CN=USERTrust RSA Certification Authority
 2 s:/C=US/ST=New Jersey/L=Jersey City/O=The USERTRUST Network/CN=USERTrust RSA Certification Authority
   i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
---
Server certificate
省略...

在检测下上面说的其他网站bing.com:

$ openssl s_client  -connect cn.bing.com:443
CONNECTED(00000003)
depth=2 C = IE, O = Baltimore, OU = CyberTrust, CN = Baltimore CyberTrust Root
verify return:1
depth=1 C = US, ST = Washington, L = Redmond, O = Microsoft Corporation, OU = Microsoft IT, CN = Microsoft IT TLS CA 2
verify return:1
depth=0 CN = www.bing.com
verify return:1
---
Certificate chain
 0 s:/CN=www.bing.com
   i:/C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/OU=Microsoft IT/CN=Microsoft IT TLS CA 2
 1 s:/C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/OU=Microsoft IT/CN=Microsoft IT TLS CA 2
   i:/C=IE/O=Baltimore/OU=CyberTrust/CN=Baltimore CyberTrust Root
---
省略...

我又测试了其他几个大的站点,发现都正常。为什么唯独我们的SSL证书链中的其中一个CA(Sectigo AddTrust)过期了呢?

去查找下相关的文章,关键词sectigo gogetssl 2020 may 30.

发现第三条记录中有gogetssl发布的新闻, 标题是:Sectigo AddTrust External CA Root Expired May 30, 2020, 感兴趣的可以点击进去看看。

新闻大致的意思:

由于Sectigo AddTrust外部CA根证书过期,影响了一些旧的设备或者一些老服务器,因为上面的根证书链中还存在该过期的CA证书。对于客户端(浏览器/SDK)来说,他们是不受该CA过期的问题影响。所以最大影响是在server端. 可以通过下载最新的AddTrust RSA 证书替换过期的。

总结

目前该问题的影响面广不广,这个还暂时未知,不过根据我遇到的情况来看,影响大多在服务器端的外部服务之间的调用。对web用户端来说,因为浏览器内证书链是更新的,不涉及该问题。但对于 服务端来说,对于一些对外调用的https请求,如果对方域名证书链中涉及到该过期CA的话,可能会访问失败。

Tips1:如果你的应用程序的部署方式是直接运行在主机上的话,可以使用配置管理工具(ansible/saltstack),统一修改。如果是容器话部署的情况,可能涉及的稍微多一些,需要修改项目的Dockerfile,之后滚动更新该服务(当然如果你的应用不涉及到对外访问https/ssl调用,理论上可以延后更改!)。

Tips2: 删除过期证书后,记得要重启主机上运行的服务!!!

来源:
https://aliasmee.github.io/post/resolve-certificate-verify-failed-with-2020-may-30/



Tags:CA根证书   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
服务器上的应用服务对外发送的一些https请求都失败了,真相竟然是。。。问题10点左右,同事反馈咨询线上的Sentry服务器现在是否正常。之后去检查Sentry服务,运行正常,但是该应用...【详细内容】
2020-06-23  Tags: CA根证书  点击:(120)  评论:(0)  加入收藏
▌简易百科推荐
阿里云镜像源地址及安装网站地址https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b111kK44P更新源之前把之前的国外的镜像先备份一下 切换到yumcd...【详细内容】
2021-12-27  干程序那些事    Tags:CentOS7镜像   点击:(1)  评论:(0)  加入收藏
前言在实现TCP长连接功能中,客户端断线重连是一个很常见的问题,当我们使用netty实现断线重连时,是否考虑过如下几个问题: 如何监听到客户端和服务端连接断开 ? 如何实现断线后重...【详细内容】
2021-12-24  程序猿阿嘴  CSDN  Tags:Netty   点击:(12)  评论:(0)  加入收藏
一. 配置yum源在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repovim /etc/yum.repos.d/google-chrome.repo按i进入编辑模式写入如下内容:[google-chrome]name=googl...【详细内容】
2021-12-23  有云转晴    Tags:chrome   点击:(7)  评论:(0)  加入收藏
一. HTTP gzip压缩,概述 request header中声明Accept-Encoding : gzip,告知服务器客户端接受gzip的数据 response body,同时加入以下header:Content-Encoding: gzip:表明bo...【详细内容】
2021-12-22  java乐园    Tags:gzip压缩   点击:(9)  评论:(0)  加入收藏
yum -y install gcc automake autoconf libtool makeadduser testpasswd testmkdir /tmp/exploitln -s /usr/bin/ping /tmp/exploit/targetexec 3< /tmp/exploit/targetls -...【详细内容】
2021-12-22  SofM    Tags:Centos7   点击:(7)  评论:(0)  加入收藏
Windows操作系统和Linux操作系统有何区别?Windows操作系统:需支付版权费用,(华为云已购买正版版权,在华为云购买云服务器的用户安装系统时无需额外付费),界面化的操作系统对用户使...【详细内容】
2021-12-21  卷毛琴姨    Tags:云服务器   点击:(6)  评论:(0)  加入收藏
参考资料:Hive3.1.2安装指南_厦大数据库实验室博客Hive学习(一) 安装 环境:CentOS 7 + Hadoop3.2 + Hive3.1 - 一个人、一座城 - 博客园1.安装hive1.1下载地址hive镜像路径 ht...【详细内容】
2021-12-20  zebra-08    Tags:Hive   点击:(9)  评论:(0)  加入收藏
以下是服务器安全加固的步骤,本文以腾讯云的CentOS7.7版本为例来介绍,如果你使用的是秘钥登录服务器1-5步骤可以跳过。1、设置复杂密码服务器设置大写、小写、特殊字符、数字...【详细内容】
2021-12-20  网安人    Tags:服务器   点击:(7)  评论:(0)  加入收藏
项目中,遇到了一个问题,就是PDF等文档不能够在线预览,预览时会报错。错误描述浏览器的console中,显示如下错误:nginx代理服务报Mixed Content: The page at ******** was loaded...【详细内容】
2021-12-17  mdong    Tags:Nginx   点击:(7)  评论:(0)  加入收藏
转自: https://kermsite.com/p/wt-ssh/由于格式问题,部分链接、表格可能会失效,若失效请访问原文密码登录 以及 通过密钥实现免密码登录Dec 15, 2021阅读时长: 6 分钟简介Windo...【详细内容】
2021-12-17  LaLiLi    Tags:SSH连接   点击:(16)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条