openssl加密入門資料整理

最近在搞grpc ssl雙向驗證加密傳輸,剛好把最近網上搜索的資料與個人理解整理一下。

一、背景介紹

使用HTTP(超文本傳輸)協議訪問互聯網上的數據是沒有經過加密的。也就是說,任何人都可以通過適當的工具攔截或者監聽到在網絡上傳輸的數據流。但是有時候,我們需要在網絡上傳輸一些安全性或者私祕性的數據,譬如:包含信用卡及商品信息的電子訂單。這個時候,如果仍然使用HTTP協議,勢必會面臨非常大的風險!相信沒有人能接受自己的信用卡號在互聯網上裸奔。

HTTPS(超文本傳輸安全)協議無疑可以有效的解決這一問題。所謂HTTPS,其實就是HTTP和SSL/TLS的組合,用以提供加密通訊及對網絡服務器的身份鑑定。HTTPS的主要思想是在不安全的網絡上創建一安全信道,防止黑客的竊聽和攻擊。

SSL是Secure Sockets Layer(安全套接層協議)的縮寫,可以在Internet上提供祕密性傳輸。
TLS是傳輸層安全協議 Transport Layer Security的縮寫。
TLS簡單看成SSL的升級版。
詳細差異見
SSL與TLS的區別以及介紹_知識庫_博客園

二、常見術語

1.CA
CA(Certification Authority)證書頒發機構。

2.KEY
通常指私鑰。

3.CSR
是Certificate Signing Request的縮寫,即證書籤名請求,這不是證書,證書請求文件包含可以公鑰和一些身份信息。可以簡單理解成公鑰,生成證書時要把這個提交給權威的證書頒發機構。

4.CRT
certificate的縮寫,即證書。

5.X.509
是一種證書格式.對X.509證書來說,認證者總是CA或由CA指定的人,一份X.509證書是一些標準字段的集合,這些字段包含有關用戶或設備及其相應公鑰的信息。
X.509的證書文件,一般以.crt結尾。
openssl 當使用x509選項的時候,說明是要生成自簽名證書。
X.509證書包含三個文件:key,csr,crt

key是服務器上的私鑰文件,用於對發送給客戶端數據的加密,以及對從客戶端接收到數據的解密

csr是證書籤名請求文件,用於提交給證書頒發機構(CA)對證書籤名。

crt是由證書頒發機構(CA)簽名後的證書,或者是開發者自簽名的證書,包含證書持有人的信息,持有人的公鑰,以及簽署者的簽名等信息

備註:在密碼學中,X.509是一個標準,規範了公開祕鑰認證、證書吊銷列表、授權憑證、憑證路徑驗證算法等。

6.對稱加密
使用相同的密碼進行加密和解密。
缺點,安全性得不到保證。
常見的對稱加密算法:DES,3DES,AES,Blowfish,Twofish,IDEA,RC6,CAST5 等。

7.非對稱加密:
使用兩組不同的密鑰,密鑰是成對出現,“私鑰-公鑰”,一個用於加密,一個用於解密。不同密碼能夠解密成功的原理是,利用數學上的一個素數積求因子。

8.加密與解密/簽名與驗證簽名
一把鑰匙一把鎖,並且加密可以使用公鑰也可以使用私鑰。
公鑰加密數據,然後私鑰解密的情況被稱爲加密解密,私鑰加密數據,公鑰解密一般被稱爲簽名和驗證簽名.
常見的非對稱加密有 RSA、ESA、ECC 等。

公鑰:公開給所有人。不能通過公鑰反推出私鑰;public key
私鑰:自己留存,不公開。有且只有一個對應的私鑰;secret key
特點:通過私鑰加密的密文只能通過公鑰能解密,通過公鑰加密的密文也只能通過私鑰能解密。
缺點:但由於算法強度比對稱加密複雜,加解密的速度比對稱加解密的速度要慢。

目前使用的是RSA加密算法,RSA可以用於加密/解密,也可以簽名/驗證簽名。

三、加密通訊流程

簡單的加密通訊流程
服務端公鑰或私鑰加密或簽名數據發送給客戶端;
客戶端私鑰或公鑰解密或者驗證簽名服務端數據。

