1. 證書(shū)
公鑰證書(shū)(Public-Key Certificate,PKC)其實(shí)和駕照很相似,里面記有姓名、組織、郵箱地址等<font color="red">個(gè)人信息</font>,以及屬于<font color="red">此人的公鑰, 并由認(rèn)證機(jī)構(gòu)(Certification Authority、Certifying Authority, CA)施加數(shù)字簽名</font>。只要看到公鑰證書(shū),我們就可以知道認(rèn)證機(jī)構(gòu)認(rèn)定該公鑰的確屬于此人。公鑰證書(shū)也簡(jiǎn)稱為證書(shū)(certificate)。
1.1 證書(shū)的應(yīng)用場(chǎng)景

- <font color="red" size=4>Bob生成密鑰對(duì)</font>
- 可以將bob看成百度, 提供是web服務(wù)器
- 生成一個(gè)密鑰對(duì)
- 公鑰 -> 分發(fā)
- 私鑰 -> 百度留著
- <font color="red" size=4>Bob在認(rèn)證機(jī)構(gòu)Trent注冊(cè)自己的公鑰</font>
- 百度找了一大家都信賴的機(jī)構(gòu), 來(lái)證明這個(gè)公鑰是百度的
- 認(rèn)證機(jī)構(gòu)會(huì)生成一個(gè)證書(shū), 寫(xiě)明了公鑰屬于百度
- 認(rèn)證機(jī)構(gòu)也有一個(gè)非對(duì)稱加密的密鑰對(duì)
- 認(rèn)證機(jī)構(gòu)使用自己的私鑰對(duì)百度的公鑰進(jìn)行簽名, 生成了證書(shū)
- 認(rèn)證機(jī)構(gòu)將證書(shū)發(fā)送給百度
- <font color="red" size=4>認(rèn)證機(jī)構(gòu)Trent用自己的私鑰對(duì)Bob的公鑰施加數(shù)字簽名并生成證書(shū)</font>
- <font color="red" size=4>Alice得到帶有認(rèn)證機(jī)構(gòu)Trent的數(shù)字簽名的Bob的公鑰(證書(shū))</font>
- alice可以看做一個(gè)客戶 -> 瀏覽器
- 客戶端訪問(wèn)的百度 -> 得到了百度的證書(shū)
- 證書(shū)中有百度的公鑰
- 客戶端需要使用認(rèn)證機(jī)構(gòu)的公鑰對(duì)證書(shū)進(jìn)行驗(yàn)證
- 客戶端怎么會(huì)有認(rèn)證機(jī)構(gòu)的公鑰
- window會(huì)預(yù)裝, 或者用戶自己安裝
- <font color="red" size=4>Alice使用認(rèn)證機(jī)構(gòu)Trent的公鑰驗(yàn)證數(shù)字簽名,確認(rèn)Bob的公鑰的合法性</font>
- 使用認(rèn)證機(jī)構(gòu)的公鑰解除百度證書(shū)中簽名的數(shù)據(jù)
- 百度的公鑰
- 百度的域名
- 百度證書(shū)的有效期
- <font color="red" size=4>Alice用Bob的公鑰加密消息并發(fā)送給Bob</font>
- 非對(duì)稱加密
- 使用公鑰加密 -> 對(duì)稱加密秘鑰分發(fā)
- <font color="red" size=4>Bob用自己的私鑰解密密文得到Alice的消息</font>
- 服務(wù)器使用私鑰解密 -> 得到對(duì)稱加密的秘鑰
1.2 證書(shū)規(guī)范和格式 -- x509
X.509是一種非常通用的證書(shū)格式。所有的證書(shū)都符合ITU-T X.509國(guó)際標(biāo)準(zhǔn),因此(理論上)為一種應(yīng)用創(chuàng)建的證書(shū)可以用于任何其他符合X.509標(biāo)準(zhǔn)的應(yīng)用。X.509證書(shū)的結(jié)構(gòu)是用ASN1(Abstract Syntax Notation One)進(jìn)行描述數(shù)據(jù)結(jié)構(gòu),并使用ASN.1語(yǔ)法進(jìn)行編碼。
X.509規(guī)范中一般推薦使用PEM(Privacy Enhanced Mail)格式來(lái)存儲(chǔ)證書(shū)相關(guān)的文件。
- 證書(shū)文件的文件名后綴一般為 .crt 或 .cer
- 對(duì)應(yīng)私鑰文件的文件名后綴一般為 .key
- 證書(shū)請(qǐng)求文件的文件名后綴為 .csr
- 有時(shí)候也統(tǒng)一用pem作為文件名后綴。
1.3 CA證書(shū)
CA證書(shū)顧名思義就是由CA(Certification Authority)機(jī)構(gòu)發(fā)布的數(shù)字證書(shū)。要對(duì)CA證書(shū)完全理解及其作用,首先要理解SSL。SSL(security sockets layer,安全套接層)是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議。SSL3.0版本以后又被稱為TLS。SSL位于TCP與各應(yīng)用層之間,是操作系統(tǒng)向外提供的API。SSL如何保證網(wǎng)絡(luò)通信的安全和數(shù)據(jù)的完整性呢?就是采用了兩種手段:身份認(rèn)證和數(shù)據(jù)加密。首先身份認(rèn)證就需要用到CA證書(shū)了。
-
證書(shū)的獲取和身份的認(rèn)證
客戶端與服務(wù)端需要經(jīng)過(guò)一個(gè)握手的過(guò)程才能完成身份認(rèn)證,建立一個(gè)安全的連接。握手的過(guò)程如下:
客戶端訪問(wèn)服務(wù)器(比如:https://www.12306.cn),發(fā)送ssl版本、客戶端支持的加密算法等消息。
服務(wù)器向客戶端發(fā)送ssl版本、加密算法、證書(shū)(證書(shū)出現(xiàn)了)等消息。
-
客戶端收到消息后,判斷證書(shū)是否可信, 若可信,則繼續(xù)通信,發(fā)送消息:
<font color="red">客戶端生成一個(gè)隨機(jī)數(shù),從證書(shū)中獲取服務(wù)器端的公鑰,對(duì)隨機(jī)數(shù)加密;</font>
隨后信息都將使用雙方協(xié)定的加密方法和密鑰發(fā)送, 客戶端握手結(jié)束。
服務(wù)器端對(duì)數(shù)據(jù)解密得到隨機(jī)數(shù), 使用協(xié)商好的加密算法和秘鑰進(jìn)行通信
-
客戶端如何驗(yàn)證CA證書(shū)是可信任的?
-
查看證書(shū)的方式:
Internet選項(xiàng) -> 內(nèi)容 -> 證書(shū), 打開(kāi)證書(shū)窗口查看已經(jīng)安裝的證書(shū)
只要電腦上安裝了該證書(shū), 就說(shuō)明該證書(shū)是受信任的。使用https協(xié)議訪問(wèn)時(shí),服務(wù)器發(fā)送證書(shū)向?yàn)g覽器時(shí),首先查找該證書(shū)是否已在信任列表中,然后對(duì)證書(shū)進(jìn)行校驗(yàn),校驗(yàn)成功,那么就證明證書(shū)是可信的。
下圖中
受信任的根證書(shū)頒發(fā)機(jī)構(gòu)下的證書(shū)都是根證書(shū)。證書(shū)驗(yàn)證的機(jī)制是只要根證書(shū)是受信任的,那么它的子證書(shū)都是可信的。比如說(shuō),我們使用https協(xié)議訪問(wèn)了需要百度證書(shū)的網(wǎng)站,即使我們不安裝百度證書(shū),那么網(wǎng)站也不會(huì)提示證書(shū)不安全,因?yàn)?,生成百度證書(shū)的根證書(shū)
Globalsign Root CA - R1證書(shū),在受信任的證書(shū)列表中。如果一個(gè)證書(shū)的根證書(shū)是不可信的,那么這個(gè)證書(shū)肯定也是不可信任的。由以上可知,根證書(shū)在證書(shū)驗(yàn)證中極其重要,而且,根證書(shū)是無(wú)條件信任的,只要我們將根證書(shū)安裝上,就說(shuō)明我們對(duì)根證書(shū)是信任的。比如我們安裝12306的根證書(shū),是出于我們對(duì)國(guó)家的信任,對(duì)網(wǎng)站的信任,我們才放心安裝這個(gè)根證書(shū)。對(duì)于一些不安全的網(wǎng)站的證書(shū),一定要慎重安裝。
另外需要知道的是,【
受信任的根證書(shū)頒發(fā)機(jī)構(gòu)】中的證書(shū)是windows預(yù)先安裝的一些證書(shū),都是國(guó)際上很有權(quán)威的證書(shū)機(jī)構(gòu),他們證書(shū)的生成都有很嚴(yán)格的流程,因此他們的證書(shū)被認(rèn)為是安全,就像我們相信銀行是安全,所以把錢存入到銀行。
-

