非對稱加密與證書(上篇)

SSL/TLS是一個密碼學協議,它的目標並不只僅是網頁內容的加密傳輸。SSL/TLS的主要目標有四個:加密安全、互操做性、可擴展性和效率。對於安全性的保障,它還會從多個方面進行,包括機密性,真實性以及完整性。機密性是指,傳輸的內容不被除通訊的雙方外的第三方獲取;真實性是指,通訊的對端正是期待的對端,而不是其它第三方冒充的;完整性則是指,傳輸的數據是完整的,數據沒有被篡改或丟失。爲了平衡多種需求,SSL/TLS被設計爲一個安全框架,其中能夠應用多種不一樣的安全方案,每種方案都由多個複雜的密碼學過程組成。不一樣的安全方案,在安全性和效率之間有着不一樣的取捨,並由不一樣的密碼學過程組成。nginx


在密碼學上,非對稱加密具備更高的安全性,同時計算複雜度更高,性能更差;而對稱加密,則效率比較高,計算複雜度較低,但若是在通訊過程當中明文傳輸密鑰,或將密鑰以hard code的形式寫在代碼裏,則安全隱患比較大。git


從密碼學過程的特性出發,總體來看,SSL/TLS鏈接是在會話協商階段,經過 非對稱加密 算法,如RSA、ECDHE等,完成身份驗證,及後續用到的對稱加密密鑰的交換;在整個數據傳輸階段,經過對稱加密算法,如AES、3DES等,對傳輸的數據進行加密;經過數據散列算法,如SHA一、SHA256等,計算數據的散列值並隨應用數據一塊兒發送,以保證數據的完整性。web


本文主要描述非對稱加密的基本思想,及TLS的證書身份認證。算法


非對稱加密


非對稱加密 (asymmetric encryption) 又稱爲公鑰加密 (public key cryptography),是使用兩個密鑰,而不像對稱加密那樣使用一個密鑰的加密方法;其中一個密鑰是私密的,另外一個是公開的。顧名思義,一個密鑰用於非公開的私人的,另外一個密鑰將會被全部人共享。安全


非對稱加密的兩個密鑰之間存在一些特殊的數學關係,使得密鑰具有一些有用的特性。若是利用某人的公鑰加密數據,那麼只有他們對應的私鑰可以解密。從另外一方面講,若是某人用私鑰加密數據,任何人均可以利用對應的公鑰解開消息。 後面這種操做不提供機密性,但能夠用做數字簽名。服務器


非對稱加密保護數據安全


盜用阮一峯老師的幾幅圖來講明,經過非對稱加密保護數據安全的過程。網絡


  • 鮑勃有兩把鑰匙,一把是公鑰,另外一把是私鑰。併發


  • 鮑勃把公鑰送給他的朋友們----帕蒂、道格、蘇珊----每人一把。框架


  • 蘇珊要給鮑勃寫一封不但願別人看到的保密的信。她寫完後用鮑勃的公鑰加密,就能夠達到保密的效果。函數


  • 鮑勃收到信後,用私鑰解密,就能夠看到信件內容。



對於非對稱加密,只要私鑰不泄露,傳輸的數據就是安全的。即便數據被別人獲取,也沒法解密。


非對稱加密的這些特性直擊對稱加密中只用一個密鑰,而該密鑰不方便傳輸、保存的痛點。它大大方便了大規模團體的安全通訊,方便了安全通訊在互聯網中的應用。

非對稱加密生成數字簽名


數據的加密安全只是數據安全的一個方面,數據的真實性一樣很是重要。常常能夠看到這樣的案例,騙子在同窗參加4、六級考試的時候,給同窗的家長打電話或發短信,聲稱本身是學校的輔導員,並表示同窗病重急需用錢,要求家長匯錢,同窗家長匯錢給騙子而遭受巨大損失的狀況。這就是數據/信息真實性沒有獲得足夠驗證而產生的問題。


再好比,一個仿冒的taobao網站,域名與真實的網站很是類似。咱們一不當心輸錯了域名,或域名被劫持而訪問了這個仿冒的網站,而後像日常在taobao購物同樣,選擇寶貝,並付款,但最後卻怎麼也收不到貨物。


現實世界中,經常會請消息的發送者在消息後面簽上本身的名字,或者印章來證實消息的真實可靠性,如信件中的簽名,合同中的印章等等。相似地,在虛擬的網絡世界中,也會經過數字簽名來確認數據的真實可靠性。數字簽名依賴的主要算法也是非對稱加密,生成數字簽名主要是使用私鑰加密 數據的散列摘要 來簽名。


