1. 程式人生 > >安全與加密-SSL交互與握手過程 創建CA和證書管理

安全與加密-SSL交互與握手過程 創建CA和證書管理

ror 描述 sin code oss shadow pro back 自簽名證書

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

技術分享圖片技術分享圖片

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

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

技術分享圖片技術分享圖片

既然有了第三方的權威機構頒發的證書,那麽通訊的過程也需要加密保護以便防止過程被竊取篡改。

大家都知道,HTTP 協議都是明文傳輸內容,在早期只展示靜態內容時沒有問題。伴隨著互聯網的快速發展,人們對於網絡傳輸安全性的要求也越來越高,HTTPS 協議因此出現。如下圖所示

技術分享圖片技術分享圖片

在 HTTPS協議中封裝的加密方法其實是 SSL/TLS 協議。SSL/TLS 協議作用在 HTTP 協議之下,對於上層應用來說,原來的發送接收數據流程不變,這就很好地兼容了老的 HTTP 協議,這也是軟件開發中分層實現的體現。

SSL/TLS 握手是為了安全地協商出一份對稱加密的秘鑰


SSL交互和握手過程


單向認證:


技術分享圖片


雙向認證:

技術分享圖片


原理過程講完了,那就開始實現SSL/TLS


證書管理

名詞:

PKI :Public Key Infrastructure

包含:

CA:證書頒發機構

RA:證書註冊機構

CRL:證書吊銷列表

證書存取庫


創建私有CA


openssl的配置文件,/etc/pki/tls/openssl.cnf

找到[ ca ]設置,下面為主要選項說明。文件名是有指定要求的。

[ ca ]

default_ca = CA_default # 默認CA使用哪套配置文件

[ CA_default ] #配置文件名,以下為該套配置的設定

dir = /etc/pki/CA # 目錄

certs = $dir/certs # 簽發證書存放位置

crl_dir = $dir/crl # 存放 crl(證書吊銷列表)位置

database = $dir/index.txt # 數據庫索引文件

#unique_subject = no # 是否允許被頒發者有重復的描述信息

new_certs_dir = $dir/newcerts # 新證書的默認位置,頒發證書的時候,會copy一份到這

certificate = $dir/cacert.pem # CA自簽名證書文件

serial = $dir/serial # 存放下一個頒發證書的編號

crlnumber = $dir/crlnumber # 當前crl數量

crl = $dir/crl.pem # 證書吊銷列表文件

private_key = $dir/private/cakey.pem # CA自己的私鑰

RANDFILE = $dir/private/.rand # 私鑰隨機數文件

x509_extensions = usr_cert # The extentions to add to the cert

name_opt = ca_default # Subject Name options

cert_opt = ca_default # Certificate field options

default_days = 365 # 默認證書有效期

default_crl_days= 30 # 默認crl下一次公布間隔

default_md = default # 默認使用的公鑰算法,在[req]指定

preserve = no # keep passed DN ordering

policy = policy_match #使用的策略。match為必須匹配,optional為可選,supplied需要 指定。可以參考pam章節

[ policy_match ] # 策略名,下面為設置

countryName = match #國家

stateOrProvinceName = match #省

organizationName = match #組織名

organizationalUnitName = optional #組織單位名

commonName = supplied #證書頒發給哪個域名使用。非常重要

emailAddress = optional #Email

[ req ]

default_bits = 2048 #加密長度

default_md = sha1 加密算法


1.創建所需要的文件

#cd /etc/pki/CA

生成證書索引數據庫文件

#touch /etc/pki/CA/index.txt

指定第一個頒發證書的序列號

#echo 01 > /etc/pki/CA/serial


2.創建所需要的文件

生成私鑰,如果不指定-des3 2048,在使用私鑰時不會詢問密碼

#(umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem -des3 2048)


3.生成簽名證書

語法格式:

-new: 生成新證書簽署請求

-x509: 專用於CA生成自簽證書

-key: 生成請求時用到的私鑰文件

-days n:證書的有效期限,以天為單位

-out /PATH/TO/SOMECERTFILE: 證書的保存路徑

#openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem

Country Name (2 letter code) [XX]:CN

State or Province Name (full name) []:GUANGDONG

Locality Name (eg, city) [Default City]:shenzhen

Organization Name (eg, company) [Default Company Ltd]:NEO

Organizational Unit Name (eg, section) []:opt

Common Name (eg, your name or your server's hostname) []:ca.hunk.teh

Email Address []:[email protected]

查看證書命令

#openssl x509 -in /etc/pki/CA/cacert.pem -noout -text 還有很多參數,可以輸錯命令將會列出


4.在客戶端生成密鑰文件

#(umask 066;openssl genrsa -out http.key -des3 2048)


5.在客戶端生成證收請求文件

#openssl req -new -key http.key -out http.req 建議生成.req結尾的

查看請求文件命令

#openssl req -in http.req -noout -text

6.將客戶端的請求文件傳輸至CA服務器

7.在CA服務器為指定請求文件生成證書

#openssl ca -in http.req -days 730 -out http.crt

下圖為生成的證書信息

技術分享圖片技術分享圖片

8.將生成的證書傳輸給申請者


另外,當index.txt.attr文件內容unique_subject = yes時,

申請文件中的Subject相同時,將會報以下問題,唯一性檢查

Sign the certificate? [y/n]:y

failed to update database

TXT_DB error number 2

如果後面報以下錯誤,請檢查這裏的設置

error creating name index:(2,0,1)


證書狀態管理


#cat index.txt V 代表證書是有效的,R 是吊銷狀態

V 200114153136Z 01 unknown

R 200114155454Z 180114162948Z 02

#openssl ca -status 01

Using configuration from /etc/pki/tls/openssl.cnf

01=Valid (V)


吊銷證書

#openssl ca -revoke /etc/pki/CA/newcerts/02.pem


更新吊銷列表

1.創建吊銷證書的編號文件

#touch /etc/pki/CA/crlnumber

#echo 01 > /etc/pki/CA/crlnumber

2.更新證書吊銷列表

#openssl ca -gencrl -out /etc/pki/CA/crl.pem


安全與加密-SSL交互與握手過程 創建CA和證書管理