證書(shū)的頒發(fā)機(jī)構(gòu) -> CA
- 發(fā)布根證書(shū)
- 中間證書(shū)
- 個(gè)人
證書(shū)的信任鏈 -> 證書(shū)簽發(fā)機(jī)構(gòu)的信任鏈
A是一個(gè)可信賴證書(shū)簽發(fā)機(jī)構(gòu), A信任B, B就有資格去簽發(fā)證書(shū)
從等級(jí)上A比B高一級(jí)
-
有哪些CA機(jī)構(gòu)?
世界上較早的數(shù)字認(rèn)證中心是美國(guó)的verisign
威瑞信公司,在windows的證書(shū)窗口中可以看到好多verisign公司生成的證書(shū), 美國(guó)的DigiCert另外還有加拿大的ENTRUST公司,也是很著名的證書(shū)機(jī)構(gòu)。
中國(guó)的安全認(rèn)證體系分為金融CA和非金融CA。
- 在金融CA方面,根證書(shū)由中國(guó)人民銀行管理,
- 非金融CA方面,由中國(guó)電信負(fù)責(zé)。
- 行業(yè)性CA
- 中國(guó)金融認(rèn)證中心
- 中國(guó)電信認(rèn)證中心
- 區(qū)域性CA, 區(qū)域性CA主要是以政府為背景,以企業(yè)機(jī)制運(yùn)行
- 廣東CA中心
- 上海CA中心
- 行業(yè)性CA
1.4 公鑰基礎(chǔ)設(shè)施 - PKI
- PKI組成的要素
- 用戶
- 申請(qǐng)證書(shū)的人 -> web服務(wù)器端
- 申請(qǐng)證書(shū)
- 生成密鑰對(duì) , 或者委托ca生成
- 將公鑰發(fā)送給CA
- ca使用自己的私鑰對(duì)得到公鑰簽名
- 將證書(shū)發(fā)送給用戶
- 發(fā)送證書(shū)
- 當(dāng)客戶端訪問(wèn)服務(wù)器的時(shí)候發(fā)送證書(shū)給客戶端
- 注銷證書(shū)
- 當(dāng)發(fā)現(xiàn)私鑰泄露之后
- 申請(qǐng)證書(shū)
- 使用證書(shū)的人 -> 客戶端
- 接收證書(shū)
- 驗(yàn)證對(duì)方的身份信息
- 申請(qǐng)證書(shū)的人 -> web服務(wù)器端
- CA認(rèn)證機(jī)構(gòu)
- 可以生產(chǎn)密鑰對(duì)(可選)
- 對(duì)公鑰簽名
- 吊銷證書(shū)
- 倉(cāng)庫(kù)
- 存儲(chǔ)證書(shū) -> 公鑰
- 用戶
2. SSL/TLS