經過幾幅圖來講明這個過程。


  • 鮑勃給蘇珊回信,決定採用"數字簽名"來證實本身的身份,表示本身對信件的內容負責。他寫完後先用散列函數,生成信件的摘要 (digest)。      

                                      


  • 而後,鮑勃使用本身的私鑰,對這個摘要加密,生成"數字簽名"(signature)。


  • 鮑勃將這個簽名,附在信件下面,一塊兒發給蘇珊。


  • 蘇珊收到信後,取下數字簽名,用鮑勃的公鑰解密,獲得信件的摘要。


  • 蘇珊再對信件自己應用散列函數,將獲得的結果,與上一步獲得的摘要進行對比。若是二者一致,則證實這封信確實是鮑勃發出的,信件完整且未被篡改過。

                    


若是鮑勃向蘇珊借了錢,並用上面這樣的過程寫信給蘇珊確認本身收到了錢,那麼鮑勃就不再能抵賴了——信件的末尾但是清清楚楚地簽着鮑勃的大名呢。


若是咱們的網絡世界能像上圖的過程那樣,每一個人均可以方便地得到可靠的公鑰,那就太美好了。互聯網上的網站成千上萬,每一個人都走到本身要訪問的網站站長的辦公室把網站的公鑰拷走,或者網站站長挨個走到本身的目標用戶家門口,把本身網站的公鑰交給用戶,那可就太麻煩,代價太大了。


公鑰一般都是經過網絡傳輸的。不懷好意的人,會試圖干擾這個傳輸過程,將本身僞造的公鑰發送給用戶,進而破壞後續整個數據傳輸的安全性。若是用戶拿到的是僞造的公鑰,那簽名也就形同虛設。


如道格想欺騙蘇珊,他在鮑勃將公鑰交給蘇珊時攔住鮑勃,表示要替鮑勃轉交。正好鮑勃有老闆交待的其它重要事情要完成,因而就把本身的公鑰交給道格請他幫忙轉交。但道格把鮑勃的公鑰丟進垃圾桶,而把本身的公鑰交給了蘇珊。此時,蘇珊實際擁有的是道格的公鑰,但還覺得這是鮑勃的。所以,道格就能夠冒充鮑勃,用本身的私鑰作成"數字簽名",寫信給蘇珊,讓蘇珊用假的鮑勃公鑰進行解密。

證書


證書正是爲了解決公鑰的信任問題而引入。證書體系經過引入可信的第三機構,稱爲 證書籤發機構(certificate authority,簡稱CA),爲公鑰作認證,來確保公鑰的真實可靠。證書是通過了 CA 私鑰簽名的 證書持有者的公鑰、身份信息及其它相關信息 的文件,用戶經過 CA 的公鑰解密獲取證書中包含的 證書持有者 的公鑰。只要 CA 的私鑰保持機密,經過證書驗證 證書持有者 的身份,及獲取公鑰的過程就可靠。


證書的工做過程


互聯網PKI證書體系的結構以下圖:




證書訂閱人 ,也就是須要提供安全服務的人,向 證書中心 (CA) 的代理—— 登記機構 提交本身的公鑰來申請證書。 登記機構證書訂閱人 的身份進行覈實,而後向 證書中心 (CA) 提交 證書訂閱人 的公鑰及身份信息。 證書中心 (CA) 用本身的私鑰,對 證書訂閱人 的公鑰、身份信息和其它一些相關信息進行加密,生成 "數字證書"(Digital Certificate) ,併發送給 登記機構登記機構 將證書發送給 證書訂閱人證書訂閱人 將證書部署在Web服務器上。 信賴方,即安全服務的用戶,維護 CA 根證書庫,並在與Web服務器通訊時,從服務器得到證書。 信賴方 用CA根證書驗證接收到的證書的有效性,進而驗證服務器的真實性。


一樣經過幾幅圖來講明這個過程。


  • 鮑勃去找證書籤發機構,爲公鑰作認證。證書中心用本身的私鑰,對鮑勃的公鑰、身份信息和一些其它相關信息一塊兒加密,生成"數字證書"(Digital Certificate)。


  • 鮑勃拿到數字證書之後,就能夠放心,之後再也沒人能冒充本身了。再須要發送本身的公鑰給朋友們時,只要把本身事先拿到的 數字證書 發送給朋友就能夠了。須要寫信給蘇珊時,照常附上本身的數字簽名便可。


  • 蘇珊收到信後,用CA的公鑰解開數字證書,就能夠拿到鮑勃真實的公鑰,而後就能證實"數字簽名"是否真的是鮑勃籤的。


證書裏有什麼


PKI證書是 抽象語法表示一 (Abstract syntax notation one, ASN.1) 表示, 基本編碼規則 (base encoding rules, BER) 的一個子集 惟一編碼規則 (distinguished encoding rules, DER) 編碼的二進制文件。咱們一般看到的證書則是DER使用Base64編碼後的ASCII編碼格式,即 PEM (Privacy-enhanced mail) 這種更容易發送、複製和粘貼的編碼格式的純文本文件。


