HTTPS

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)景

1539265302304.png
  1. <font color="red" size=4>Bob生成密鑰對(duì)</font>
    • 可以將bob看成百度, 提供是web服務(wù)器
    • 生成一個(gè)密鑰對(duì)
      • 公鑰 -> 分發(fā)
      • 私鑰 -> 百度留著
  2. <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ā)送給百度
  3. <font color="red" size=4>認(rèn)證機(jī)構(gòu)Trent用自己的私鑰對(duì)Bob的公鑰施加數(shù)字簽名并生成證書(shū)</font>
  4. <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ù)裝, 或者用戶自己安裝
  5. <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ū)的有效期
  6. <font color="red" size=4>Alice用Bob的公鑰加密消息并發(fā)送給Bob</font>
    • 非對(duì)稱加密
    • 使用公鑰加密 -> 對(duì)稱加密秘鑰分發(fā)
  7. <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ū)了。

  1. 證書(shū)的獲取和身份的認(rèn)證

    客戶端與服務(wù)端需要經(jīng)過(guò)一個(gè)握手的過(guò)程才能完成身份認(rèn)證,建立一個(gè)安全的連接。握手的過(guò)程如下:

    1. 客戶端訪問(wèn)服務(wù)器(比如:https://www.12306.cn),發(fā)送ssl版本、客戶端支持的加密算法等消息。

    2. 服務(wù)器向客戶端發(fā)送ssl版本、加密算法、證書(shū)(證書(shū)出現(xiàn)了)等消息。

    3. 客戶端收到消息后,判斷證書(shū)是否可信, 若可信,則繼續(xù)通信,發(fā)送消息:

      <font color="red">客戶端生成一個(gè)隨機(jī)數(shù),從證書(shū)中獲取服務(wù)器端的公鑰,對(duì)隨機(jī)數(shù)加密;</font>

      隨后信息都將使用雙方協(xié)定的加密方法和密鑰發(fā)送, 客戶端握手結(jié)束。

    4. 服務(wù)器端對(duì)數(shù)據(jù)解密得到隨機(jī)數(shù), 使用協(xié)商好的加密算法和秘鑰進(jìn)行通信

  2. 客戶端如何驗(yàn)證CA證書(shū)是可信任的?

    1. 查看證書(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)為是安全,就像我們相信銀行是安全,所以把錢存入到銀行。

1539272408707.png
  1. 證書(shū)的頒發(fā)機(jī)構(gòu) -> CA

    • 發(fā)布根證書(shū)
    • 中間證書(shū)
    • 個(gè)人
  2. 證書(shū)的信任鏈 -> 證書(shū)簽發(fā)機(jī)構(gòu)的信任鏈

    A是一個(gè)可信賴證書(shū)簽發(fā)機(jī)構(gòu), A信任B, B就有資格去簽發(fā)證書(shū)

    從等級(jí)上A比B高一級(jí)

  1. 有哪些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中心

    沃通 -- www.wosign.com/products/ssl.htm

1.4 公鑰基礎(chǔ)設(shè)施 - PKI

  1. 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)私鑰泄露之后
      • 使用證書(shū)的人 -> 客戶端
        • 接收證書(shū)
        • 驗(yàn)證對(duì)方的身份信息
    • CA認(rèn)證機(jī)構(gòu)
      • 可以生產(chǎn)密鑰對(duì)(可選)
      • 對(duì)公鑰簽名
      • 吊銷證書(shū)
    • 倉(cāng)庫(kù)
      • 存儲(chǔ)證書(shū) -> 公鑰

2. SSL/TLS

1539271432019.png
  • 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ù)主要有:

  1. 認(rèn)證用戶和服務(wù)器,確保數(shù)據(jù)發(fā)送到正確的客戶機(jī)和服務(wù)器;
  2. 加密數(shù)據(jù)以防止數(shù)據(jù)中途被竊?。?/li>
  3. 維護(hù)數(shù)據(jù)的完整性,確保數(shù)據(jù)在傳輸過(guò)程中不被改變。
TIM截圖20190710164800.png
  1. 描述的是客戶端和服務(wù)器剛建立連接之后做的事情

    第一次

    • 客戶端連接服務(wù)器
      • 客戶端使用的ssl版本, 客戶端支持的加密算法
    • 服務(wù)器
      • 先將自己支持ssl版本和客戶端的支持的版本比較
        • 支持的不一樣, 連接斷開(kāi)
        • 支持的一樣, 繼續(xù)
      • 根據(jù)得到的客戶端支持 的加密算法, 找一個(gè)服務(wù)器端也同樣支持算法, 發(fā)送給客戶端
      • 需要發(fā)送服務(wù)器的證書(shū)給客戶端

    第二次:

    客戶端:

    • 接收服務(wù)器的證書(shū)
    • 校驗(yàn)證書(shū)的信息
      • 校驗(yàn)證書(shū)的簽發(fā)機(jī)構(gòu)
      • 證書(shū)的有效期
      • 證書(shū)中支持 的域名和訪問(wèn)的域名是否一致
    • 校驗(yàn)有問(wèn)題, 瀏覽器會(huì)給提示

3. https -> 單向認(rèn)證

