天天看點

基于證書的物聯網裝置安全認證(上)

最近在工作過程中,遇到一些客戶對自己的裝置安全提出了更高要求,希望我們給出一些合理的解決方案。在此,我記錄一種基于x509整數的裝置認證方案并對其做一些解釋,以便大家明白為什麼能起到裝置認證的作用。

可能有些小夥伴對安全和證書不太了解,這裡先簡單介紹一些前置知識以幫助大家了解

裝置需要做什麼準備

每一台裝置,都有一對屬于自己的非對稱密鑰(如RSA公私鑰)。公鑰的内容是可以對外公開的,我們将它寫入到裝置專屬的證書中。私鑰内容是機密的,裝置需要采用某種安全手段對其進行保護,確定隻有自己可以使用它(對于有高安全需求的裝置,一般會采用安全晶片或者帶安全晶片功能的其他晶片,以提供實體層級的安全存儲保障。安全要求稍低的可以采用類似白盒加密等軟安全存儲或保護的方式)。一旦私鑰洩露,則安全基礎已經被毀壞,就需要考慮其他的補救措施

什麼是證書

我們所提到的證書,實際上是一段包含各類資訊的字元串,可以先簡單認為是一個文本檔案。這個文本檔案中包含兩個部分:

1.TBS内容:上一條提到的裝置公鑰、裝置的相關資訊(取決于實際簽發時需要有哪些資訊)、證書的有效期以及證書簽發者的資訊等各種有關證書或證書所有者的資訊

2.簽名:對TBS内容進行某種神秘運算得到的亂碼(實際不是,不過正常人無法看懂其中奧妙)

什麼是證書鍊

證書鍊,顧名思義就是一串證書組成的鍊條。但是這個鍊條并不是随便組成,他們必須有嚴格的“父子”關系。比如A簽發了B,B簽發了C,ABC就可以組成一條證書鍊。如果B還簽發了D,ABD同樣可以組成一條證書鍊。但是ABCD我們就不認為這是一條證書鍊。或者AC,因為中間缺了一級,我們通常也不認為這是一條證書鍊。

非對稱密鑰怎麼用

非對稱密鑰的正常使用,一是資料加密,二是資料簽名。

資料加密就是使用公鑰對一串明文内容加密,讓它變成一段亂碼。而亂碼發送給持有私鑰的人或裝置,使用私鑰就可以将亂碼恢複為明文。沒有私鑰的人,即時通過某種手段拿到這一串亂碼,由于看不懂,也不能做任何壞事。這裡有很多小夥伴會有疑問,可以使用公鑰加密資料,私鑰解密資料,那能不能用私鑰加密資料,公鑰解密資料呢?

聽起來好像很合理,因為我們的通信是雙向的,如果隻能公鑰加密私鑰解密,則傳回的資訊不是要使用其他方式保護了,好麻煩。但是不幸的是,确實不能使用私鑰加密公鑰解密。因為如之前提到的,在整套體系中,大家認為公鑰是一個可以公開,可以被任何人擷取的東西。如果使用私鑰加密公鑰解密,則意味着任何一個拿到密文的人(比如抓包),都可以再通過合法管道下載下傳到公鑰,并解密你的密文内容獲得明文。是以,資料加密通常隻使用公鑰加密資料,私鑰解密資料。

突然感覺私鑰很沒用,居然隻能被動。。。其實并不是,這就得提到非對稱密鑰的另一大功能,資料簽名與驗簽。其主要功能是用來讓公鑰持有者确認,私鑰持有者發出來的資料沒有被中間人篡改。

什麼是資料簽名?比如我有一段明文資料,我先對它使用數字摘要算法進行計算(比如SHA-1,SHA-256)得到一串數字摘要。然後我再對數字摘要進行一頓計算(計算過程中需要使用私鑰),最後得到了一串亂碼(數字摘要就看起來是亂碼了,汗,亂上加亂。。。)。這一串亂碼,就叫做我們使用私鑰,對明文做的資料簽名。在發送資料的時候,将明文資料和簽名一起發送給公鑰持有人。

那公鑰持有者怎麼知道資料沒有被篡改呢?公鑰持有人拿到資料後,先對明文資料進行同樣的數字摘要計算,得到hash1。然後使用自己的公鑰對簽名記性你逆運算(類似對簽名進行解密),逆運算結果為hash2.對比hash1與hash2,如果相同,則代表資料沒有被篡改。因為如果存在中間人篡改了明文,則逆運算出來的簽名和篡改後明文的摘要值肯定是對不上的。

那中間人能否篡改資料後,再對篡改後資料做簽名,将篡改後的明文和簽名都發給公鑰持有者呢?可以。但是這種場景下,隻有中間人私鑰對應的公鑰才能對簽名做逆運算,而我們持有的并不是中間人的公鑰,是以我們的驗簽也會失敗,這樣我們就知道我們接受的資料出問題了。

如何認證證書

實際上,我們所謂的認證證書,大部分時候是一個認證證書鍊的過程。對端通常會傳給我們它使用的證書以及證書往上的一整條證書鍊。關于如何認證證書鍊,通俗一些來講,可以認為分為三步:1.認證證書本身字段合法性 2.認證證書是否真的是其上級簽發 3.循環

何為認證證書本身字段的合法性?如上文所提到的,證書中會包含目前證書的有效期。我們需要校驗證書是否在有效期内;有些證書會包含CRL資訊,我們可以去檢視證書證書是否被吊銷;還有些比較特殊的場景會有特定的校驗條件,如HTTPS證書,我們通常會校驗證書中所包含的站點URL資訊和我們所通路的URL是否一緻。

第二步就是驗證證書是否真的是其上級簽發。如何認證呢?這個時候就要用到資料驗簽的功能了。我們從證書資訊中找到誰是要驗證的證書的上級證書,然後從上級證書中取出上級證書公鑰。驗證證書的簽名部分是否真的是上級證書私鑰所簽。如果是,則可以證明該證書确實是上級證書簽發的,如果不是,則說明證書有問題,可以認為驗證失敗。

當然,完成這兩步以後并不是就萬事大吉了,我們還要以同樣方式驗證這個上級證書。驗證完上級,再驗證上上級。。。依次類推。這個令人絕望的驗證循環通常在兩種情況下終止:

1.某個證書被内置在我們的信任域中,即我們事先已經把這個證書放在了我們本地,看到有一樣的,直接無條件信任,不用再繼續往上驗證。

2.目前證書沒有上級了。這一類證書我們叫做自簽發證書,就是自己簽發自己,也叫根證書。如果我們一路驗證到根證書都沒有看到我們信任的證書,那我們也認為這次證書驗證失敗,這個證書不可信。

到此,前置知識就了解完成了。接下來我們就可以開始看看解決方案。

(未完待續,不定期更新。。。)

繼續閱讀