證書裏到底都有些什麼呢?這裏咱們經過一個實際的證書來看一下。咱們能夠經過openssl解碼數字證書,得到證書的可讀形式:


$ openssl x509 -in chained.pem -text -nooutCertificate:    Data:        Version: 3 (0x2)
        Serial Number:            03:5c:25:82:1d:c2:b2:2f:6f:73:39:48:9c:68:07:1b:48:2d
    Signature Algorithm: sha256WithRSAEncryption        Issuer: C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3
        Validity
            Not Before: Oct 25 01:12:00 2016 GMT
            Not After : Jan 23 01:12:00 2017 GMT        Subject: CN=www.wolfcstech.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)

Modulus:
                   00:c3:92:70:78:ff:00:0a:22:c7:14:0b:3d:b3:26:
                   34:cb:37:63:26:1d:d6:42:7b:5c:ab:51:cc:f7:12:
                   57:26:b1:d1:4f:5f:a7:02:5b:3c:f3:e6:e1:ec:7c:
                   66:61:ba:d8:5e:d6:61:60:48:d6:d3:4c:23:9a:50:
                   75:4b:2d:1b:89:7d:7b:55:2f:12:63:b4:ac:c7:b5:
                   d1:44:95:ed:a2:f4:9d:ee:77:3c:2b:06:48:d9:18:
                   21:d1:ee:cf:5c:26:ad:c2:11:28:9c:27:65:11:94:
                   c4:1d:0f:5e:4c:4f:00:71:cf:5d:1f:40:4b:9a:5e:
                   3b:b0:42:45:c5:68:01:62:29:c2:92:b5:ad:8d:13:
                   11:db:7e:02:65:14:6a:5d:4b:66:16:08:d4:ab:90:
                   dc:06:28:27:cd:84:c0:b7:30:22:ff:54:71:c2:3b:
                   8d:7d:8b:52:c3:a8:f1:ee:63:42:2a:dd:4d:a7:70:
                   66:c5:c3:54:d5:8e:a1:e2:02:d0:8b:2f:f6:44:1d:
                   f5:f2:85:fd:49:c7:e0:d7:d0:ae:21:b7:25:ae:7c:
                   15:dc:56:51:45:f1:e7:19:d6:1c:95:2c:65:f7:34:
                   2c:67:1c:93:00:81:a7:e2:23:da:1a:3c:d1:9f:84:
                   5e:01:3f:71:e7:9c:cd:e0:4f:fc:db:a6:2f:33:3a:
                   3d:ce:6d:52:72:47:0b:08:9c:04:1f:4a:cd:cd:71:
                   db:c2:3f:0d:9c:b4:24:ca:25:06:49:2b:40:a7:96:
                   b6:60:b7:8d:c7:b0:b4:84:96:06:63:3b:d9:0c:25:
                   8d:af:ad:90:ce:b8:d5:c6:e6:28:28:bd:4b:72:92:
                   28:1a:0a:b7:15:3c:28:26:15:ab:fc:88:22:74:50:
                   77:cc:3d:a3:c8:be:83:14:3d:ca:0e:79:aa:71:66:
                   56:b8:6f:fe:2a:2d:36:ff:0c:af:b9:61:5c:5b:5f:
                   a4:cc:0a:5b:13:31:c9:16:3f:51:9c:19:56:dd:06:
                   1d:c9:6f:f6:17:61:61:7b:4c:cb:aa:b9:92:52:25:
                   9b:8f:02:2d:51:39:5f:f0:89:e2:e8:25:6f:04:2a:
                   d3:6f:a3:3e:a7:44:a8:a1:db:01:55:ad:1d:3f:72:
                   3a:9a:b7:0f:35:a3:de:d2:93:d7:7c:d6:12:66:b2:
                   f9:da:c4:e3:e6:52:6f:55:07:5c:a2:57:0d:7a:ca:
                   20:5a:59:1b:78:ba:cf:e2:1d:b3:33:0a:53:2e:26:
                   9f:39:2f:ec:48:8b:9f:a0:b9:e8:e6:61:9b:89:34:
                   59:02:07:bb:b4:c4:8d:1d:24:72:ea:1e:7c:5f:a9:
                   a3:96:15:e9:4d:7e:4c:94:eb:cb:af:d2:70:83:78:
                   be:36:eb
               Exponent: 65537 (0x10001)
       X509v3 extensions:
           X509v3 Key Usage: critical
               Digital Signature, Key Encipherment
           X509v3 Extended Key Usage:
               TLS Web Server Authentication, TLS Web Client Authentication
           X509v3 Basic Constraints: critical
               CA:FALSE
           X509v3 Subject Key Identifier:
               B8:27:0E:D4:47:BB:27:66:51:3B:E7:F9:8B:9C:48:2E:3D:FD:C8:97
           X509v3 Authority Key Identifier:
               keyid:A8:4A:6A:63:04:7D:DD:BA:E6:D1:39:B7:A6:45:65:EF:F3:A8:EC:A1

           Authority Information Access:
               OCSP - URI:http://ocsp.int-x3.letsencrypt.org/
               CA Issuers - URI:http://cert.int-x3.letsencrypt.org/

           X509v3 Subject Alternative Name:
               DNS:wolfcstech.cn, DNS:wolfcstech.com, DNS:www.wolfcstech.cn, DNS:www.wolfcstech.com
           X509v3 Certificate Policies:
               Policy: 2.23.140.1.2.1
               Policy: 1.3.6.1.4.1.44947.1.1.1
                 CPS: http://cps.letsencrypt.org
                 User Notice:
                   Explicit Text: This Certificate may only be relied upon by Relying Parties and only in accordance with the Certificate Policy found at https://letsencrypt.org/repository/

   Signature Algorithm: sha256WithRSAEncryption
        46:a1:fb:1c:fe:6e:ef:af:fc:84:e3:7e:20:1d:c8:0c:0b:e4:
        d2:4b:9e:f6:bc:e5:31:59:08:bb:7e:0d:74:3f:e6:de:39:58:
        e2:f4:fa:bf:5c:26:86:96:19:8f:00:13:17:2b:4f:95:c4:bd:
        02:ad:cd:a6:e5:80:21:f5:ee:e6:4d:01:86:07:82:37:5e:39:
        c9:55:40:ed:08:2e:8d:94:b8:86:2f:15:76:10:bd:97:46:06:
        b3:34:80:12:f4:dc:2a:2a:63:80:36:fe:ef:e1:9e:b6:dc:22:
        51:c7:54:46:1a:b2:c5:e8:62:98:90:46:ea:92:8c:fd:d4:dd:
        00:4f:fb:1e:25:24:93:c1:74:15:07:6f:67:d3:be:5b:47:7e:
        18:56:02:01:55:09:fc:bf:7f:ff:27:fc:db:d8:53:55:02:43:
        2e:a0:23:28:01:4d:4d:f9:bc:02:bc:fe:50:c2:67:d7:d4:48:
        23:c2:0b:25:d4:65:e1:8f:3c:75:12:b6:87:b1:17:86:c8:1a:
        26:72:0e:ba:07:92:c4:87:3e:e1:fc:e3:58:ef:a2:23:43:09:
        85:c4:82:00:04:07:49:06:10:bc:fd:20:67:0f:63:f8:ff:bf:
        7f:6f:da:72:77:51:1d:50:34:07:63:e8:68:e3:ef:70:5f:71:
        b4:11:9e:27

   