- SSL:(Secure Socket Layer,安全套接字層),為Netscape所研發(fā),用以保障在Internet上數(shù)據(jù)傳輸之安全,利用數(shù)據(jù)加密(Encryption)技術(shù),可確保數(shù)據(jù)在網(wǎng)絡(luò)上之傳輸過(guò)程中不會(huì)被截取。當(dāng)前版本為3.0。它已被廣泛地用于Web瀏覽器與服務(wù)器之間的身份認(rèn)證和加密數(shù)據(jù)傳輸。
SSL協(xié)議位于TCP/IP協(xié)議與各種應(yīng)用層協(xié)議之間,為數(shù)據(jù)通訊提供安全支持。SSL協(xié)議可分為兩層: SSL記錄協(xié)議(SSL Record Protocol):它建立在可靠的傳輸協(xié)議(如TCP)之上,為高層協(xié)議提供數(shù)據(jù)封裝、壓縮、加密等基本功能的支持。 SSL握手協(xié)議(SSL Handshake Protocol):它建立在SSL記錄協(xié)議之上,用于在實(shí)際的數(shù)據(jù)傳輸開(kāi)始前,通訊雙方進(jìn)行身份認(rèn)證、協(xié)商加密算法、交換加密密鑰等。- TLS:(Transport Layer Security,傳輸層安全協(xié)議),用于兩個(gè)應(yīng)用程序之間提供保密性和數(shù)據(jù)完整性。
TLS 1.0是IETF(Internet Engineering Task Force,Internet工程任務(wù)組)制定的一種新的協(xié)議,它建立在SSL 3.0協(xié)議規(guī)范之上,是SSL 3.0的后續(xù)版本,可以理解為SSL 3.1,它是寫(xiě)入了 RFC 的。該協(xié)議由兩層組成: TLS 記錄協(xié)議(TLS Record)和 TLS 握手協(xié)議(TLS Handshake)。較低的層為 TLS 記錄協(xié)議,位于某個(gè)可靠的傳輸協(xié)議(例如 TCP)上面。SSL/TLS協(xié)議提供的服務(wù)主要有:
- 認(rèn)證用戶和服務(wù)器,確保數(shù)據(jù)發(fā)送到正確的客戶機(jī)和服務(wù)器;
- 加密數(shù)據(jù)以防止數(shù)據(jù)中途被竊?。?/li>
- 維護(hù)數(shù)據(jù)的完整性,確保數(shù)據(jù)在傳輸過(guò)程中不被改變。