身份驗證和密鑰協商是TLS的基礎功能,要求的前提是合法的服務器掌握着對應的私鑰,但無法確保服務器身份的合法性,因爲公鑰並不包含服務器的信息,存在安全隱患:

  1. 中間人攻擊:
    (1)客戶端C和服務器S進行通信,中間節點M截獲了二者的通信;
    (2)節點M自己計算產生一對公鑰pub_M和私鑰pri_M;
    (3)C向S請求公鑰時,M把自己的公鑰pub_M發給了C;
    (4)C使用公鑰 pub_M加密的數據能夠被M解密,因爲M掌握對應的私鑰pri_M,而 C無法根據公鑰信息判斷服務器的身份,從而 C和 M之間建立了"可信"加密連接;
    (5)中間節點M和服務器S之間再建立合法的連接,因此 C和 S之間通信被M完全掌握,M可以進行信息的竊聽、篡改等操作。

  2. 信息抵賴
     服務器也可以對自己的發出的信息進行否認,不承認相關信息是自己發出。


使用gpg和openssl加密公鑰進行安全數據通訊的場景。可是,網絡中總是有不懷好意的角色存在,別以爲你以公鑰加密了就是安全的,有沒有想過,你得到的這個公鑰是不是真正要跟你通訊的服務器公鑰呢?萬一被僞造了?那將會如下圖,黑客能打開加密的文件,而真正的ServerB卻無法解開密文。


所以,就如現實生活中,大家都要確認某樣東西的真實性的時候,找第三方權威機構,把各自己的信息交回權威機構進行驗證後,再由權威機構公佈各自需要的信息。

如下圖,CA證書機構就是用來做這事的。


既然有了第三方的權威機構頒發的證書,那麼通訊的過程也需要加密保護以便防止過程被竊取篡改。
SSL/TLS 握手是爲了安全地協商出一份對稱加密的祕鑰。

想要深入理解可參考該博客。
安全與加密-使用gpg和openssl實現加密與解密-金色之謎-51CTO博客

四、CA證書

CA(Certification Authority)證書頒發機構。

CA簽發證書的流程

  1. 服務方 S 向第三方機構CA提交公鑰、組織信息、個人信息(域名)等信息並申請認證;

  2. CA 通過線上、線下等多種手段驗證申請者提供信息的真實性,如組織是否存在、企業是否合法,是否擁有域名的所有權等;

  3. 如信息審覈通過,CA 會向申請者簽發認證文件-證書。
    證書包含以下信息:
    申請者公鑰、申請者的組織信息和個人信息、簽發機構 CA 的信息、有效時間、證書序列號等信息的明文,同時包含一個簽名;

    簽名的產生算法:首先,使用散列函數計算公開的明文信息的信息摘要,然後,採用 CA 的私鑰對信息摘要進行加密,密文即簽名;

  4. 客戶端 C 向服務器 S 發出請求時,S 返回證書文件;

  5. 客戶端 C 讀取證書中的相關的明文信息,採用相同的散列函數計算得到信息摘要,然後,利用對應 CA 的公鑰解密簽名數據,對比證書的信息摘要,如果一致,則可以確認證書的合法性,即公鑰合法;

    證書實際是由證書籤證機關(CA)簽發的對用戶的公鑰的認證。證書的內容包括:電子簽證機關的信息、公鑰用戶信息、公鑰、權威機構的簽字和有效期等等。

    目前,證書的格式和驗證方法普遍遵循X.509 國際標準。

  6. 客戶端然後驗證證書相關的域名信息、有效時間等信息;

  7. 客戶端會內置信任 CA 的證書信息(包含公鑰),如果CA不被信任,則找不到對應 CA 的證書,證書也會被判定非法。

在這個過程注意幾點

  1. 申請證書不需要提供私鑰,確保私鑰永遠只能服務器掌握
  2. 證書的合法性仍然依賴於非對稱加密算法,證書主要是增加了服務器信息以及簽名;
  3. 內置 CA 對應的證書稱爲根證書,頒發者和使用者相同,自己爲自己簽名,即自簽名證書
  4. 證書=公鑰+申請者與頒發者信息+簽名;

五、SSL交互和握手過程

單項認證:

雙向認證:

雙向認證簡單理解爲客戶端與服務端分別驗證對方的證書,用來覈實身份。確認過是對的人。根據約定的加密方法協商出一對會話密鑰,該密鑰是對稱密鑰。
雙向認證比單項認證多了驗證客戶端身份的步驟。

更深入理解TLS/SSL交互流程可以參考博客。
圖解SSL/TLS協議 - 阮一峯的網絡日誌

這篇專欄詳細講解了TLS協議
TLS_Protocol/Linux Kernel/ Optimization_Mrpre-CSDN博客

六、openssl生成證書及簽名

實際應用中,一般人都不會找CA去簽名,因爲那是收錢的,所以自己可以通過openssl做一個自簽名的證書文件。

CA證書也可以稱爲根證書。

1.生成CA私鑰