能夠看到主要包含證書格式的版本號;證書的惟一的序列號;簽名算法;頒發者的信息;證書的有效期;證書的使用者的信息、身份信息,在這裏主要是幾個域名;證書使用者的公鑰等等。


Let's Encrypt證書申請


咱們經過一個 Let's Encrypt 證書申請過程對證書作更多瞭解。 Let's Encrypt 是一個免費、自動化、開放的證書籤發機構,目前它已獲得了Mozilla,Chrome等的支持,發展十分迅猛。


證書申請


Let’s Encrypt 使用ACME協議驗證申請人對域名的控制並簽發證書。要獲取Let’s Encrypt 證書,需使用ACME客戶端進行。Let’s Encrypt 官方推薦 使用Certbot這個功能強大,靈活方便的工具,不過也可使用其它的ACME客戶端


這裏咱們經過Certbot申請Let’s Encrypt證書。


Certbot安裝


對於在Ubuntu 14.04平臺上部署nginx提供Web服務的狀況,應該使用 certbot-auto 來安裝:


$ wget https://dl.eff.org/certbot-auto$ chmod a+x certbot-auto

certbot-auto 接收與 certbot 徹底相同的標記;不帶參數執行這個命令時,會自動安裝依賴的全部東西,並更新工具自己。執行以下命令:


$ ./certbot-auto



相關閱讀:非對稱加密與證書(下篇)

網易雲SSL證書服務提供雲上證書一站式生命週期管理,與全球頂級的數字證書受權機構(CA,Certificate Authority)和代理商合做,爲你的網站與移動應用實現 HTTPS 加密部署。

網易雲新用戶大禮包:https://www.163yun.com/gift

本文來自網易實踐者社區,經做者韓鵬飛受權發佈。

相關文章
相關標籤/搜索