https1.png
  1. 服務(wù)器要準(zhǔn)備的
    • 生成密鑰對(duì)
    • 將公鑰發(fā)送給ca, 由ca簽發(fā)證書(shū)
    • 將ca簽發(fā)的證書(shū)和非對(duì)稱加密的私鑰部署到當(dāng)前的web服務(wù)器
  2. 通信流程
    1. 客戶端連接服務(wù)器, 通過(guò)一個(gè)域名
      • 域名和IP地址的關(guān)系
        • 域名要綁定IP地址
          • 一個(gè)域名只能綁定一個(gè)IP地址
        • IP地址需要被域名綁定
          • 一個(gè)IP地址可以被多個(gè)域名綁定
      • 客戶端訪問(wèn)的域名會(huì)別解析成IP地址, 通過(guò)IP地址訪問(wèn)web服務(wù)器
    2. 服務(wù)器收到了客戶端的請(qǐng)求
      • 服務(wù)器將CA簽發(fā)的證書(shū)發(fā)送給瀏覽器(客戶端)
    3. 客戶端拿到了服務(wù)器的公鑰證書(shū)
      • 讀這個(gè)公鑰 證書(shū)
        • 驗(yàn)證域名
        • 有效期
        • ca簽發(fā)機(jī)構(gòu)
        • 服務(wù)器的公鑰
    4. 客戶會(huì)生成一個(gè)隨機(jī)數(shù) (作為對(duì)稱加密的秘鑰來(lái)使用的)
      • 使用服務(wù)器的公鑰就這個(gè)隨機(jī)數(shù)進(jìn)行加密
      • 將這個(gè)加密之后 秘鑰發(fā)送給服務(wù)器
    5. 服務(wù)器對(duì)收到的密文解密
      • 使用服務(wù)器的是要解密, 得到對(duì)稱加密的秘鑰
    6. 數(shù)據(jù)的傳輸
      • 使用對(duì)稱加密的方式對(duì)數(shù)據(jù)進(jìn)行加密

4. 自簽名證書(shū)

  1. 使用openssl生成自簽名證書(shū)

    1. 創(chuàng)建一個(gè)目錄如Mytest, 進(jìn)入該目錄, 在該目錄下打開(kāi)命令行窗口

    2. 啟動(dòng)openssl

      openssl    # 執(zhí)行該命令即可
      
    3. 使用openssl工具生成一個(gè)RSA私鑰, 注意:生成私鑰,需要提供一個(gè)至少4位的密碼。

      genrsa -des3 -out server.key 2048
        - des3: 使用3des對(duì)私鑰進(jìn)行加密
      
    4. 生成CSR(證書(shū)簽名請(qǐng)求)

      req -new -key server.key -out server.csr
      
    5. 刪除私鑰中的密碼, 第一步給私鑰文件設(shè)置密碼是必須要做的, 如果不想要可以刪掉

      rsa -in server.key -out server.key
        -out 參數(shù)后的文件名可以隨意起
      
    6. 生成自簽名證書(shū)

      x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
      

復(fù)習(xí)

  1. 消息認(rèn)證碼

    • 是什么?
      • 散列值
    • 能干什么?
      • 保證數(shù)據(jù)的完整性, 一致性
    • 怎么生成?
      • 準(zhǔn)備的條件: Hmac
        • 原始數(shù)據(jù)
        • 共享秘鑰 -> 認(rèn)證的另一方需要有同樣的秘鑰
        • 哈希算法
    • 弊端:
      • 秘鑰分發(fā)困難
        • 使用非對(duì)稱加密
      • 不能第三方認(rèn)證
      • 不能防止否認(rèn)
  2. 數(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

        1. 生成密鑰對(duì), 保存到文件中
        2. 對(duì)公鑰進(jìn)行分發(fā)
        3. 簽名的人
          • 將私鑰從磁盤讀出
          • pem解碼
          • x509解碼 -> 私鑰結(jié)構(gòu)體
          • 對(duì)原始數(shù)據(jù)進(jìn)行哈希運(yùn)算 -> 散列值
          • 簽名
        4. 驗(yàn)證簽名的人
          • 將公鑰從磁盤讀出
          • pem解碼
          • x509解碼 -> 公鑰
          • 生成原始數(shù)據(jù)的散列值
          • 簽名認(rèn)證

      數(shù)字簽名的缺陷?

      • 驗(yàn)證簽名的一方?jīng)]有辦法判斷得到的公鑰到底屬于誰(shuí)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文地址 http://blog.csdn.net/u012409247/article/details/4985...
    0fbf551ff6fb閱讀 3,692評(píng)論 0 13
  • 其實(shí),我對(duì)https以前只有一個(gè)大概的了解,最近工作中遇到一個(gè)問(wèn)題從而將https協(xié)議做了一個(gè)徹底的學(xué)習(xí)和認(rèn)知,下...
    你飛躍俊杰閱讀 906評(píng)論 0 2
  • 本文摘自 騰訊bugly 的文章《全站 HTTPS 來(lái)了》,內(nèi)容有修改。 大家在使用百度、谷歌或淘寶的時(shí)候,是否注...
    bnotes閱讀 3,876評(píng)論 1 9
  • 其實(shí),我對(duì)https以前只有一個(gè)大概的了解,最近工作中遇到一個(gè)問(wèn)題從而將https協(xié)議做了一個(gè)徹底的學(xué)習(xí)和認(rèn)知,下...
    一條魚(yú)的星辰大海閱讀 3,544評(píng)論 0 1
  • 需求 “人們最初設(shè)計(jì)互聯(lián)網(wǎng)時(shí),很少考慮到安全。這樣的結(jié)果是,核心通信協(xié)議本質(zhì)上是不安全的,只能依靠所有參與方的誠(chéng)信...
    thinkq閱讀 1,148評(píng)論 0 3

友情鏈接更多精彩內(nèi)容