自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一個(gè)因 CA 根證書過期引起的故障,真相竟然是…

新聞 系統(tǒng)運(yùn)維
服務(wù)器上的應(yīng)用服務(wù)對(duì)外發(fā)送的一些 https 請(qǐng)求都失敗了,真相竟然是……

[[330435]]

服務(wù)器上的應(yīng)用服務(wù)對(duì)外發(fā)送的一些 https 請(qǐng)求都失敗了,真相竟然是……

問題

10點(diǎn)左右,同事反饋?zhàn)稍兙€上的Sentry 服務(wù)器現(xiàn)在是否正常。之后去檢查 Sentry 服務(wù),運(yùn)行正常,但是該應(yīng)用服務(wù)對(duì)接的Sentry頻道已經(jīng)很久沒有事件進(jìn)來了。

感覺不太對(duì)勁,再去檢查下 Sentry worker專用的容器,發(fā)現(xiàn)該Worker服務(wù)中中有些錯(cuò)誤日志:

  1. 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)): 
  2.  
  3. /usr/local/bundle/gems/sentry-raven-2.7.3/lib/raven/transports/http.rb:34:in `rescue in send_event' 
  4.  
  5. /usr/local/bundle/gems/sentry-raven-2.7.3/lib/raven/transports/http.rb:16:in `send_event' 
  6.  
  7. /usr/local/bundle/gems/sentry-raven-2.7.3/lib/raven/client.rb:37:in `send_event' 
  8.  
  9. /usr/local/bundle/gems/sentry-raven-2.7.3/lib/raven/instance.rb:81:in `send_event' 
  10.  
  11. /app/src/worker.rb:26:in `perform' 
  12.  
  13. /usr/local/bundle/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:187:in `execute_job' 
  14.  
  15. /usr/local/bundle/gems/sidekiq-5.1.3/lib/sidekiq/processor.rb:169:in `block (2 levels) in process' 
  16.  
  17. /usr/local/bundle/gems/sidekiq-5.1.3/lib/sidekiq/middleware/chain.rb:128:in `block in invoke' 
  18.  
  19. /usr/local/bundle/gems/sentry-raven-2.7.3/lib/raven/integrations/sidekiq.rb:9:in `call' 
  20.  
  21. /usr/local/bundle/gems/sidekiq-5.1.3/lib/sidekiq/middleware/chain.rb:130:in `block in invoke' 
  22.  
  23. /usr/local/bundle/gems/sidekiq-5.1.3/lib/sidekiq/middleware/chain.rb:133:in `invoke' 
  24.  
  25. E, [2020-06-01T04:02:03.671130 #6] ERROR -- sentry: ** [Raven] Failed to submit event: <no message value> 

奇怪?sentry-worker 在連sentry server 時(shí)請(qǐng)求域名的證書過期了?

分析

針對(duì)上面的錯(cuò)誤信息,先去檢查了相關(guān)調(diào)用的域名證書的有效期,發(fā)現(xiàn)都在有效期內(nèi)。而且印象中都是年初剛更換的。所以排除了是域名證書問題。

然后根據(jù)錯(cuò)誤日志,嘗試在自己電腦上用下curl 命令,巧合的很,也遇到了類似的錯(cuò)誤。

  1. $ curl https://sentry.xxx.com 
  2.  
  3. curl: (60) SSL certificate problem: certificate has expired 
  4.  
  5. More details here: https://curl.haxx.se/docs/sslcerts.html 
  6.  
  7. curl failed to verify the legitimacy of the server and therefore could not 
  8.  
  9. establish a Secure connection to it. To learn more about this situation and 
  10.  
  11. how to fix it, please visit the web page mentioned above. 

我又去找了其它一臺(tái) Centos 主機(jī),發(fā)現(xiàn) curl 返回的結(jié)果是正常的,從 web 端和centos 客戶端 curl 都成功的看,像是我本機(jī)電腦的 curl 和sentry-worker主機(jī)出了問題。

之后用到網(wǎng)上找到使用openssl命令排查ssl錯(cuò)誤的方法:

  1. $ openssl s_client -showcerts -servername sentry.xxx.com -connect sentry.xxx.com:443 
  2.  
  3. CONNECTED(00000003
  4.  
  5. depth=3 C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root 
  6.  
  7. verify error:num=10:certificate has expired 
  8.  
  9. notAfter=May 30 10:48:38 2020 GMT 
  10.  
  11. --- 
  12.  
  13. Certificate chain 
  14.  
  15. 0 s:/OU=Domain Control Validated/OU=GoGetSSL Wildcard SSL/CN=*.xxx.com 
  16.  
  17. i:/C=LV/L=Riga/O=GoGetSSL/CN=GoGetSSL RSA DV CA 
  18.  
  19. -----BEGIN CERTIFICATE----- 
  20.  
  21. #...省略 

從上面執(zhí)行命令返回的內(nèi)容來看,這里的 CA 證書 AddTrust External CA Root 在 May 30 10:48:38 2020 GMT 這個(gè)時(shí)間過期了。

上網(wǎng)查了下相關(guān)的資料,發(fā)現(xiàn)他們官方發(fā)過一篇通告:Sectigo-AddTrust-External-CA-Root-Expiring-May-30-2020.

https://support.sectigo.com/articles/Knowledge/Sectigo-AddTrust-External-CA-Root-Expiring-May-30-2020

解決方案

現(xiàn)在算是找到為什么請(qǐng)求 https 會(huì)出現(xiàn)證書過期的原因了。接下來看下如何解決:

  1. 修改服務(wù)器ca配置
  2. 更新ca庫信息

主機(jī)(Ubuntu)

修改服務(wù)器 CA 配置

修改服務(wù)器 ca 證書配置文件:/etc/ca-certificates.conf

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

更新 CA 庫

使用update-ca-certificates該命令用以更新目錄/etc/ssl/certs來保存SSL證書,并生成 ca-certificates.crt:

  1. $ sudo update-ca-certificates --fresh 
  2.  
  3. Clearing symlinks in /etc/ssl/certs... 
  4.  
  5. done. 
  6.  
  7. Updating certificates in /etc/ssl/certs... 
  8.  
  9. 147 added, 0 removed; done. 
  10.  
  11. Running hooks in /etc/ca-certificates/update.d... 
  12.  
  13. done. 

重啟主機(jī)上的應(yīng)用程序。

容器(Docker-Alpine OS)

容器同主機(jī)上的修改差不太多。修改ca配置文件,之后執(zhí)行更新命令。以下以alpine系統(tǒng)為例:

修改配置文件:

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

更新 ca 證書鏈:

  1. update-ca-certificates -f -v 

當(dāng)然上面的兩條命令最好是放在 Dockerfile 中,你知道,在容器里做的任何修改都是不可靠的(除非掛載了共享或卷)。

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

省略...

  1. RUN sed -i "/AddTrust_External_Root.crt/d" /etc/ca-certificates.conf \ 
  2.  
  3. && update-ca-certificates -f -v 
  4.  
  5. MacOS 

我自己電腦上的curl也是同樣的問題,目前沒找到好的自動(dòng)修改的方式。不過找到了系統(tǒng)上的 ca 文件路徑。

先備份下文件:

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

之后,運(yùn)行以下命令可以禁用掉過期的 CA 證書:

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

上面是注釋掉,當(dāng)然你也可以直接編輯文件刪除這些行。

驗(yàn)證

修改更新完 ca 配置后,再次執(zhí)行curl 命令去訪問之前的網(wǎng)站:

  1. $ curl https://sentry.xxx.com 

這次訪問正常了。

其他問題

當(dāng)時(shí)出現(xiàn)問題時(shí),還有另外一個(gè)現(xiàn)象,就是用 curl 訪問其他網(wǎng)站(如,bing.com、qq.com)都是正常的。懷疑是不是目標(biāo)域名使用的證書鏈不一樣, 導(dǎo)致了只有我們業(yè)務(wù)域名出現(xiàn)了問題呢?

驗(yàn)證下猜想

使用 openssl 檢查下我們業(yè)務(wù)域名證書的鏈:

  1. # openssl s_client -connect sentry.xxx.com:443 
  2.  
  3. CONNECTED(00000003
  4.  
  5. depth=2 C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust RSA Certification Authority 
  6.  
  7. verify return:1 
  8.  
  9. depth=1 C = LV, L = Riga, O = GoGetSSL, CN = GoGetSSL RSA DV CA 
  10.  
  11. verify return:1 
  12.  
  13. depth=0 OU = Domain Control Validated, OU = GoGetSSL Wildcard SSL, CN = *.xxx.com 
  14.  
  15. verify return:1 
  16.  
  17. --- 
  18.  
  19. Certificate chain 
  20.  
  21. 0 s:/OU=Domain Control Validated/OU=GoGetSSL Wildcard SSL/CN=*.xxx.com 
  22.  
  23. i:/C=LV/L=Riga/O=GoGetSSL/CN=GoGetSSL RSA DV CA 
  24.  
  25. 1 s:/C=LV/L=Riga/O=GoGetSSL/CN=GoGetSSL RSA DV CA 
  26.  
  27. i:/C=US/ST=New Jersey/L=Jersey City/O=The USERTRUST Network/CN=USERTrust RSA Certification Authority 
  28.  
  29. 2 s:/C=US/ST=New Jersey/L=Jersey City/O=The USERTRUST Network/CN=USERTrust RSA Certification Authority 
  30.  
  31. i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root 
  32.  
  33. --- 
  34.  
  35. Server certificate 
  36.  
  37. 省略... 

在檢測下上面說的其他網(wǎng)站 bing.com:

  1. $ openssl s_client -connect cn.bing.com:443 
  2.  
  3. CONNECTED(00000003
  4.  
  5. depth=2 C = IE, O = Baltimore, OU = CyberTrust, CN = Baltimore CyberTrust Root 
  6.  
  7. verify return:1 
  8.  
  9. depth=1 C = US, ST = Washington, L = Redmond, O = Microsoft Corporation, OU = Microsoft IT, CN = Microsoft IT TLS CA 2 
  10.  
  11. verify return:1 
  12.  
  13. depth=0 CN = www.bing.com 
  14.  
  15. verify return:1 
  16.  
  17. --- 
  18.  
  19. Certificate chain 
  20.  
  21. 0 s:/CN=www.bing.com 
  22.  
  23. i:/C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/OU=Microsoft IT/CN=Microsoft IT TLS CA 2 
  24.  
  25. 1 s:/C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/OU=Microsoft IT/CN=Microsoft IT TLS CA 2 
  26.  
  27. i:/C=IE/O=Baltimore/OU=CyberTrust/CN=Baltimore CyberTrust Root 
  28.  
  29. --- 
  30.  
  31. 省略... 

我又測試了其他幾個(gè)大的站點(diǎn),發(fā)現(xiàn)都正常。為什么唯獨(dú)我們的SSL證書鏈中的其中一個(gè) CA(Sectigo AddTrust)過期了呢?

去查找下相關(guān)的文章,關(guān)鍵詞 sectigo gogetssl 2020 may 30.

發(fā)現(xiàn)第三條記錄中有g(shù)ogetssl發(fā)布的新聞,標(biāo)題是:Sectigo AddTrust External CA Root Expired May 30, 2020,感興趣的可以點(diǎn)擊進(jìn)去看看。

https://www.gogetssl.com/news/23.html

新聞大致的意思:

由于Sectigo AddTrust外部CA根證書過期,影響了一些舊的設(shè)備或者一些老服務(wù)器,因?yàn)樯厦娴母C書鏈中還存在該過期的 CA 證書。對(duì)于客戶端(瀏覽器/SDK)來說,他們是不受該 CA 過期的問題影響。所以最大影響是在server端. 可以通過下載最新的 AddTrust RSA 證書替換過期的。

總結(jié)

目前該問題的影響面廣不廣,這個(gè)還暫時(shí)未知,不過根據(jù)我遇到的情況來看,影響大多在服務(wù)器端的外部服務(wù)之間的調(diào)用。對(duì)web用戶端來說,因?yàn)闉g覽器內(nèi)證書鏈?zhǔn)歉碌?,不涉及該問題。但對(duì)于服務(wù)端來說,對(duì)于一些對(duì)外調(diào)用的 https 請(qǐng)求,如果對(duì)方域名證書鏈中涉及到該過期CA的話,可能會(huì)訪問失敗。

Tips1:如果你的應(yīng)用程序的部署方式是直接運(yùn)行在主機(jī)上的話,可以使用配置管理工具(ansible/saltstack),統(tǒng)一修改。如果是容器話部署的情況,可能涉及的稍微多一些,需要修改項(xiàng)目的 Dockerfile,之后滾動(dòng)更新該服務(wù)(當(dāng)然如果你的應(yīng)用不涉及到對(duì)外訪問 https/ssl 調(diào)用,理論上可以延后更改?。?/p>

Tips2:刪除過期證書后,記得要重啟主機(jī)上運(yùn)行的服務(wù)!?。?/p>

 

責(zé)任編輯:張燕妮 來源: 高效運(yùn)維
相關(guān)推薦

2023-03-13 08:09:03

Protobuffeature分割

2023-10-25 15:11:15

Java

2016-10-25 10:00:20

科技新聞早報(bào)

2020-09-29 06:45:49

JDK

2020-11-12 09:15:16

GitHubPython開發(fā)

2024-08-05 01:28:26

2015-06-18 11:04:58

2020-12-15 08:05:40

路由器服務(wù)器網(wǎng)絡(luò)層

2021-07-28 06:51:08

Nacos代理模式

2021-03-04 19:29:28

程序員Unix系統(tǒng)

2024-09-27 11:38:49

2018-07-06 00:09:47

2021-10-18 13:42:52

加密貨幣金融工具

2021-07-21 08:37:55

AI 裁判人工智能

2019-03-06 12:26:42

密碼安全數(shù)據(jù)

2020-10-20 17:18:00

戴爾

2021-08-28 10:15:26

項(xiàng)目結(jié)構(gòu)Flask

2022-07-07 19:44:22

Python 3.1

2020-09-17 11:02:58

Go 開源技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)