openssl genrsa -passout pass:1111 -des3 -out ca.key 2048

說明:
genrsa 產生rsa密鑰命令。
因爲生成私鑰需要輸入密碼。

所以使用 passout 代替shell 進行密碼輸入,否則會提示輸入密碼
-des3 爲加密算法
2048 爲私鑰長度
默認的密鑰長度一般都不夠安全,老版本的 OpenSSL 默認 RSA 私鑰是1024位,所以我們需要指定密鑰長度,2048位是效率和安全的平衡點。如果 RSA 密鑰的長度是512位,非常不安全,***者可以先獲取你的證書,再使用暴力方式來算出對應的私鑰,之後就可以冒充你的網站了。現在,一般認爲2048位的 RSA 密鑰是安全的,所以你應該採用這個長度的密鑰。


也可以使用openssl rsa -in ca.key -noout -text進行查看。

2.根據CA私鑰生成CA的自簽名證書

openssl req -passin pass:1111 -new -x509 -days 365 -key ca.key -out ca.crt -subj "/C=CN/ST=FuJian/L=XiaMen/O=YaXon/OU=gRPC/CN=localhost"

使用-subj來替代shell進行身份輸入。CN=localhost爲域名設置,後續可以根據自己實際情況設置,比如CN=www.helloworld.com。

3.使用CA私鑰和證書對服務端證書進行簽名

openssl x509 -req -passin pass:1111 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt

客戶端也是相同的操作。具體參數說明還是參考其他大神的總結吧。

OpenSSL 生成服務器及客戶端證書_網絡_萬里歸來少年心-CSDN博客

如何使用openssl生成證書及簽名 - 簡書

使用 openssl 生成證書(含openssl詳解)-擡頭看世界,低頭寫代碼-51CTO博客

4.完整的密鑰生成腳本

#!/bin/sh

echo Generate CA key:
openssl genrsa -passout pass:1111 -des3 -out ca.key 2048

echo Generate CA certificate:
openssl req -passin pass:1111 -new -x509 -days 365 -key ca.key -out ca.crt -subj "/C=CN/ST=FuJian/L=XiaMen/O=YaXon/OU=gRPC/CN=localhost"
 
echo Generate server key:
openssl genrsa -passout pass:1111 -des3 -out server.key 2048
 
echo Generate server signing request:
openssl req -passin pass:1111 -new -key server.key -out server.csr -subj "/C=CN/ST=FuJian/L=XiaMen/O=YaXon/OU=gRPC/CN=localhost"
 
echo Self-sign server certificate:
openssl x509 -req -passin pass:1111 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
 
echo Remove passphrase from server key:
openssl rsa -passin pass:1111 -in server.key -out server.key
 
echo Generate client key
openssl genrsa -passout pass:1111 -des3 -out client.key 2048
 
echo Generate client signing request:
openssl req -passin pass:1111 -new -key client.key -out client.csr -subj "/C=CN/ST=FuJian/L=XiaMen/O=YaXon/OU=gRPC/CN=localhost"
 
echo Self-sign client certificate:
openssl x509 -passin pass:1111 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
 
echo Remove passphrase from client key:
openssl rsa -passin pass:1111 -in client.key -out client.key

chmod 777 ca.crt ca.key client.crt client.csr client.key server.crt server.csr server.key

不修改生成密鑰的權限,後續在grpc ssl驗證過程會出現異常。

七、參考資料

openssl基本原理 + 生成證書 + 使用實例 - 謙信君 - 博客園

openssl ca(簽署和自建CA) - 駿馬金龍 - 博客園

openssl 證書請求和自簽名命令req詳解 - Gordon0918 - 博客園

HTTPS中CA證書的簽發及使用過程 - xdyixia - 博客園

搭建私有CA並基於OpenSSL實現雙向身份認證 - xdyixia - 博客園

SSL/TLS深度解析–OpenSSL 生成自簽證書-斯圖爾特-51CTO博客

圖解公鑰與私鑰 | 《Linux就該這麼學》

關於數字證書,數字簽名,CA證書,Https都在這裏了_網絡_qq_15022971的博客-CSDN博客

通過openssl驗證ssl證書匹配性_C/C++_huakai_sun的博客-CSDN博客

CA認證的原理和流程及https原理 - BruceLong - 博客園

Openssl 查看證書指令_運維_小丑魚-CSDN博客

如何創建一個自簽名的SSL證書(X509) - 簡書

OpenSSL 生成服務器及客戶端證書_網絡_萬里歸來少年心-CSDN博客

如何使用openssl生成證書及簽名 - 簡書

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章