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