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 是一個免費、自動化、開放的證書籤發機構,目前它已獲得了Mozilla,Chrome等的支持,發展十分迅猛。
Let’s Encrypt 使用ACME協議驗證申請人對域名的控制並簽發證書。要獲取Let’s Encrypt 證書,需使用ACME客戶端進行。Let’s Encrypt 官方推薦 使用Certbot這個功能強大,靈活方便的工具,不過也可使用其它的ACME客戶端。
這裏咱們經過Certbot申請Let’s Encrypt證書。
對於在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
本文來自網易實踐者社區,經做者韓鵬飛受權發佈。