-
描述的是客戶端和服務(wù)器剛建立連接之后做的事情
第一次
- 客戶端連接服務(wù)器
- 客戶端使用的ssl版本, 客戶端支持的加密算法
- 服務(wù)器
- 先將自己支持ssl版本和客戶端的支持的版本比較
- 支持的不一樣, 連接斷開(kāi)
- 支持的一樣, 繼續(xù)
- 根據(jù)得到的客戶端支持 的加密算法, 找一個(gè)服務(wù)器端也同樣支持算法, 發(fā)送給客戶端
- 需要發(fā)送服務(wù)器的證書(shū)給客戶端
- 先將自己支持ssl版本和客戶端的支持的版本比較
第二次:
客戶端:
- 接收服務(wù)器的證書(shū)
- 校驗(yàn)證書(shū)的信息
- 校驗(yàn)證書(shū)的簽發(fā)機(jī)構(gòu)
- 證書(shū)的有效期
- 證書(shū)中支持 的域名和訪問(wèn)的域名是否一致
- 校驗(yàn)有問(wèn)題, 瀏覽器會(huì)給提示
- 客戶端連接服務(wù)器
3. https -> 單向認(rèn)證

- 服務(wù)器要準(zhǔn)備的
- 生成密鑰對(duì)
- 將公鑰發(fā)送給ca, 由ca簽發(fā)證書(shū)
- 將ca簽發(fā)的證書(shū)和非對(duì)稱加密的私鑰部署到當(dāng)前的web服務(wù)器
- 通信流程
- 客戶端連接服務(wù)器, 通過(guò)一個(gè)域名
- 域名和IP地址的關(guān)系
- 域名要綁定IP地址
- 一個(gè)域名只能綁定一個(gè)IP地址
- IP地址需要被域名綁定
- 一個(gè)IP地址可以被多個(gè)域名綁定
- 域名要綁定IP地址
- 客戶端訪問(wèn)的域名會(huì)別解析成IP地址, 通過(guò)IP地址訪問(wèn)web服務(wù)器
- 域名和IP地址的關(guān)系
- 服務(wù)器收到了客戶端的請(qǐng)求
- 服務(wù)器將CA簽發(fā)的證書(shū)發(fā)送給瀏覽器(客戶端)
- 客戶端拿到了服務(wù)器的公鑰證書(shū)
- 讀這個(gè)公鑰 證書(shū)
- 驗(yàn)證域名
- 有效期
- ca簽發(fā)機(jī)構(gòu)
- 服務(wù)器的公鑰
- 讀這個(gè)公鑰 證書(shū)
- 客戶會(huì)生成一個(gè)隨機(jī)數(shù) (作為對(duì)稱加密的秘鑰來(lái)使用的)
- 使用服務(wù)器的公鑰就這個(gè)隨機(jī)數(shù)進(jìn)行加密
- 將這個(gè)加密之后 秘鑰發(fā)送給服務(wù)器
- 服務(wù)器對(duì)收到的密文解密
- 使用服務(wù)器的是要解密, 得到對(duì)稱加密的秘鑰
- 數(shù)據(jù)的傳輸
- 使用對(duì)稱加密的方式對(duì)數(shù)據(jù)進(jìn)行加密
- 客戶端連接服務(wù)器, 通過(guò)一個(gè)域名
4. 自簽名證書(shū)
-
使用openssl生成自簽名證書(shū)
創(chuàng)建一個(gè)目錄如Mytest, 進(jìn)入該目錄, 在該目錄下打開(kāi)命令行窗口
-
啟動(dòng)openssl
openssl # 執(zhí)行該命令即可 -
使用openssl工具生成一個(gè)RSA私鑰, 注意:生成私鑰,需要提供一個(gè)至少4位的密碼。
genrsa -des3 -out server.key 2048 - des3: 使用3des對(duì)私鑰進(jìn)行加密 -
生成CSR(證書(shū)簽名請(qǐng)求)
req -new -key server.key -out server.csr -
刪除私鑰中的密碼, 第一步給私鑰文件設(shè)置密碼是必須要做的, 如果不想要可以刪掉
rsa -in server.key -out server.key -out 參數(shù)后的文件名可以隨意起 -
生成自簽名證書(shū)
x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
復(fù)習(xí)
-
消息認(rèn)證碼
- 是什么?
- 散列值
- 能干什么?
- 保證數(shù)據(jù)的完整性, 一致性
- 怎么生成?
- 準(zhǔn)備的條件: Hmac
- 原始數(shù)據(jù)
- 共享秘鑰 -> 認(rèn)證的另一方需要有同樣的秘鑰
- 哈希算法
- 準(zhǔn)備的條件: Hmac
- 弊端:
- 秘鑰分發(fā)困難
- 使用非對(duì)稱加密
- 不能第三方認(rèn)證
- 不能防止否認(rèn)
- 秘鑰分發(fā)困難
- 是什么?
-
數(shù)字簽名
-
是什么?
- 簽名
- 簽名的人生成非對(duì)稱加密的密鑰對(duì)
- 簽名的人將公鑰進(jìn)行分發(fā)
- 簽名的人將原始數(shù)據(jù)進(jìn)行哈希運(yùn)算 -> 散列值
- 簽名的人使用自己的私鑰對(duì)散列值進(jìn)行非對(duì)稱加密 -> 最終得到的數(shù)據(jù)就是簽名
- 校驗(yàn):
- 接收簽名人的公鑰
- 接收簽名人發(fā)送的數(shù)據(jù)和簽名數(shù)據(jù)
- 對(duì)原始數(shù)據(jù)進(jìn)行哈希運(yùn)算 -> 散列值
- 使用公鑰對(duì)簽名數(shù)據(jù)解密
- 將解密出的數(shù)據(jù)和散列值進(jìn)行比較
- 相等 == 成功
- 不.. == 失敗
- 簽名
-
干什么?
- 保證數(shù)據(jù)的一致性
- 進(jìn)行第三方認(rèn)證
- 可以防止否認(rèn)
-
能解決消息認(rèn)證的弊端嗎?
- 可以
-
怎么進(jìn)行簽名
RSA
-
橢圓曲線簽名 -> ecdsa
- 生成密鑰對(duì), 保存到文件中
- 對(duì)公鑰進(jìn)行分發(fā)
- 簽名的人
- 將私鑰從磁盤讀出
- pem解碼
- x509解碼 -> 私鑰結(jié)構(gòu)體
- 對(duì)原始數(shù)據(jù)進(jìn)行哈希運(yùn)算 -> 散列值
- 簽名
- 驗(yàn)證簽名的人
- 將公鑰從磁盤讀出
- pem解碼
- x509解碼 -> 公鑰
- 生成原始數(shù)據(jù)的散列值
- 簽名認(rèn)證
數(shù)字簽名的缺陷?
- 驗(yàn)證簽名的一方?jīng)]有辦法判斷得到的公鑰到底屬于誰(shuí)
-