https實戰之數字證書
https數字證書
如何申請Let"s Encrypt上的免費證書
https單向認證和雙向認證
SpringBoot+CXF整合開發基於https的webservice服務
一、https的幾個基本概念
1、什麼是https
大家都知道http時明文傳輸的,傳輸過程中內容很容易被篡改。一個活生生的例子是,你在手機瀏覽器上訪問一個網站,有時網頁的頂部或底部會出現移動聯通等運營商的廣告,這種廣告就是電信運營商篡改了網站發給的網頁導致的。而https是在http與TCP/IP之間加入了一個安全傳輸協議SSL/TLS,傳輸的內容是加密過的。
2、SSL與TLS
SSL(Secure Sockets Layer安全套接層)與TLS(Transport Layer Security安全傳輸層),兩個都是安全傳輸協議,TLS可以理解為SSL的升級版。
3、對稱加密與非對稱加密
對稱加密:加密解密使用相同的密碼。常見的有:AES、DES、3DES、RC5。
非對稱加密:加密解密使用兩個不同的密碼,叫做公鑰密碼和私鑰密碼,簡稱公鑰和私鑰。公鑰,顧名思義,公開的密鑰,可以將它交給一個或多個用戶;而私鑰則要自己保存,不公開給任何用戶。實際應用時,公鑰加密私鑰解密,私鑰簽名公鑰驗簽。
4、數字簽名與簽名驗簽
一種保護文件或消息在發送傳輸過程不被篡改的方式。
處理過程:用戶A發消息給B,發送前,A通過使用非對稱加密演算法的私鑰對原消息進行加密得到簽名消息,發送時A將原消息和簽名消息一起發給B;用戶B收到後,會進行驗簽。具體做法是,使用公鑰對簽名消息進行解密,將解密結果與原消息比對,確認是否一致。若不一致說明消息被他人篡改。簡單而言就是使用私鑰加密,公鑰解密,但有一點,用戶B收到的消息是沒有加密的,B可以不進行驗證。
5、哈希演算法
簡單理解就是將一個比較長的數據映射成一個短的固定長度的字元串,並且做到無法逆向得到原數據。得到的這個短的字元串可以認為是原數據的指紋,原數據變化了,指紋也會變。前面說了,在https中,是用非對稱密碼對消息進行加解密的,但它有個限制不能加密太長的消息,這個時候就要藉助哈希演算法把安全地消息縮短。常見的哈希演算法有:MD5、SHA-1、SHA-2
二、數字證書與證書認證
非對稱密碼中有一對匹配的公鑰和私鑰,而我們平常說的證書就是指包含了公鑰信息的文件,裡面是不包含私鑰的。
證書可以認為是一個網站或伺服器的身份名片,這個名片大家都可以用工具製作,它有兩個作用,一個是用來保證網站與用戶之間的通信是安全的,另一個就是對外聲明自己的網站是安全的。那問題來了,不能你說你的網站是安全的就真的安全,誰知道是真是假,這時,你就需要找一個大家都相信的權威的機構或組織,在你的證書上簽名,由機構為你背書。機構會審核你的認證資料,如果沒問題,就會在你的證書上簽名。這個證明過程叫證書的認證。證書認證過程有幾個概念:
1、自簽名證書:用戶自己通過工具生成的證書,比如openssl、keytool都可以生成一個證書。生成證書文件的同時,會生成一個對應的私鑰文件。
2、CA與CA證書:CA(Certificate Authority)指的就是大家都相信的權威證書認證機構。它手上的證書就叫CA證書,也叫CA根證書。CA在認證通過你的證書後,會生成一個新的證書文件,裡面包含了你的證書、CA私鑰生成的簽名、CA的證書。附上CA的證書目的是為了大家驗證你的證書是不是真實的。CA的證書是公開的,不附上大家也可以查詢到。
3、二級證書:CA認證時,使用私鑰生成簽名的,但是經常用私鑰簽名就可能存在被盜的風險,大家想像一下,如果黑客拿到了CA的私鑰,就能冒用CA的身份會簽出不安全的證書或發起不安全的請求,出現被盜會導致整個CA簽發的證書全部不可信,這個CA的信用體系崩潰。所以,CA會將私鑰嚴密保存起來,同時它會用私鑰簽署授權幾個二級機構,由二級機構去完成用戶認證的動作。這樣簽出來的證書上會有CA機構的根證書、二級機構的證書、及用戶自己的證書,形成一個證書鏈。比如,我們在瀏覽器上進入百度首頁,在地址上會看到綠色的鎖,點擊這個鎖,可以看到它的證書鏈:
4、CSR(Certificate Signing Request)證書請求文件:用戶在向機構提交證書認證申請時,不是直接把證書提交過去,而且要提交生成一個由證書和其他信息組成的CSR文件。
三、各種證書格式
證書相關的文件格式有很多,你可能見過的有CER、CRT、PEM、JKS、KDB、CSR...要搞清楚這些格式的關係,先需要知道兩個重要的標準X.509和PCKS。
X.509是一個最基本的公鑰格式標準,裡面規定了證書需要包含的各種信息。通常我們提到的證書,都是這個格式的,裡面包含了公鑰、發布者的數字簽名、有效期等內容。要強調的是,它只裡面是不包含私鑰的。相關的格式有:DER、PEM、CER、CRT。
PCKS是一組公鑰標準,它是從公鑰密碼學不同方面規定的15個標準,分別是PKCS#1、PKCS#2...PKCS#15(好隨便的名字)。但注意雖然字面上它是公鑰的標準,它也包含了私鑰的內容。其中有兩個會經常看到,分別是PKCS#7和PKCS#12。
PKCS#7規定了消息加密的機制。它將證書分成兩個文件,公鑰和私鑰。有PEM和DER兩種編碼方式,其中比較常見的是PEM,它是ASCII(Base64)編碼的純文本格式。DER是二級制格式的。PKCS#7的常見後綴有PEM、DER、CRT、CER、P7B、SPC/PVK。PEM、DER後綴就表示文件的編碼格式。CRT、CER這兩種文件是不包含私鑰的,編碼格式可以是文本格式的PEM或二進位的DER,相同編碼的情況下相互轉換直接改後綴即可,windows支持這兩種證書格式文件,可以直接雙擊打開查看證書信息。P7B文件裡面保護了一個樹狀結構的證書鏈,包含了一個或多個證書,不含私鑰。SPC/PVK是微軟特有的證書格式,其中SPC保存公鑰,PVC保存私鑰。
PKCS#12規定了如何保證證書文件的分發,它規定了一個密鑰庫,裡面打包了私鑰和公鑰,同時有密碼保護,這樣可以防止在發給其他人時裡面的密鑰或證書被竊取或篡改。文件後綴一般是:P12、PFX(這兩個後綴沒有區別)。與這個類似的有JKS、JCEKS、BKS、BUER,他們的區別是:
1、JKS(Java KeyStore)是Java專用的密鑰庫,實現者是SUN,用keytool製作。後綴:jks、keystore
2、JCEKS(JCE keystore)也是和Java專用的密鑰庫,比JKS更安全,實現者是SUN JCE,後綴:jks、keystore
3、BKS(Bouncycastle Keystore)Java和C#都可以操作的密鑰庫,實現者Bouncycastle,它能有效防止密鑰庫被修改。後綴:bks
4、BUER(Bouncycastle UBER Keystore)BKS的更安全版,實現者也是Bouncycastle,後綴:ubr
5、PKCS#12是一個密鑰庫標準。它與上面幾個不是實現關係。實現工具是openssl,注意,keytool可以創建PCCS#12的文件,但是不能修改裡面的密鑰或證書文件。
X.509、PKCS#7、PKCS#12三者的關係,簡單理解就是,X.509規定了公鑰的格式即什麼是公鑰,PCKS#7規定了保存X.509格式的公鑰的文件格式,同時還規定了私鑰的文件格式。PCKS#12則類似一個加了密碼的壓縮包,將多個PCK#7規定格式的文件打包起來。加密碼打包的目的主要為了能保證地發給其他用戶,防止被竊取裡面的私鑰和證書文件。
TAG:coding濤 |