你們好,我是明哥。html
前段時間整理了關於數字證書和數字簽名的一些內容,今天整理一下發出來。node
咱們都知道 HTTP 協議都是明文傳輸內容,爲了保證數據傳輸的安全,HTTPS 協議就應運而生了,但它其實並非一個全新的協議,而是HTTP 協議基本之上 再加上SSL/TLS 協議。python
所以當你訪問一個支持 https 的網站時,是須要先進行 SSL/TLS 握手創建鏈接的。算法
SSL/TLS 握手的目的是爲了 安全 地協商出一份對稱加密的密鑰,有了這個密鑰以後,後續的數據所有使用這個密鑰進行加密。apache
這個過程其實挺有趣的,涉及到的知識點,專業名詞也不少,好比對稱加密,非對稱加密,信息摘要,數字簽名,數字證書,公鑰和私鑰。本篇文章,會詳細地介紹這些極易混淆的專業名詞。windows
在講解以前,我先給你提出幾個摸底問題,若是你已經還不可以熟練回答,那麼本篇文章會給你答案:瀏覽器
一、 對稱加密和非對稱加密,各有什麼優缺點?安全
二、對稱加密和非對稱加密,是排他關係嗎?是否能夠搭配使用?服務器
三、摘要和加密有什麼區別?有了摘要算法爲何還要有加密算法?網絡
四、如何在通訊時同時作到保密性、高效性?
五、如何申請數字證書?證書分爲哪幾種?SSL 證書如何部署?
六、完整說下證書申請、證書籤發、證書下發客戶端、客戶端驗證證書、數據加密傳輸的整個流程?
對稱加密
是通訊雙方共同擁有一把密鑰。
這把密鑰能夠把明文加密(encryption)成密文,也能夠把密文解密(decryption)成明文。
常見的對稱加密算法有AES、DES、RC4,其中最經常使用的是AES。
對稱加密的優勢是:速度快。
同時也有一個缺點,就是不那麼安全,一旦你的密鑰被別人竊取了,全部的數據就會在網絡的世界裏裸奔。
與 對稱加密相對的是 非對稱加密
。
通訊雙方持有不一樣的密鑰。
服務端的密鑰,稱之爲 私鑰
(private key),客戶端的密鑰,稱之爲 公鑰
(public key)。
他們兩者的區別是:
一、私鑰應僅在服務端保存,毫不可泄露。而公鑰能夠存在於任何的客戶端,即便***拿到了也沒有關係。
二、公鑰加密的密文只有相對應的私鑰才能解密
三、私鑰加密的內容,全部與之相對應的公鑰都能解密。
四、私鑰一般用來生成簽名,公鑰用來驗證簽名。
五、公鑰和私鑰是相對的,二者自己並無規定哪個必須是公鑰或私鑰。這意味着,公鑰只要不對外公開,那就能夠作爲私鑰,私鑰公開後也能夠作爲公鑰。
典型的非對稱加密算法有 RSA 。
非對稱加密的優勢,就是安全係數特別高。缺點就是速度會慢一些。
當客戶端收到的公鑰是準確的時候,通訊就是安全的。
由於用正確公鑰加密過的密文,只有服務端的私鑰能解。
那麼如何保證,客戶端收到正確的公鑰呢?
答案是:經過非對稱加密來協商對稱加密的密鑰,服務端一旦把正確的公鑰安全地送達到客戶端後,後續的通訊,爲了保證高效通訊,再採用對稱加密來加密數據。
具體的過程,後面會更加詳細的闡述這一過程。
一段信息,通過摘要算法獲得一串哈希值,就是摘要(dijest)。
常見的摘要算法有MD五、SHA一、SHA25六、SHA512等。
關於摘要,有幾點須要你明白的:
一、摘要算法,是把任意長度的信息,映射成一個定長的字符串。
二、摘要算法,兩個不一樣的信息,是有可能算出同一個摘要值的。
三、摘要算法與加密算法不一樣,不存在解密的過程。
四、摘要算法不用於數據的保密,而是用於數據的完整性校驗。
摘要通過私鑰的加密後,便有了一個新的名字 -- 數字簽名
。
簽名
是在發送方,這是一個加密的過程。
驗籤
是在接收方,這是一個解密的過程。
那搞懂數字簽名的意義是什麼?只要回答下面兩個問題便可。
第一個問題,有了信息摘要,爲什麼還要有數字簽名?
答:信息摘要,雖然也不可逆,但卻容易卻被僞造。因此信息摘要只用於校驗完整性,而要保證信息摘要的正確性,就要依靠數字簽名啦。
數字簽名的簽名和驗籤是非對稱加密,其餘人除非拿到私鑰,否則無法僞造。
第二個問題,爲何不對內容直接加密,而是對摘要進行加密。
答:由上面咱們知道了非對稱加密的速度很是慢,若是傳輸的數據量很是大,那這個加密再解密的時間要遠比網絡傳輸的時間來得長,這樣反而會得不償失。
若是咱們對傳輸的內容只有完整性要求,而安全性沒有要求(意思是傳輸的內容被人知道了也不要緊)。那就能夠對摘要進行加密,到客戶端這裏解密後獲得摘要明文,再用這個摘要明文與傳輸的數據二次計算的摘要進行比較,若一致,則說明傳輸的內容是完整的,沒有被篡改。
在數字簽名那裏,不知道你有沒有發現一個問題?
數字簽名是非對稱加密,服務端有一個私鑰,客戶端一個公鑰,只有這兩個對上了驗籤。
那假如說你(客戶端)拿到的公鑰並非服務端給的呢,而是***塞給你的呢?而你卻把這個假公鑰當成真的,那麼當你使用這個假公鑰加密一些敏感信息時,***就能夠截取你的這段信息,因爲這信息是用***本身的公鑰加密的,這樣一來,***拿本身的私鑰就能解密獲得你的敏感信息。
這就是問題所在。
要解決這個問題,其實只要保證『公鑰』是可信的。只有服務端發給你的公鑰你才能拿,而壞人給你的公鑰,你要懂得識別並丟棄它。
數字證書就應運而生了。
要理解數字證書,一樣只要搞懂兩個問題便可。
數字證書是什麼東西?其實它就是一個 .crt
文件
數字證書是誰頒發的?由權威證書認證機構頒發,通常咱們簡稱爲 CA 機構
數字證書如何申請的?或者說如何頒發的?
爲了讓你理解這一過程,我畫了下面這張圖:
一、在本身的服務器上生成一對公鑰和私鑰。而後將域名、申請者、公鑰(注意不是私鑰,私鑰是不管如何也不能泄露的)等其餘信息整合在一塊兒,生成.csr
文件。
二、將這個 .csr
文件發給 CA 機構,CA 機構收到申請後,會經過各類手段驗證申請者的組織信息和我的信息,如無異常(組織存在,企業合法,確實是域名的擁有者),CA 就會使用散列算法對.csr
裏的明文信息先作一個HASH,獲得一個信息摘要,再用 CA 本身的私鑰對這個信息摘要進行加密,生成一串密文,密文便是所說的 簽名。簽名 + .csr
明文信息,便是 證書。CA 把這個證書返回給申請人。
在HTTPS的傳輸過程當中,有一個很是關鍵的角色--數字證書
,那什麼是數字證書?又有什麼做用呢?
所謂數字證書,是一種用於電腦的身份識別機制。由數字證書頒發機構(CA)對使用私鑰建立的簽名請求文件作的簽名(蓋章),表示CA結構對證書持有者的承認。
使用數字證書可以提升用戶的可信度;
數字證書中的公鑰,可以與服務端的私鑰配對使用,實現數據傳輸過程當中的加密和解密;
在認證使用者身份期間,使用者的敏感我的數據並不會被傳輸至證書持有者的網絡系統上;
x509的證書編碼格式有兩種:
PEM(Privacy-enhanced Electronic Mail)是明文格式的,以 -----BEGIN CERTIFICATE-----開頭,以-----END CERTIFICATE-----結尾。中間是通過base64編碼的內容,apache須要的證書就是這類編碼的證書.查看這類證書的信息的命令爲: openssl x509 -noout -text -in server.pem
。其實PEM就是把DER的內容進行了一次base64編碼
DER是二進制格式的證書,查看這類證書的信息的命令爲: openssl x509 -noout -text -inform der -in server.der
.crt證書文件,能夠是DER(二進制)編碼的,也能夠是PEM(ASCII (Base64))編碼的),在類unix系統中比較常見;
.cer也是證書,常見於Windows系統。編碼類型一樣能夠是DER或者PEM的,windows下有工具能夠轉換crt到cer;
.csr證書籤名請求文件,通常是生成請求之後發送給CA,而後CA會給您簽名併發回證書
.key通常公鑰或者密鑰都會用這種擴展名,能夠是DER編碼的或者是PEM編碼的。查看DER編碼的(公鑰或者密鑰)的文件的命令爲: openssl rsa -inform DER -noout -text -in xxx.key
。查看PEM編碼的(公鑰或者密鑰)的文件的命令爲: openssl rsa -inform PEM -noout -text -in xxx.key
;
.p12證書文件,包含一個X509證書和一個被密碼保護的私鑰
安全證書主要分爲DV、OV和EV三個種類,對應的安全等級爲通常、較好和最高三個等級。三者的審覈過程、審覈標準和對應的域名數量也不一樣,因此價格在一兩百元到幾萬元不等。
DV SSL證書是隻驗證網站域名全部權的簡易型(Class 1級)SSL證書,可10分鐘快速頒發,能起到加密傳輸的做用,但沒法向用戶證實網站的真實身份。
目前市面上的免費證書都是這個類型的,只是提供了對數據的加密,可是對提供證書的我的和機構的身份不作驗證。
OV SSL,提供加密功能,對申請者作嚴格的身份審覈驗證,提供可信×××明。
和DV SSL的區別在於,OV SSL 提供了對我的或者機構的審覈,能確認對方的身份,安全性更高。
因此這部分的證書申請是收費的~
超安=EV=最安全、最嚴格 超安EV SSL證書遵循全球統一的嚴格身份驗證標準,是目前業界安全級別最高的頂級 (Class 4級)SSL證書。
金融證券、銀行、第三方支付、網上商城等,重點強調網站安全、企業可信形象的網站,涉及交易支付、客戶隱私信息和帳號密碼的傳輸。
這部分的驗證要求最高,申請費用也是最貴的。
選擇簽發機構時,最好選擇行業承認的全球範圍內均可以使用的ca機構簽發的證書。目前咱們國內的證書可以符合標準的還不是特別多,主要緣由是有一些證書不可以被國外的瀏覽器所承認,在使用的時候須要進行必定的額外操做。
根據保護域名的數量,SSL證書又分爲:
單域名版:只保護一個域名,例如 www.abc.com 或者 login.abc.com 之類的單個域名
多域名版:一張證書能夠保護多個域名,例如同時保護 www.abc.com , www.bcd.com, pay.efg.com 等
通配符版:一張證書保護同一個主域名下同一級的全部子域名,不限個數,形如 *.abc.com 。注意,通配符版只有 DVSSL 和 OVSSL 具備, EVSSL 不具備通配符版本。
當你在下載並安裝瀏覽器時,瀏覽器內部其實已經內嵌了全世界公認的根證書頒發機構的證書。
若一個網站的數字證書的證書頒發機構在瀏覽器中沒有,則須要引導用戶自行導入。
若是你想在 Chrome 中查看有哪些受信任的證書頒發機構,能夠點擊 設置
-> 隱私設置與安全性
-> 安全
-> 管理證書
在上圖的位置裏,隨便雙擊點開一個證書,就能夠查看證書裏的內容。
內容很是多,最主要的有
證書是哪一個機構的?
證書裏的公鑰是什麼?
證書有效期是何時?
採用的哪一種加解密的算法?
證書是有生命週期的,若是證書的私鑰泄漏了那這個證書就得吊銷,通常有兩種吊銷方式:CRL和OCSP。
CRL( Certificate Revocation List)是CA機構維護的一個已經被吊銷的證書序列號列表,瀏覽器須要定時更新這個列表,瀏覽器在驗證證書合法性的時候也會在證書吊銷列表中查詢是否已經被吊銷,若是被吊銷了那這個證書也是不可信的。能夠看出,這個列表隨着被吊銷證書的增長而增長,列表會愈來愈大,瀏覽器還須要定時更新,實時性也比較差。
因此,後來就有了 OCSP (Online Certificate Status Protocol)在線證書狀態協議,這個協議就是解決了 CRL 列表愈來愈大和實時性差的問題而生的。有了這個協議,瀏覽器就能夠不用按期更新CRL了,在驗證證書的時候直接去CA服務器實時校驗一下證書有沒有被吊銷就能夠,是解決了CRL的問題,可是每次都要去CA服務器上校驗也會很慢,在網絡環境較差的時候或者跨國訪問的時候,體驗就很是差了,OCSP雖然解決了CRL的問題可是性能卻不好。
若是你想了解更多關於證書的內容,能夠前往華爲雲的公開文檔進行學習:https://support.huaweicloud.com/scm_faq/scm_01_0020.html
CSR是Certificate Signing Request的英文縮寫,即證書籤名請求文件。
當申請者申請數字證書時,CSP(加密服務提供者)生成私鑰,同時也生成了CSR文件。申請者將CSR文件提交至Certificate Authority (CA)機構後,CA機構使用其根證書私鑰簽名,從而就生成了數字證書。
申請者經過CSR文件,向CA機構申請數字證書。獲取證書後,就能證實申請者的網站是可信的,數據傳輸是加密的。
接下來來了解一下,CSR 文件是如何生成的?
假設申請的域名爲 python.iswbm.com,公司名稱爲派森時光科技,部門是IT部,公司在中國廣東省深圳市。可經過運行下方命令行生成CSR文件:
$ openssl req -new –SHA256 -newkey rsa:2048 -nodes -keyout python.iswbm.com.key -out python.iswbm.com.csr -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=派森時光科技/OU=IT/CN=python.iswbm.com"
此命令行表示:
req
參數:表示證書請求request,用於生成CSR文件。
SHA256
參數:表示CSR簽名時用的摘要算法。
newkey
參數:表示指定證書的算法。參數 2048:表示密鑰對的長度。
nodes
參數:表示不對私鑰加密。
keyout
參數:表示生成的私鑰文件。名爲iswbm.key
的私鑰文件,需自行保管,用於獲取證書後的部署過程。
out
參數:表示生成的 CSR 文件。名爲iswbm.com.csr
的CSR文件,用於提交至CA機構驗證信息,從而獲取證書。
subj
參數:表示CSR信息,具體有哪些參數,能夠繼續往下看。
subj參數說明:
C
:Country,表示國家,申請者或申請企業所在國家的英文或兩位大寫國家代碼。如:CN
ST
:State/Province,表示省份,申請者或申請企業所在地的省/市/自治區英文或拼音全稱。如:Guangdong
L
:Locality,表示城市,申請者或申請企業所在城市的英文或拼音全稱。如:Shenzhen
O
:Organization,表示申請者的姓名或申請企業的名稱。
OU
:Organizational Unit,表示申請人所在部門的英文或拼音全稱。如:IT
CN
:Common Name,表示你要爲哪一個域名申請證書,但是單域名(好比 python.iswbm.com),也能夠是泛域名(*.iswbm.com),也能夠是爲多個域名申請一個證書(具體我沒操做過)。
上一條命令執行完後,會在你的本地目錄下生成兩文件
python.iswbm.com.csr:用於向CA機構申請證書
$ cat python.iswbm.com.csr
-----BEGIN CERTIFICATE REQUEST-----
MIIC0TCCAbkCAQAwgYsxCzAJBgNVBAYTAkNOMRIwEAYDVQQIDAlHdWFuZ2Rvbmcx
ETAPBgNVBAcMCFNoZW56aGVuMS0wKwYDVQQKDCTDpsK0wr7DpsKjwq7DpsKXwrbD
...
7lgB4QC1aIFz8gi9TGMJU2LqTDJCj+tgM68LDBdMLeQ8XZ33C95Nl0qt7yG+zjlZ
01jBh+T882r8x9gKdwb7nZSWFQY4/YTq+sY++YW/QuCNRcJ2vbM18U/HlIRsZ3su
x6Neh08=
-----END CERTIFICATE REQUEST-----
python.iswbm.com.key:私鑰,自行保存,不要外泄
$ cat python.iswbm.com.key
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC4OrcM9hTs9Hao
SzjsVJFX2Mmd+mToMG3u++o2Fd5yrPYq4COkT33lnL9kJNrDWqGp5TRkWqNwLaPl
...
a/lKBWLcvxE+IQ+mxNbN058kEJ3l8WAcAFCebLm5czUqmIVa3JR+cBDLvGFZVn6z
72AP5D/Evds4BOO+VzAiVLU6Ai78qhACuVExZNQCxdvJy4LxpeckUpCem9hAPiIY
LQfiTStBBU6t/+mnDyij+XreGQ==
-----END PRIVATE KEY-----
使用 OpenSSL 工具生成 CSR 文件的方法當然簡單,但使用時,須要你的瞭解代碼中參數的意思。
若是你不想花心思去記這些,推薦你使用 CSR在線生成工具(https://myssl.com/csr_create.html)
你只需簡單地輸入以下信息,再點擊 OpenSSL生成
,你就能夠得到一條 OpenSSL 命令,這下你不再用本身拼湊參數啦,真的太方便了。爲何不點擊 生成
讓其直接生成 私鑰文件 和 CSR文件 呢?固然是爲了安全起見啦。
在信息安全性問題中,咱們經常要作到三點才能保證信息的安全:
信息的保密性
信息的完整性
身份識別
將這三者結合起來,就是 TLS/SSL 作的事情
一、客戶端(瀏覽器)向服務端發出請求,服務端返回證書給客戶端。
二、客戶端拿到證書後,把證書裏的簽名與及明文信息分別取出來,而後會用自身攜帶的CA機構的公鑰去解密簽名,而後信息摘要1,而後再對明文信息進行HASH,獲得一個信息摘要2,對比信息摘要1 和信息摘要2,若是同樣,說明證書是合法的,也就是證書裏的公鑰是正確的。
以上採用的是非對稱加密(CA的公鑰和私鑰),保證了客戶端接收到服務端正確的公鑰,有了服務端的公鑰後,後面的信息加密均可以使用這個公鑰,而用這個公鑰加密事後的密文,只有服務端的私鑰能解,就算***拿到了也無法解開。