Let's encrypt的TLS-SNI安全問題

猛禽大叔發表於2018-02-01

問題

這兩天按以前的做法給一個新域名加Let's encrypt證書,如下:

certbot run --nginx --email <your_email> -w /<path_to>/challenges -d <your.domain.name> --preferred-challenges tls-sni --renew-by-default --agree-tos
複製程式碼

結果報了這麼一個錯誤:

Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA.

放狗搜了一番,才知道原來是因為ACME的tls-sni驗證被曝了一個安全問題:

2018.01.09 Issue with TLS-SNI-01 and Shared Hosting Infrastructure

所以這個方式不能用了。

原理說明

基本上就如上面那個官方說明所說,tls-sni驗證的方式是:

  • 客戶向let's encrypt申請其域名的證書,let's encrypt隨機生成一個無效域名
  • certbot在客戶伺服器上建立一個此無效域名的自簽名證書,並啟動一個此域名的https服務
  • Let's encrypt的伺服器連線客戶端的IP,並通過SNI申請驗證此無效域名的證書
  • 如果驗證通過,則認為這個客戶身份有效
  • 給此客戶簽發其域名的有效證書

這裡的漏洞在於,某些主機服務商存在多個使用者共用一個IP的情況,如果有人知道某個域名指向的伺服器與自己所在同一個IP,即可利用tls-sni的這個漏洞取得不屬於自己域名的有效證書,即可用於類似中間攻擊之類的惡意用途。

所以在沒有找到解決方案之前,let's encrypt關閉了tls-sni驗證方式。

影響

對於大部分使用者來說,影響不大,只要把驗證方式從tls-sni改為http即可。

但是這就要求伺服器可以同時提供80埠的訪問,這對於某些只開放443埠的伺服器就不方便了。

還有一個方法是用DNS驗證,但這又需要域名註冊商支援。

由於國內的ISP最近把443也關閉了,所以實際上http和tls-sni兩個方法都已經行不通了,只剩下DNS方式可用……

誰叫你不幸生在中國——何作庥

相關文章