关于加密、证书的那些事
<
文章目錄
- 前言
- 一個(gè)典型的物聯(lián)網(wǎng)產(chǎn)品
- 數(shù)據(jù)加密
- 明文傳輸?shù)娜秉c(diǎn)
- 加密傳輸
- 加密方式
- 可逆加密
- 不可逆加密
- 公鑰和私鑰
- 證書(shū)
- 如何申請(qǐng)證書(shū)
- 如何確認(rèn)證書(shū)的合法性
- 單向認(rèn)證和雙向認(rèn)證
- 認(rèn)證機(jī)構(gòu)
- 證書(shū)鏈
- 證書(shū)文件的后綴名
- 證書(shū)文件的格式
- PEM格式(Privacy Enhanced Mail)
- DER格式(Distinguished Encoding Rules)
- X.509標(biāo)準(zhǔn)
- 證書(shū)格式
- OpenPGP協(xié)議/標(biāo)準(zhǔn)
- OpenPGP是什么?
- OpenPGP協(xié)議的實(shí)現(xiàn)
- OpenPGP的使用流程
- SSL/TLS
- 協(xié)議分層
- 握手過(guò)程
- HTTPS與SSL的關(guān)系
- OpenSSL
- OpenSSL是什么?
- 密碼算法庫(kù)
- 信息摘要算法
- 秘鑰和證書(shū)管理
- SSL協(xié)議庫(kù)
- 應(yīng)用程序
- OpenSSH又是什么?
- SSH
- SSH中基于口令的安全驗(yàn)證
- SSH中基于秘鑰的安全認(rèn)證
- SSH協(xié)議的實(shí)現(xiàn)
- 總結(jié)
前言
在一個(gè)物聯(lián)網(wǎng)系統(tǒng)中,終端設(shè)備在連接云平臺(tái)(服務(wù)器)的時(shí)候,云平臺(tái)需要對(duì)設(shè)備的身份進(jìn)行驗(yàn)證,驗(yàn)證這是一個(gè)合法的設(shè)備之后才允許接入。這看似很簡(jiǎn)單的一句話(huà),背后包含了很多相關(guān)的概念,例如:加密、證書(shū)、證書(shū)標(biāo)準(zhǔn)、簽名、認(rèn)證機(jī)構(gòu)、SSL/TLS、OpenSSL、握手等一堆容易混淆的概念。
之前我在做智能家居項(xiàng)目時(shí),每次遇到證書(shū)以及加密的問(wèn)題時(shí),都是滿(mǎn)大街的查資料,但是由于每次都是解決問(wèn)題之后就停止下來(lái),沒(méi)有進(jìn)行完整、系統(tǒng)的梳理,因此對(duì)這些概念始終感覺(jué)自己都理解了,但是又說(shuō)不出所以然來(lái)。
這篇文章我們就把這些概念以及相關(guān)的使用步驟進(jìn)行梳理,就像聯(lián)想記憶一樣,很多分散的東西總是記不住,但是如果把這些東西按照特定的關(guān)系組織在一起,那么記憶起來(lái)就非常容易了。
做個(gè)小游戲:在1分鐘內(nèi)記下這十個(gè)東西:茶杯、猴子、玻璃、垃圾桶、魚(yú)竿、鳥(niǎo)窩、和尚、汽車(chē)、醫(yī)院、飲水機(jī)。這里可以暫停一下,看看自己的記憶力是不是不如以前了。
我們?cè)贀Q個(gè)記憶方法,把這十個(gè)東西以任意荒誕的邏輯聯(lián)系在一起,比如:一只猴子,左手拿著茶杯,右手拿著玻璃,往垃圾桶走去。在垃圾桶旁邊,看到一只魚(yú)竿,于是它就用魚(yú)竿去戳樹(shù)上的鳥(niǎo)窩。鳥(niǎo)窩里掉下來(lái)一個(gè)鳥(niǎo)蛋,正好砸在了和尚的頭上,流血了,趕緊攔下一輛汽車(chē)去醫(yī)院。到了醫(yī)院,和尚失血太多口渴了,正好看到一臺(tái)飲水機(jī)。
把這個(gè)荒誕的故事想幾遍,然后再試著把這十個(gè)東西說(shuō)出來(lái),這回是不是感覺(jué)很容易?而且連順序都不會(huì)記錯(cuò)!這就是聯(lián)想記憶的魔力。
那么學(xué)習(xí)知識(shí)也是這個(gè)道理:分散的知識(shí)是記不住的,只有梳理成體系,把相互之間的聯(lián)系和脈絡(luò)掌握了,再去理解這些分散的點(diǎn)就很容易記住了。這里的關(guān)鍵就是把這些知識(shí)點(diǎn)相互之間的關(guān)系掌握了,就像一張網(wǎng)一樣,隨便把一個(gè)知識(shí)點(diǎn)拎出來(lái),都可以根據(jù)這張網(wǎng)把其他的知識(shí)點(diǎn)聯(lián)想起來(lái)。
這篇文章的內(nèi)容包括:
物聯(lián)網(wǎng)云平臺(tái),是如何驗(yàn)證設(shè)備端的合法性?
SSL/TLS是什么?有什么作用?在哪些場(chǎng)合下使用?
OpenSSL是什么?它與SSL是什么關(guān)系?
OpenSSH又是什么?它與OpenSSL又有什么區(qū)別?
HTTPS中是如何利用SSL來(lái)交換秘鑰的?握手步驟是什么?
證書(shū)是什么?有什么作用?在哪些場(chǎng)合下使用?
證書(shū)是如何得到的?它的標(biāo)準(zhǔn)格式是什么?包含哪些內(nèi)容?
認(rèn)證機(jī)構(gòu)是什么?什么是鏈?zhǔn)阶C書(shū)?
證書(shū)與SSL有什么關(guān)系?
簽名是什么意思?與加密是什么關(guān)系?
什么是單向認(rèn)證?雙向認(rèn)證?
另外補(bǔ)充一點(diǎn):這篇文章只描述“是什么”,而不會(huì)描述“為什么”。“為什么”的事情留給那些數(shù)學(xué)家、密碼學(xué)家來(lái)搞定就可以了。
一個(gè)典型的物聯(lián)網(wǎng)產(chǎn)品
在實(shí)際的項(xiàng)目中,如果用到云平臺(tái),一般來(lái)說(shuō)選擇性就那么幾個(gè):國(guó)外就用亞馬遜,國(guó)內(nèi)就用阿里云,最近也碰到一些項(xiàng)目使用華為云。這里就以之前做過(guò)的一個(gè)空氣凈化器項(xiàng)目來(lái)舉例:
首先,亞馬遜提供了一套SDK,這個(gè)SDK中包含了一組API函數(shù)供應(yīng)用程序調(diào)用,向云平臺(tái)進(jìn)行安全連接、收發(fā)數(shù)據(jù)。在調(diào)用API函數(shù)的時(shí)候,必須提供一些必要的設(shè)備信息,這其中最重要的就是設(shè)備證書(shū)文件,也就是說(shuō),證書(shū)必須要預(yù)先存儲(chǔ)在設(shè)備的文件系統(tǒng)中。
那么,證書(shū)是在什么時(shí)候被放到空氣凈化器設(shè)備中的?當(dāng)然是生產(chǎn)階段,看一下這個(gè)流程:
以上這個(gè)流程是在設(shè)備生產(chǎn)環(huán)節(jié)完成的,這里的描述還是屬于粗線(xiàn)條的,其他一些重要的信息沒(méi)有列出來(lái),比如:AWS后臺(tái)如何產(chǎn)生證書(shū)、在連接階段后臺(tái)是如何通過(guò)證書(shū)來(lái)驗(yàn)證設(shè)備的合法性的、廠(chǎng)商的秘鑰是如何工作的等等,這些問(wèn)題等到這邊文章的末尾就自然明白了。
下面,就按照這些概念之間的相互關(guān)系來(lái)一步一步的梳理,每一個(gè)概念是按照相互之間的關(guān)系來(lái)逐步引入的,因此建議按照順序來(lái)理解。
數(shù)據(jù)加密
明文傳輸?shù)娜秉c(diǎn)
我們知道,client端與server端之間傳輸數(shù)據(jù),要么是明文傳輸、要么是加密傳輸。明文傳輸?shù)娜秉c(diǎn)顯而易見(jiàn):
數(shù)據(jù)容易比第三方截獲;
第三方可以篡改數(shù)據(jù);
第三方可能會(huì)冒充server與你進(jìn)行通信。
總之一句話(huà):明文通信就像裸奔一樣,任何東西都被別人看的一清二楚,惡意的第三方很容易利用明文通信來(lái)做一些違法的事情。
所以,最好還是穿上衣服,最好還是帶密碼鎖的,這樣別人就看不到了!這就是加密傳輸。
加密傳輸
client端對(duì)傳輸?shù)男畔⑦M(jìn)行加密,server端接收到密文后再進(jìn)行解密。例如上圖中:
client想發(fā)送字符串"hello",那么就先加密成"ifmmp",然后發(fā)送出去;
server接收到"ifmmp",進(jìn)行解密,得到"hello"。
但是示例中的加密方式太弱智了,稍微研究下就會(huì)搞明白,這里的加密方式就是把明文字符串中的每一個(gè)字符變成ascII碼表中的下一個(gè)字。server在解密時(shí)操作相反:把每一個(gè)字符變成ascII碼表中的前一個(gè)字符即可,只要client和server事先商量好這樣的加密和解密算法就可以通信了。
但是,這樣的加密方式太簡(jiǎn)單了,惡意的第三方不會(huì)吹灰之力就可以破解出來(lái),因此client與server之間需要更加復(fù)雜的加密算法,這就是SSL要解決的問(wèn)題,這部分內(nèi)容稍后再表。
加密方式
根據(jù)是否可以把密文還原成明文,加密方式分為兩類(lèi):
可逆加密;
不可逆加密。
剛才描述的加密、解密過(guò)程(“hello”->“ifmmp”->“hello”)是屬于可逆加密,也就是說(shuō)可以把密文還原成明文,主要應(yīng)用在通信場(chǎng)景中。如果一個(gè)密文不能還原成明文,就稱(chēng)為不可逆加密,不可逆加密也非常重要。
可逆加密
剛才已經(jīng)說(shuō)到,可逆加密就是可以把密文還原成明文,只要client端和server端商量好加密算法(例如剛才所說(shuō)的利用ascII表的下一個(gè)字符)就可以達(dá)到目的,也就是說(shuō):client端的加密算法和server端的解密算法是一樣的,當(dāng)然了這里的算法太簡(jiǎn)單。
我們可以稍微復(fù)雜一點(diǎn)點(diǎn),先定義一個(gè)固定的字符串“258”,然后把明文"hello"中的每一個(gè)字符,用固定的字符串進(jìn)行計(jì)算:先加2,再減5,最后加8,得到加密后的字符串"mjqqt",server接收到之后再執(zhí)行相反操作就解密得到明文“hello”。從算法角度看,這兩個(gè)加密方式是一樣的,但是第二種算法利用了一個(gè)獨(dú)立的、固定的字符串“258”,這個(gè)字符串就叫做秘鑰,當(dāng)然,實(shí)際通信中使用的秘鑰更復(fù)雜。通信雙方是通過(guò)算法+秘鑰的方式來(lái)進(jìn)行加密和解密。而且,通信雙方使用的秘鑰是相同的,這就叫做對(duì)稱(chēng)加密。
既然存在對(duì)稱(chēng)加密,那肯定就存在非對(duì)稱(chēng)加密,也就是說(shuō),根據(jù)通信雙方使用的秘鑰是否相同,可逆加密分為2種:
對(duì)稱(chēng)加密常用算法有:DES、AES;非對(duì)稱(chēng)加密常用算法有:RSA、DH、ECC。
對(duì)稱(chēng)加密的特點(diǎn):
非對(duì)稱(chēng)加密的特點(diǎn):
既然非對(duì)稱(chēng)加密的缺點(diǎn)這么明顯,那么它有什么作用呢?
回到剛才的通信示例場(chǎng)景中:client與server需要使用同一個(gè)秘鑰“258”,那么它們雙方應(yīng)該如何協(xié)商得到這個(gè)對(duì)稱(chēng)秘鑰呢?難道是使用固定的秘鑰嗎?顯然這個(gè)答案不太可能,需要通信的設(shè)備那么多,不可能像網(wǎng)卡的MAC地址那樣預(yù)先分配,而且秘鑰很容易泄漏。因此,這個(gè)對(duì)稱(chēng)秘鑰一般都是在通信的剛開(kāi)始的握手階段,由client與server動(dòng)態(tài)的協(xié)商得到的。在這個(gè)協(xié)商的過(guò)程中,為了防止協(xié)商內(nèi)容被第三方截獲,就需要使用非對(duì)稱(chēng)加密來(lái)保證握手階段的數(shù)據(jù)安全性。
因?yàn)槲帐謹(jǐn)?shù)據(jù)只發(fā)生在通信的剛開(kāi)始階段,即使效率低一點(diǎn)也沒(méi)關(guān)系,安全比效率更重要。
一句話(huà):非對(duì)稱(chēng)加密在通信初始階段的協(xié)商過(guò)程中使用,用來(lái)得到一個(gè)對(duì)稱(chēng)秘鑰,這個(gè)協(xié)商過(guò)程就叫做握手,在后面的HTTPS通信過(guò)程中,我們?cè)僭敿?xì)看一下握手過(guò)程。
不可逆加密
顧名思義,不可逆加密就是說(shuō)把明文加密之后得到密文,但是不能從密文還原得到明文。從術(shù)語(yǔ)上來(lái)說(shuō),一般不把這個(gè)加密結(jié)果稱(chēng)作密文,而是稱(chēng)作摘要或者指紋。
不可逆加密原理:把一個(gè)任意大小的數(shù)據(jù),經(jīng)過(guò)一定的算法,轉(zhuǎn)換成規(guī)定長(zhǎng)度的輸出。如果數(shù)據(jù)的內(nèi)容發(fā)生了一絲絲的變化,再次加密就得到另一個(gè)不同的結(jié)果,而且是大不相同。從這個(gè)角度看,是不是稱(chēng)作指紋更形象一些?
不可逆加密最常用的算法就是:MD5、SHA1。
回想一下:我們?cè)谙螺d一些軟件的時(shí)候,在服務(wù)器上除了看到軟件的下載地址,一般還會(huì)看到該軟件的MD5碼。我們把軟件下載到本地之后,計(jì)算得到MD5,也就是文件的指紋,然后把這個(gè)MD5與服務(wù)器上公布的MD5進(jìn)行比較,如果這兩個(gè)MD5不一致,就說(shuō)明下載的文件被別人修改過(guò)。
這是glib庫(kù)的下載頁(yè)面:
補(bǔ)充:SHA相關(guān)知識(shí)
SHA安全哈希算法,由美國(guó)國(guó)家標(biāo)準(zhǔn)技術(shù)研究院發(fā)布的一組加密函數(shù)。它是一種常用的摘要算法,就是輸入一段數(shù)據(jù),輸出合法的證書(shū)一個(gè)摘要信息,包括SHA0、SHA1、SHA2等不同的版本。
代表安全哈希算法1,接收輸入,輸出一個(gè)160位的哈希值,稱(chēng)作信息摘要。在2005年之后,SHA1被認(rèn)為不安全。
SHA2指的是具有兩個(gè)不同塊大小的相似哈希函數(shù)的族,其中包括:SHA256,SHA512。SHA256可以輸出一個(gè)256位的哈希值,安全級(jí)別更高。
一個(gè)實(shí)際的使用場(chǎng)景:OTA升級(jí)
再來(lái)了解一下不可逆加密的特點(diǎn):
公鑰和私鑰
上面說(shuō)到了非對(duì)稱(chēng)加密,那么就必須再補(bǔ)充一下私鑰和公鑰。從字面上就可以看出:它倆是一對(duì)兄弟,都是秘鑰,必須成對(duì)使用,稱(chēng)作:秘鑰對(duì)。我們可以通過(guò)一些軟件工具(例如:OpenSSL)生成自己的公鑰和私鑰。
公鑰:就是公開(kāi)告訴別人的;私鑰:就是自己的,作為寶貝一樣自己私藏起來(lái),千萬(wàn)不要告訴別人。
公鑰和私鑰的作用有2個(gè):
數(shù)據(jù)加密就是上面描述的非對(duì)稱(chēng)加密,例如:
張三想發(fā)一個(gè)文件給我,為了防止文件被其他人看到,于是張三用我的公鑰對(duì)文件進(jìn)行加密,然后把加密后的文件發(fā)給我。我拿到密文后,用我的私鑰就可以把密文還原成原始的文件,其他人即使拿到了密文,但是沒(méi)有我的私鑰,就解不開(kāi)文件。 如下面這張圖:
數(shù)字簽名與我們?nèi)粘I钪械慕钘l上的簽名類(lèi)似,一旦簽名了,就具有法律效力,不能耍賴(lài)說(shuō):這個(gè)不是我簽名,我不認(rèn)。具體流程是:我寫(xiě)了一個(gè)文件,然后用我的私鑰對(duì)文件進(jìn)行加密,那么如果以后我耍賴(lài)說(shuō):這個(gè)文件不是我寫(xiě)的,其他人就可以用我的公鑰來(lái)嘗試對(duì)加密后的文件進(jìn)行解密。如果成功解密了,就說(shuō)明這個(gè)文件一定是用我的私鑰進(jìn)行加密的,而私鑰只有我才有,那就說(shuō)明這個(gè)文件一定是我寫(xiě)的。如下圖:
證書(shū)
前面談到了公鑰是公開(kāi)給別人的,本質(zhì)上就是一段數(shù)據(jù),那么這段數(shù)據(jù)是以什么樣的形式或者說(shuō)以什么樣的載體發(fā)送給別人的呢?答案就是:證書(shū)。
如何申請(qǐng)證書(shū)
我們以一個(gè)網(wǎng)站為例,瀏覽器在訪(fǎng)問(wèn)網(wǎng)站的時(shí)候,在握手階段,網(wǎng)站會(huì)把自己的證書(shū)發(fā)送給瀏覽器。那么這個(gè)證書(shū)是如何產(chǎn)生的呢?
Step1
在網(wǎng)站上線(xiàn)之初,需要把自己的相關(guān)信息放在一個(gè)請(qǐng)求文件中(server.req),把請(qǐng)求文件發(fā)送給一個(gè)權(quán)威的認(rèn)證機(jī)構(gòu)。請(qǐng)求文件的內(nèi)容包括:
網(wǎng)站的域名
申請(qǐng)者信息
公鑰
以及其他一些相關(guān)信息
Step2
認(rèn)證機(jī)構(gòu)通過(guò)其他途徑來(lái)確定申請(qǐng)者是合法的。
Step3
認(rèn)證機(jī)構(gòu)使用某個(gè)算法,對(duì)請(qǐng)求文件server.req中的信息進(jìn)行計(jì)算,得到一個(gè)數(shù)字摘要。
算法包括:
MD5
SHA-1
SHA-256
信息包括:
申請(qǐng)者的基本信息:網(wǎng)站使用的加密算法、網(wǎng)站使用的hash算法;
申請(qǐng)者的公鑰;
認(rèn)證機(jī)構(gòu)的信息:認(rèn)證機(jī)構(gòu)的名稱(chēng),證書(shū)到期時(shí)間。
Step4
認(rèn)證機(jī)構(gòu)用自己的私鑰,對(duì)Step3中得到的數(shù)字摘要進(jìn)行加密,得到數(shù)字簽名(也就證書(shū)簽名)。
Step5
認(rèn)證機(jī)構(gòu)把以上這些信息進(jìn)行匯總,得到最終的證書(shū)文件server.crt,然后發(fā)給申請(qǐng)者。
最終,證書(shū)server.crt中的內(nèi)容包括這幾個(gè)大類(lèi):
如何確認(rèn)證書(shū)的合法性
現(xiàn)在,客戶(hù)端拿到了服務(wù)器發(fā)來(lái)的證書(shū)文件,應(yīng)該如何驗(yàn)證這是一個(gè)合法的證書(shū)呢?
Step1
讀取證書(shū)中的明文信息,包括:申請(qǐng)者的基本信息,申請(qǐng)者的公鑰,認(rèn)證機(jī)構(gòu)的信息。
Step2
從瀏覽器或者操作系統(tǒng)中查找這個(gè)認(rèn)證機(jī)構(gòu)的相關(guān)信息,得到這個(gè)認(rèn)證機(jī)構(gòu)的公鑰。
補(bǔ)充:瀏覽器或者操作系統(tǒng)中,一般都會(huì)預(yù)裝一些可信任的權(quán)威認(rèn)證機(jī)構(gòu)的證書(shū)列表,所以能拿到認(rèn)證機(jī)構(gòu)的公鑰。
Step3
使用認(rèn)證機(jī)構(gòu)相同的算法,對(duì)Step1中的明文信息進(jìn)行計(jì)算,得到摘要1。
Step4
使用認(rèn)證機(jī)構(gòu)的公鑰,對(duì)證書(shū)中認(rèn)證機(jī)構(gòu)的數(shù)字簽名進(jìn)行解密,得到摘要2。
Step5
比較摘要1與摘要2是否相同,如果相同,說(shuō)明這個(gè)證書(shū)是合法的,也就證明當(dāng)前訪(fǎng)問(wèn)的是一個(gè)合法的服務(wù)器。
單向認(rèn)證和雙向認(rèn)證
上面描述的認(rèn)證過(guò)程,是瀏覽器用來(lái)確認(rèn)所訪(fǎng)問(wèn)的網(wǎng)站是否是一個(gè)合法的網(wǎng)站;文章開(kāi)頭所舉的例子:一個(gè)物聯(lián)網(wǎng)產(chǎn)品在連接云平臺(tái)的時(shí)候,是云平臺(tái)來(lái)驗(yàn)證這個(gè)想連接進(jìn)來(lái)的設(shè)備是否為一個(gè)合法的設(shè)備。
這兩個(gè)場(chǎng)景中都是單向認(rèn)證,也就是通信的一方來(lái)驗(yàn)證另一方是否合法。那么雙向認(rèn)證就很好理解了:通信的每一方都要認(rèn)證對(duì)方是否合法。
至于如何選擇使用單向認(rèn)證或者雙向認(rèn)證,甚至是不使用證書(shū)(只使用用戶(hù)名和密碼來(lái)鑒權(quán)),這就需要根據(jù)實(shí)際的使用場(chǎng)景、安全等級(jí)、操作的難易程度來(lái)決定了。比如:在物聯(lián)網(wǎng)產(chǎn)品中,每一個(gè)產(chǎn)品都需要在生產(chǎn)階段把動(dòng)態(tài)生成的證書(shū)燒寫(xiě)到設(shè)備中,增加了生產(chǎn)環(huán)節(jié)的流程和成本,為了安全性,萬(wàn)萬(wàn)不可偷懶。如果沒(méi)有證書(shū)來(lái)驗(yàn)證,那么黑客就可以模擬無(wú)數(shù)個(gè)設(shè)備,頻繁的連接到云平臺(tái),這就存在極大的安全隱患。
認(rèn)證機(jī)構(gòu)
證書(shū)本質(zhì)上就是一個(gè)文件,只不過(guò)這個(gè)文件具有特殊的一個(gè)性質(zhì):可以被證明是合法的。那么應(yīng)該如何來(lái)證明呢?這就要來(lái)說(shuō)一下認(rèn)證機(jī)構(gòu)。
認(rèn)證機(jī)構(gòu)(CA: Certificate Authority)是一個(gè)權(quán)威的組織,是被國(guó)家、行業(yè)認(rèn)可的權(quán)威結(jié)構(gòu),不是隨便一個(gè)機(jī)構(gòu)都有資格頒發(fā)證書(shū),不然也不叫做權(quán)威機(jī)構(gòu)。只要能證明一個(gè)證書(shū)是由CA機(jī)構(gòu)頒發(fā)的,我們就認(rèn)為這個(gè)證書(shū)是合法的,也就是說(shuō):證書(shū)的可信任性基于信任機(jī)制。
就像銀行貸款給個(gè)人一樣,銀行在放款之前,會(huì)到征信系統(tǒng)中查詢(xún)這個(gè)人的信用報(bào)告,如果征信系統(tǒng)中表明這個(gè)人的信用沒(méi)有問(wèn)題,銀行相信征信系統(tǒng),所以銀行就相信這個(gè)人,可以貸款給他,這是一個(gè)信任鏈的傳遞。
CA認(rèn)證機(jī)構(gòu)就類(lèi)似于征信系統(tǒng),相當(dāng)于CA結(jié)構(gòu)給證書(shū)進(jìn)行了背書(shū),它保證從它手里頒發(fā)的證書(shū)都是合法有效的,那么我們只要能證明證書(shū)是從CA認(rèn)證機(jī)構(gòu)頒發(fā)的,就可以認(rèn)為證書(shū)是有效的。
證書(shū)鏈
CA認(rèn)證機(jī)構(gòu)是一個(gè)樹(shù)狀的結(jié)構(gòu),最頂部的稱(chēng)為根認(rèn)證機(jī)構(gòu)。往下層是:二級(jí)認(rèn)證機(jī)構(gòu)、三級(jí)認(rèn)證機(jī)構(gòu)…。
根認(rèn)證機(jī)構(gòu)給二級(jí)認(rèn)證機(jī)構(gòu)頒發(fā)證書(shū),二級(jí)認(rèn)證機(jī)構(gòu)給三級(jí)認(rèn)證結(jié)構(gòu)頒發(fā)證書(shū)…。不同等級(jí)的認(rèn)證機(jī)構(gòu)對(duì)審核的要求也不一樣,于是證書(shū)也分為免費(fèi)的、便宜的和貴的。
你可能會(huì)問(wèn):那么根認(rèn)證機(jī)構(gòu)的證書(shū)是由誰(shuí)簽名的?答案是:根認(rèn)證機(jī)構(gòu)自己簽名的,這也叫做自簽名。因?yàn)楦J(rèn)證機(jī)構(gòu)是由國(guó)家或者行業(yè)組織認(rèn)可的,已經(jīng)是一個(gè)可以信賴(lài)的權(quán)威機(jī)構(gòu),所以可以為自己簽名。
另外,我們?cè)跍y(cè)試的過(guò)程中,也常常利用OpenSSL中提供的程序來(lái)產(chǎn)生自簽名的證書(shū),當(dāng)然,這個(gè)測(cè)試的自簽名證書(shū)只能你自己玩,因?yàn)閯e人不信任你。
證書(shū)文件的后綴名
剛接觸到證書(shū)概念的小伙伴,常常被眼花繚亂的后綴名所迷惑。
首先要明確一點(diǎn):證書(shū)文件的后綴名只是為了見(jiàn)名識(shí)意,實(shí)際上可以取任意的名字。常見(jiàn)的后綴名包括:
.crt:per格式的證書(shū)
.der: der格式的證書(shū)
.key:pem格式的私鑰
.pub:pem格式的公鑰
.req:申請(qǐng)證書(shū)時(shí)發(fā)送給CA認(rèn)證機(jī)構(gòu)的請(qǐng)求文件
.csr:也表示請(qǐng)求文件
證書(shū)文件的格式
所有證書(shū)內(nèi)容格式有兩種:pem格式和der格式,這兩種格式的證書(shū)文件可以相互轉(zhuǎn)換,利用OpenSSL中的程序就可以完成。
PEM格式(Privacy Enhanced Mail)
pem格式的證書(shū)內(nèi)容是經(jīng)過(guò)加密的文本文件,一般是base64格式,可以用記事本來(lái)打開(kāi)一個(gè)base64格式的證書(shū),例如下面這個(gè)證書(shū)文件的內(nèi)容:
-----BEGIN CERTIFICATE----- MIIGbzCCBFegAwIBAgIICZftEJ0fB/wwDQYJKoZIhvcNApQELBQAwfDELMAkGA1UE BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp ... Nztr2Isaaz4LpMEo4mGCiGxec5mKr1w8AE9n6D91CvxR5/zL1VU1JCVC7sAtkdki vnN1/6jEKFJvlUr5/FX04JXeomIjXTI8ciruZ6HIkbtJup1n9Zxvmr9JQcFTsP2c bRbjaT7JD6MBidAWRCJWClR/5etTZwWwWrRCrzvIHC7WO6rCzwu69a+l7ofCKlWs y702dmPTKEdEfwhgLx0LxJr/Aw== -----END CERTIFICATE-----補(bǔ)充:base64算法就是把原始數(shù)據(jù)中按照每3個(gè)字節(jié)進(jìn)行拆分,3個(gè)字節(jié)是24bit,然后把24bit分成4組,每組6bit,最后在每個(gè)6bit的簽名添加2個(gè)0,這樣得到的4組字節(jié)碼就可以用ascII碼來(lái)表示了。
DER格式(Distinguished Encoding Rules)
der格式的證書(shū)文件內(nèi)容是經(jīng)過(guò)加密的二進(jìn)制數(shù)據(jù),也就是說(shuō)文件內(nèi)容打開(kāi)后是亂碼。
X.509標(biāo)準(zhǔn)
上面說(shuō)到證書(shū)中包含了必要的信息,那么這些信息在文件中并不是隨意擺放的,而是要根據(jù)固定的格式來(lái)存儲(chǔ),只有這樣才能通過(guò)軟件生成或解析。
那么這個(gè)固定的格式是由誰(shuí)來(lái)規(guī)定的呢?這就是X.509標(biāo)準(zhǔn)與公共秘鑰證書(shū)。
X.509是一個(gè)體系、標(biāo)準(zhǔn),用來(lái)規(guī)定一個(gè)證書(shū)的格式標(biāo)準(zhǔn),CA認(rèn)證結(jié)構(gòu)在生成證書(shū)的時(shí)候,就根據(jù)這個(gè)標(biāo)準(zhǔn)把每部分信息寫(xiě)入到證書(shū)文件中。
X.509包括3個(gè)版本:V1, V2和V3。每一個(gè)版本中頒發(fā)證書(shū)時(shí),必須包含下列信息:
版本號(hào):用來(lái)區(qū)分版本;
系列號(hào):由CA認(rèn)證機(jī)構(gòu)給每一個(gè)證書(shū)分配一個(gè)唯一的數(shù)字編號(hào);
算法簽名標(biāo)識(shí)符:用來(lái)指定CA認(rèn)證機(jī)構(gòu)在頒發(fā)證書(shū)時(shí)使用的簽名算法;
認(rèn)證機(jī)構(gòu):頒發(fā)證書(shū)的機(jī)構(gòu)唯一名稱(chēng);
有效期限:證書(shū)有效期(開(kāi)始時(shí)間和結(jié)束時(shí)間);
主題信息:證書(shū)持有人的基本信息;
公鑰信息:證書(shū)持有者的公鑰;
認(rèn)證結(jié)構(gòu)簽名:以確保這個(gè)證書(shū)在頒發(fā)之后沒(méi)有被篡改過(guò);
證書(shū)格式
總之:證書(shū)的核心功能就是安全的傳遞公鑰!
OpenPGP協(xié)議/標(biāo)準(zhǔn)
加密和證書(shū)的概念介紹完了,再來(lái)了解一個(gè)行業(yè)標(biāo)準(zhǔn):OpenPGP。
OpenPGP是什么?
OpenPGP是一種非專(zhuān)有協(xié)議,為加密消息、簽名、私鑰和用于交換公鑰的證書(shū)定義了統(tǒng)一標(biāo)準(zhǔn)。
OpenPGP協(xié)議的實(shí)現(xiàn)
OpenPGP協(xié)議有2個(gè)實(shí)現(xiàn):
PGP是一個(gè)加密程序,為數(shù)據(jù)通信提供了加密和驗(yàn)證功能,通常用于簽名、加密和解密文本、電子郵件和文件。
GPG是PGP的開(kāi)源實(shí)現(xiàn)。
OpenPGP的使用流程
Step1: 公布自己的公鑰
每個(gè)人把自己的公鑰上傳到公鑰服務(wù)器上(subkeys.pgp.net),然后通過(guò)交換機(jī)制,所有的公鑰服務(wù)器最終都會(huì)包含你的公鑰,就類(lèi)似域名服務(wù)器同步域名解析信息一樣。
由于公鑰服務(wù)器沒(méi)有檢查機(jī)制,任何人都可以用我的名義上傳公鑰,所以沒(méi)有辦法來(lái)保證服務(wù)器上的公鑰一定是可靠性。通常,我可以在網(wǎng)站上公布一個(gè)公鑰指紋,讓其他人下載我的公鑰之后,計(jì)算一下公鑰指紋,然后與我公布的指紋進(jìn)行比對(duì),以此來(lái)確認(rèn)證書(shū)的有效性。
Step2: 獲取別人的公鑰
為了獲得別人的公鑰,可以讓對(duì)方直接發(fā)給我,也可以從公鑰服務(wù)器上下載。為了安全起見(jiàn),需要對(duì)下載的公鑰使用其他機(jī)制進(jìn)行安全認(rèn)證,例如剛才說(shuō)的指紋。
Step3: 用于加密
用對(duì)方的公鑰加密文件,發(fā)送給對(duì)方,對(duì)方用他自己的私鑰進(jìn)行解密。
Step4: 用于簽名
用我的私鑰進(jìn)行加密,把加密后文件發(fā)送給對(duì)方,對(duì)方用我的公鑰進(jìn)行解密,只要能正確解密,就證明這個(gè)文件的確是我加密的。
SSL/TLS
SSL全稱(chēng)是Secure Socket Layer(安全套階層協(xié)議),它是一個(gè)安全協(xié)議,目的是用來(lái)為互聯(lián)網(wǎng)提供安全的數(shù)據(jù)傳輸。
SSL在工作過(guò)程中,就利用了前面描述的概念:對(duì)稱(chēng)加密、非對(duì)稱(chēng)加密、證書(shū)等。如果前面的概念都梳理清楚了,那么理解SSL也就不成問(wèn)題了。
SSL協(xié)議有1,2,3這個(gè)三個(gè)版本,TLS是SSL V3標(biāo)準(zhǔn)化之后的產(chǎn)物。事實(shí)上現(xiàn)在用的都是TLS,但是大家都習(xí)慣了SSL這個(gè)稱(chēng)呼。
協(xié)議分層
SSL協(xié)議最大的優(yōu)點(diǎn)就是與應(yīng)用層無(wú)關(guān),在SSL協(xié)議的上層,可以運(yùn)行一些高層應(yīng)用協(xié)議,例如:HTTP, FTP, TELNET…,也就是說(shuō)這些高層協(xié)議可以透明的建立在SSL協(xié)議層之上。
握手過(guò)程
SSL使用X.509標(biāo)準(zhǔn),握手就是指客戶(hù)端與服務(wù)端在通信的開(kāi)始階段進(jìn)行鑒權(quán)和協(xié)商,最終目的是:
我們來(lái)一步一步梳理握手過(guò)程:
Step1
Client向Server發(fā)送如下信息:
隨機(jī)數(shù)1;
Client端支持的SSL版本號(hào);
Client端支持的加密算法列表。
Step2
Server分析接收到的信息,返回如下信息給Client:
隨機(jī)數(shù)2;
選擇的加密算法;
Server證書(shū)
Step3
Client端驗(yàn)證Server發(fā)來(lái)的證書(shū)是否有效,具體過(guò)程上面已經(jīng)描述過(guò)。
如果驗(yàn)證失敗,通信結(jié)束;
如果驗(yàn)證通過(guò),就產(chǎn)生隨機(jī)數(shù)3,并使用剛才的隨機(jī)數(shù)1、隨機(jī)數(shù)2,然后用選擇的算法生成一個(gè)對(duì)稱(chēng)加密秘鑰,這個(gè)秘鑰就用于后面正常的數(shù)據(jù)通信中。
然后發(fā)送如下信息給Server:
隨機(jī)數(shù)3,并且用server證書(shū)中的公鑰進(jìn)行加密;
此時(shí),Cliend端的握手流程結(jié)束,因?yàn)橐呀?jīng)達(dá)到了握手的最終目的:確認(rèn)Server合法,得到對(duì)稱(chēng)加密秘鑰。
Step4
Server端在接收到加密后的隨機(jī)數(shù)3時(shí),用自己的私鑰進(jìn)行解密,然后和之前的隨機(jī)數(shù)1、隨機(jī)數(shù)2一起,使用相同的算法生成對(duì)稱(chēng)加密秘鑰。
至此,Server端的握手過(guò)程也就結(jié)束,下面就可以用對(duì)稱(chēng)加密秘鑰來(lái)對(duì)數(shù)據(jù)進(jìn)行加密了。
注意:上面描述的握手過(guò)程中是單向認(rèn)證,也就是Client端驗(yàn)證Server是否合法的。
如果需要雙向認(rèn)證,那么客戶(hù)端也應(yīng)該把自己的證書(shū)發(fā)送給Server,然后Server來(lái)驗(yàn)證這個(gè)證書(shū)是否合法,確認(rèn)證書(shū)合法之后才繼續(xù)執(zhí)行后面面的握手流程。
HTTPS與SSL的關(guān)系
HTTPS拆開(kāi)來(lái)就是:HTTP+SSL,就是在HTTP的下面增加了SSL安全傳輸協(xié)議層,在瀏覽器連接到服務(wù)器之后,就執(zhí)行上面描述的SSL握手過(guò)程。握手結(jié)束之后,雙方得到對(duì)稱(chēng)加密秘鑰,在HTTP協(xié)議看來(lái)是明文傳輸數(shù)據(jù),下面的SSL層對(duì)數(shù)據(jù)進(jìn)行加密和解密。
OpenSSL
OpenSSL是什么?
上面描述的SSL中這么多的東西都是協(xié)議(或者稱(chēng)為標(biāo)準(zhǔn)),協(xié)議只是規(guī)定了應(yīng)該怎么做,但是具體的代碼實(shí)現(xiàn)應(yīng)該由誰(shuí)來(lái)做呢?我們?cè)趯?xiě)相關(guān)的SSL程序時(shí)好像從來(lái)沒(méi)有實(shí)現(xiàn)過(guò)這個(gè)協(xié)議,都是直接調(diào)用第三方提供的庫(kù)就達(dá)到了加密傳輸?shù)哪康摹.?dāng)然了,如果你實(shí)現(xiàn)過(guò)SSL協(xié)議,請(qǐng)?jiān)试S我對(duì)你表示佩服,給你一萬(wàn)個(gè)贊!
在編程領(lǐng)域,永遠(yuǎn)都存在熱心腸的人!OpenSSL就是一個(gè)免費(fèi)的SSL/TLS實(shí)現(xiàn),就是說(shuō):OpenSSL實(shí)現(xiàn)了SSL/TLS協(xié)議中定義的所有功能,包括:
SSL2
SSL3
TLSv1
TLSv1.1
TLSv1.2
而且,OpenSSL是用C語(yǔ)言開(kāi)發(fā)的,具有優(yōu)秀的跨平臺(tái)特性,在Linux、Windows、BSD、MAC等平臺(tái)上可以執(zhí)行。
具體來(lái)說(shuō),OpenSSL實(shí)現(xiàn)中,包括下面幾個(gè)功能模塊:
密碼算法庫(kù)
密碼算法庫(kù)中包括:
對(duì)稱(chēng)加密算法: AES、DES等。
非對(duì)稱(chēng)加密算法: DH、RSA、DSA、EC等。
信息摘要算法
信息摘要算法包括:MD5、SHA等。
秘鑰和證書(shū)管理
OpenSSL提供的CA應(yīng)用程序就是一個(gè)小型的證書(shū)管理中心,實(shí)現(xiàn)了證書(shū)簽發(fā)的整個(gè)流程和證書(shū)管理的大部分機(jī)制,我們?cè)趯W(xué)習(xí)的時(shí)候一般都會(huì)用OpenSSL中提供的CA程序來(lái)生成秘鑰對(duì)、自簽名等等。具體的內(nèi)容包括:
證書(shū)秘鑰產(chǎn)生、請(qǐng)求產(chǎn)生、證書(shū)簽發(fā)、吊銷(xiāo)和驗(yàn)證功能;
對(duì)證書(shū)的X.509標(biāo)準(zhǔn)解碼、PKCS#12/PKCS#7格式的編解碼;
提供了產(chǎn)生各種秘鑰對(duì)的函數(shù);
SSL協(xié)議庫(kù)
實(shí)現(xiàn)了SSLv2、SSLv3、TLSv1.0協(xié)議。
應(yīng)用程序
OpenSSL的應(yīng)用程序是基于密碼算法庫(kù)和SSL協(xié)議庫(kù)實(shí)現(xiàn)的,是非常好的OpenSSL的API函數(shù)使用范例,主要包括:秘鑰生成、證書(shū)管理、格式轉(zhuǎn)換、數(shù)據(jù)加密和簽名、SSL測(cè)試以及其他輔助配置功能。
OpenSSH又是什么?
SSH
首先說(shuō)一下SSH:Secure Shell(安全外殼協(xié)議),又是一個(gè)協(xié)議,用來(lái)實(shí)現(xiàn)遠(yuǎn)程登錄系統(tǒng),我們通常利用SSH來(lái)傳輸命令行界面和遠(yuǎn)程執(zhí)行命令。
比如:在調(diào)試一個(gè)ARM系統(tǒng)時(shí),可以通過(guò)串口助手連接到ARM板子上;但是更常用的調(diào)試場(chǎng)景是在PC機(jī)上遠(yuǎn)程登錄到ARM系統(tǒng)中,執(zhí)行ARM中的任何指令,這就是利用SSH來(lái)實(shí)現(xiàn)的。
SSH提供2種級(jí)別的安全驗(yàn)證:
基于密碼;
基于秘鑰。
SSH中基于口令的安全驗(yàn)證
只需要知道賬號(hào)和密碼,就可以遠(yuǎn)程登錄到系統(tǒng),我們一般常用的就是這用方式。但是不能保證我正在連接的設(shè)備就是我想連接的那臺(tái)設(shè)備,可能會(huì)有別的服務(wù)器冒充真正的服務(wù)器,也就是受到“中間人”這種方式的攻擊。
當(dāng)然還經(jīng)常遇到另一種錯(cuò)誤:在局域網(wǎng)中有多臺(tái)設(shè)備,本想遠(yuǎn)程連接到設(shè)備A中,由于IP地址記錯(cuò)了,結(jié)果遠(yuǎn)程登錄到另外一臺(tái)設(shè)備B上了,如果你的同事也正在調(diào)試設(shè)備B,接下來(lái)就是悲劇發(fā)生的時(shí)刻!
SSH中基于秘鑰的安全認(rèn)證
Step1
首先為自己創(chuàng)建一個(gè)秘鑰對(duì),并提前把公鑰放在需要訪(fǎng)問(wèn)的服務(wù)器上,例如:放在賬號(hào)的家目錄中。
Step2
通過(guò)客戶(hù)端遠(yuǎn)程登錄到服務(wù)器,把自己的公鑰發(fā)給服務(wù)器,并請(qǐng)服務(wù)器進(jìn)行安全驗(yàn)證。
Step3
服務(wù)器接收到請(qǐng)求后,在登錄賬號(hào)的家目錄下查找公鑰,然后與接收到的公鑰進(jìn)行比對(duì)。
Step4
如果比對(duì)不一致,通信結(jié)束;如果比對(duì)一致,服務(wù)器就用公鑰加密一段數(shù)據(jù)(challenge),并發(fā)送給客戶(hù)端。
Step5
客戶(hù)端接收到challenge,用私鑰進(jìn)行解密,然后把結(jié)果發(fā)給服務(wù)器。
Step6
服務(wù)器把接收到的結(jié)果與Step4中的數(shù)據(jù)進(jìn)行比對(duì),如果一致則驗(yàn)證通過(guò)。
SSH協(xié)議的實(shí)現(xiàn)
既然SSH是一個(gè)協(xié)議,那么就一定存在對(duì)應(yīng)的實(shí)現(xiàn),這就是OpenSSH,它是一個(gè)免費(fèi)開(kāi)源的SSH實(shí)現(xiàn)。
OpenSSH實(shí)現(xiàn)中,利用了OpenSSL中的加密和算法庫(kù)函數(shù),這就是它倆之間的關(guān)系。
總結(jié)
到這里,與加密、證書(shū)相關(guān)的基礎(chǔ)概念都介紹完畢了,不知道你是否有所收獲。
如果你是初次接觸到這些東西,敬請(qǐng)放心,即使現(xiàn)在明白了,一個(gè)星期之后肯定忘記一多半了。只有經(jīng)歷過(guò)幾個(gè)項(xiàng)目的歷練之后,才會(huì)有更深刻的理解和記憶,最后,祝您好運(yùn)!
如果覺(jué)得文章不錯(cuò),請(qǐng)轉(zhuǎn)發(fā)、分享給您的朋友。
我會(huì)把十多年嵌入式開(kāi)發(fā)中的項(xiàng)目實(shí)戰(zhàn)經(jīng)驗(yàn)進(jìn)行總結(jié)、分享,相信不會(huì)讓你失望的!
轉(zhuǎn)載:歡迎轉(zhuǎn)載,但未經(jīng)作者同意,必須保留此段聲明,必須在文章中給出原文連接。
推薦閱讀
[1] 原來(lái)gdb的底層調(diào)試原理這么簡(jiǎn)單
[2] 生產(chǎn)者和消費(fèi)者模式中的雙緩沖技術(shù)
[3] 深入LUA腳本語(yǔ)言,讓你徹底明白調(diào)試原理
[4] 一步步分析-如何用C實(shí)現(xiàn)面向?qū)ο缶幊?/p>
總結(jié)
以上是生活随笔為你收集整理的关于加密、证书的那些事的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 大学四年,工作四年,我把私藏了 8 年的
- 下一篇: 对称加密和非对称加密、公钥和私钥、单向认