們生活在一個信息大爆炸的時代,幾乎每天都在和互聯(lián)網(wǎng)打交道,購物、網(wǎng)銀轉(zhuǎn)賬、支付寶付款、搜索信息、查看郵件、觀看視頻、微信聊天、上網(wǎng)沖浪、閱讀新聞等,無不時時刻刻在和網(wǎng)絡(luò)打交道。那如何保護(hù)網(wǎng)絡(luò)安全就相當(dāng)重要了,其方法有很多,其中應(yīng)用最為廣泛的就是使用 SSL 來保護(hù) C/S 或者 B/S 的通信安全。
SSL 能夠幫助系統(tǒng)在客戶端和服務(wù)器之間建立一條安全通信通道。SSL 安全協(xié)議是由 Netscape Communication 公司在 1994 年設(shè)計開發(fā),SSL 依賴于加密算法、極難竊聽、有較高的安全性,因此 SSL 協(xié)議已經(jīng)成為網(wǎng)絡(luò)上最常用的安全保密通信協(xié)議,該安全協(xié)議主要用來提供對用戶和服務(wù)器的認(rèn)證;對傳送的數(shù)據(jù)進(jìn)行加密和隱藏;確保數(shù)據(jù)在傳送中不被改變,即數(shù)據(jù)的完整性,現(xiàn)已成為該領(lǐng)域中全球化的標(biāo)準(zhǔn)。
很多時候,我們并不知道如何管理和配置 SSL 證書。本課程作者將用實際的例子,手把手一步一步教大家如何使用工具生成、管理、配置 SSL 證書,該課程是一系列基礎(chǔ)教程,涉及面廣,先以一個 Tomcat 的 SSL 的配置實戰(zhàn)為例子,然后一步步分享 SSL 的基礎(chǔ)必備知識和管理工具。
認(rèn)真學(xué)完這個系列內(nèi)容,并按照提供的例子進(jìn)行實戰(zhàn),將會深入理解 SSL 的概念、目的、證書的申請、管理、配置,基本上覆蓋行業(yè)的大部分典型的應(yīng)用場景,從而可以輕松超越 80% 的人,快速成為一個配置、管理、創(chuàng)建 SSL 證書的高手。
注意: 為了描述和表達(dá)方便,本達(dá)人課內(nèi)容把 SSL 和 TLS 作為一個整體(SSL/TLS)來對待,沿用了大家熟悉的稱呼 SSL。所有后面提到的有關(guān) SSL 的關(guān)鍵字,其實指的都是 SSL 和 TLS。
朱清云,架構(gòu)師、CSDN 博客專家,從事架構(gòu)設(shè)計 8 年有余,曾先后就職于世界 500 強(qiáng)國企和美資外企。目前感興趣的研究方向:企業(yè)應(yīng)用集成、物聯(lián)網(wǎng)、區(qū)塊鏈、DevOps 自動化運維、大數(shù)據(jù)及人工智能。即將出版《MQTT 權(quán)威指南》一書,希望通過這個平臺認(rèn)識更多的朋友。
我們生活在一個信息大爆炸的時代,幾乎每天都在和互聯(lián)網(wǎng)打交道,購物、網(wǎng)銀轉(zhuǎn)賬、支付寶付款、搜索信息、查看郵件、觀看視頻、微信聊天、上網(wǎng)沖浪、閱讀新聞,無不時時刻刻在和網(wǎng)絡(luò)打交道。如果說互聯(lián)網(wǎng)是一個江湖,江湖險惡,江湖人心難測,難免有一些不懷好意的人對你的個人信息感興趣,比如信用卡信息、身份證信息、網(wǎng)銀的賬號密碼、特殊癖好等,那么如何保障當(dāng)私人的隱秘信息從電腦手機(jī)上發(fā)送到遠(yuǎn)端的服務(wù)器上的時候,能把我們的隱私數(shù)據(jù)加密起來,即使別人得到了加密的數(shù)據(jù),也很難解開,相當(dāng)于給我們的信息加上了一把鎖,方法有很多,但是目前流行和使用最廣的技術(shù)手段就是 SSL(Security Socket Layer,安全套接層協(xié)議)。
enter image description here
SSL(Secure Socket Layer)翻譯成中文就是“安全套接層”,SSL 能夠幫助系統(tǒng)在客戶端和服務(wù)器之間建立一條安全通信通道。SSL 安全協(xié)議是由 Netscape Communication 公司在 1994 年設(shè)計開發(fā),SSL 依賴于加密算法(在后面的章節(jié)中會提到)、極難竊聽、有較高的安全性,因此 SSL 協(xié)議已經(jīng)成為網(wǎng)絡(luò)上最常用的安全保密通信協(xié)議,該安全協(xié)議主要用來提供對用戶和服務(wù)器的認(rèn)證;對傳送的數(shù)據(jù)進(jìn)行加密和隱藏;確保數(shù)據(jù)在傳送中不被改變,即數(shù)據(jù)的完整性,現(xiàn)已成為該領(lǐng)域中全球化的標(biāo)準(zhǔn)。
舉一個日常生活中的簡單例子,當(dāng)我們用電腦打開一些常用的網(wǎng)站時,比如京東、淘寶、百度等,如果心細(xì)的讀者會發(fā)現(xiàn),不管是用微軟的瀏覽器,還是谷歌瀏覽器,其瀏覽器的地址欄上方有一把鎖,這把鎖其實代表的就是 SSL 協(xié)議,是 SSL 在 HTTP 協(xié)議上的應(yīng)用,用鎖鎖住我們的私密信息,防止私密信息在訪問網(wǎng)站的過程中被第三方程序或者不懷好意的人監(jiān)聽到,如果沒有這把保護(hù)我們通信安全的 SSL 鎖的話,我們的信息則非常容易被第三方監(jiān)聽到。
enter image description here
君不見微信的小程序,服務(wù)器的 API 訪問必須是支持 SSL 的 HTTPS 協(xié)議;谷歌也宣布對其所有的網(wǎng)站支持 HTTPS(Http Over SSL)協(xié)議;通過激活 SSL 協(xié)議,實現(xiàn)數(shù)據(jù)信息在客戶端和服務(wù)器之間的加密傳輸,可以防止數(shù)據(jù)信息的泄露,保證了雙方傳遞信息的安全性,而且用戶可以通過服務(wù)器證書驗證他所訪問的網(wǎng)站是否是真實可靠。
值的一提的是,SSL 有很多的版本,SSL 于 1995 年發(fā)布了 3.0 的版本,但是后來,在 1999 年,IEFT(The Internet Engineering Task Force,互聯(lián)網(wǎng)工程任務(wù)組)在 SSL 3.0 的基礎(chǔ)上發(fā)布了 TLS 1.0(Transport Layer Security,安全套接層)協(xié)議,其標(biāo)準(zhǔn)名稱編號為 RFC 2246,實際上相當(dāng)于 SSL 3.1。
2006 年 TLS 1.1 以標(biāo)準(zhǔn)編號為 RFC 4346 形式發(fā)布,該版本增加了對 CBC 攻擊的對策并把 AES 加入對稱密碼算法集中,進(jìn)一步增強(qiáng)了其安全性,此外在 TLS 1.1 中把 AES 也加入到對稱加密算法中。
2008 年 TLS 1.2 以標(biāo)準(zhǔn)標(biāo)號為 RFC 5246 形式發(fā)布,該版本主要的變更就是:偽隨機(jī)函數(shù)(PRF)中的 MD5-SHA-1 組合被 SHA-256 取代,可以使用密碼套件指定的 PRF。
目前所有的正在使用的 SSL/TLS 的版本信息如下:
值得一提的是 TLS 1.3 將在今年,也就是2018年3月21日已經(jīng)被批準(zhǔn)成為正式的 TLS 標(biāo)準(zhǔn)。
在本達(dá)人課后面的課程里,會有章節(jié)來分享如何讓你知道在和服務(wù)器進(jìn)行 SSL 通信時,SSL 的具體版本到底是什么?敬請期待。
注意: 為了描述和表達(dá)方便,本達(dá)人課內(nèi)容把 SSL 和 TLS 作為一個整體(SSL/TLS)來對待,沿用了大家熟悉的稱呼 SSL。所有后面提到的有關(guān) SSL 的關(guān)鍵字,其實指的都是 SSL 和 TLS。
下面通過一個實際的實驗,給大家分享一下,為什么 SSL 能夠保護(hù)我們在通信過程中的安全,為了簡單起見,咱們以 SSL 應(yīng)用于 HTTP 協(xié)議為例,通過快速搭建一個簡單的 Web 服務(wù)器,來觀察在使用 SSL 和不使用 SSL 時,我們的數(shù)據(jù)是如何傳輸?shù)摹?/p>
讀者可以先到 Tomcat 的網(wǎng)站下載一個 Window 的安裝包,下載完成后,解壓縮到指定的文件夾下, 比如,D:\apache-tomcat-9.0.1,然后在 D:\apache-tomcat-9.0.1\webapps\examples\ 目錄下加入一個 ssldemo.html 的文件,其內(nèi)容如下:
然后啟動 Tomcat 9,在打開瀏覽器之前,請先下載一個名字叫 Fiddler 的軟件,百度百科對 Fiddler 的介紹如下:
Fiddler 是一個 HTTP 協(xié)議調(diào)試代理工具,它能夠記錄并檢查所有你的電腦和互聯(lián)網(wǎng)之間的 HTTP 通訊,設(shè)置斷點,查看所有的“進(jìn)出” Fiddler 的數(shù)據(jù)(指 Cookie、HTML、JS、CSS 等文件,這些都可以讓你胡亂修改的意思)。Fiddler 要比其他的網(wǎng)絡(luò)調(diào)試器要更加簡單,因為它不僅僅暴露 HTTP 通訊還提供了一個用戶友好的格式。
我們可以單擊這里,下載免費的工具并安裝。
假設(shè)已經(jīng)安裝并打開了 Fiddler,在瀏覽器中輸入下面的地址,將看到下面的內(nèi)容:http://localhost:8080/examples/ssldemo.html:
enter image description here
這個時候 Fiddler 監(jiān)測到的內(nèi)容如下:
enter image description here
根據(jù) Fiddler 截獲的信息,我們知道在客戶端和服務(wù)器傳輸?shù)男畔⑼耆敲魑?,如果有不懷好意的人或者黑客,截取了瀏覽器和這個站點之間的所有 HTTP 請求的話,其上面?zhèn)鬏數(shù)男畔?,所見即所得,被一覽無余。在瀏覽器和 Web 服務(wù)器之間,如果傳輸只是一般的文本信息,比如 CSDN 的博客等,問題也不大。但是如果傳輸?shù)氖倾y行賬號和密碼呢?如果傳輸?shù)氖巧矸葑C信息或者信用卡信息呢?如果沒有一種很好的機(jī)制去保護(hù)的話,如果被監(jiān)聽到了,后果將是災(zāi)難性的,那如何破這個局呢?其中一種很常見的方式,就是搭建一個基于 SSL 的 Web 服務(wù)器,讓所有的信息通過 HTTPS 協(xié)議來傳輸。
下面筆者來配置一下 Tomcat 服務(wù)器,讓其來支持 HTTPS,下面列出了其具體步驟。
1.創(chuàng)建一個 SSL 的證書
假設(shè)我們機(jī)器上已經(jīng)安裝了 JDK 并配置了 Java Home,然后打開命令行,確保 keytool 命令能用,如果不用請到 JDK 的安裝目錄下 bin 子目錄尋找,在命令行中輸入下面的命令:
然后按照提示,輸入 first name and last name 等相關(guān)信息,這樣就會生成一個證書對并存儲到 tomcat.jks 文件中,另外在生成 tomcat.jks 文件的時候,其會讓我們提示輸入密碼,假設(shè)輸入的密碼是:changeit。
2.保存好 JKS 文件
把 tomcat.jks 復(fù)制到 Tomcat 的安裝目錄下,筆者的安裝目錄是:D:\apache-tomcat-9.0.1,所以這里將其復(fù)制到 D:\apache-tomcat-9.0.1\conf\tomcat.jks,當(dāng)然也可以不用復(fù)制,但是需要知道 tomcat.jks 文件的全路徑,因為這個路徑在后面需要用到。
3.配置 Tomcat 的 Server.xml 文件
在 Tomcat 的安裝目錄下打開 server.xml 文件,筆者的電腦上是,D:\apache-tomcat-9.0.1\conf\server.xml 文件,然后編輯這個文件,把已有的 8080 端口的 Connector 注釋起來,然后加入下面新的 8443 端口的 Connector。
enter image description here
文本形式的配置如下:
4.重啟啟動 Tomcat 服務(wù)器
在瀏覽器輸入 https://localhost:8443/examples/ssldemo.html 網(wǎng)址,此時,我們發(fā)現(xiàn)其走的 HTTPS 協(xié)議,也就是用 SSL 保護(hù)了的 HTTP 協(xié)議,這個時候再回頭來看 Fiddler 監(jiān)聽的信息的結(jié)果。
enter image description here
從上面的結(jié)果來看,我們的 Fiddler 監(jiān)聽到的已經(jīng)是加過密的信息,看了這些信息,壓根就不知道 Web 服務(wù)器向瀏覽器傳輸了什么信息,因為其是密文的,只有知道其秘鑰的工具才能把其破解成明文,這樣媽媽再也不同擔(dān)心我們在網(wǎng)上傳輸個人的信息了。
在進(jìn)行 SSL 實戰(zhàn)之旅開始時,這里有必要給大家普及一些和 SSL 相關(guān)的核心概念,這樣大家在閱讀后面的文章時,如果遇到這些基本核心概念的時候,能夠明白說的是什么;若已經(jīng)對下面的這些核心概念已了解甚至精通了,可以跳過本節(jié)內(nèi)容,直接進(jìn)入后面的章節(jié)內(nèi)容。
大家都有過出門住酒店或者買火車票飛機(jī)票的經(jīng)歷,當(dāng)我們買飛機(jī)票和火車票的時候,取票點會讓我們出示身份證證件,通過身份證就能證明我們的身份,因為身份證是有受信任的公安機(jī)關(guān)頒發(fā)的。同樣的道理,當(dāng)客戶端連接到 SSL 服務(wù)器的時候,其也要 SSL 服務(wù)器告訴客戶端一個類似于身份證的憑證文件,這個憑證就是 SSL 的證書。身份證上面有持有人的姓名、戶口地址、唯一的身份證 ID、頒發(fā)的公安局機(jī)關(guān)、身份的有效日期;類似的,SSL 證書里面也有類似的信息,比如當(dāng)前證書的通用名字(Common Name)、國家城市省份組織信息、聯(lián)系人的郵箱、證書的指紋、頒發(fā)機(jī)構(gòu)。下面以實際例子說明一下, 打開百度的網(wǎng)站,找到地址欄上面的鎖,點擊鎖,在彈出的窗體中點擊查看證書(View Certificates),其會彈出一個 SSL 證書,如下圖所示意。
enter image description here
(1)先點擊通用(General)頁面,在通用(General)頁面會顯示其證書的名字,證書的頒發(fā)機(jī)構(gòu)(也就是后面即將要解釋的 CA),以及證書的有效日期。
enter image description here
(2)然后點擊詳細(xì)(Detail)頁面,其列出了當(dāng)前 SSL 證書的主要信息。
類似于身份證的名字、戶口地址信息.
enter image description here
SSL 證書的指紋類似于身份證的 ID,其本質(zhì)就是 SSL 證書內(nèi)容的一個信息摘要(Message Digist)。
enter image description here
SSL 證書的頒發(fā)者(Issuer)類似于身份證里面的頒發(fā)身份證的公安局信息。
enter image description here
enter image description here
在 SSL 證書的詳情(Detail)頁面還有其他的信息、簽名的算法、簽名的哈希算法、指紋算法、有效日期范圍等等,感興趣的讀者可以自行找一個證書點擊理解,如果有任何問題,可以在我的讀者圈留言。
(3)最后點擊證書路徑(Certification Path),我們會看到百度網(wǎng)站證書,總共有三個層級,這個就是證書的路徑,其表明了頒發(fā)的歸屬關(guān)系。
還是拿身份證為例子,比如,一個北京海淀區(qū)居民的身份證,其頒發(fā)機(jī)構(gòu)是北京市海淀區(qū)公安分局頒發(fā)的,那北京海淀區(qū)公安分局頒發(fā)是誰授權(quán)其頒發(fā)身份證的權(quán)利的? 當(dāng)然是其上級單位,比如北京市公安局,而北京市公安局又是中國公安部最終給授權(quán)的,也就是根授權(quán)。
現(xiàn)在拿我們的百度證書路徑顯示的信息來進(jìn)行類比,baidu.com 這張證書是 Symantec Class 3 Secure Server CA -G4 這個中級證書授權(quán)的,這個中級證書就相當(dāng)于北京海定區(qū)公安分局或者北京市公安局,而 Symantec Class 3 Secure Server CA -G4 這個證書還沒有到頂,其又是 Versign 授權(quán)的,但是 Versign 到頂了,這個 Versign 就相當(dāng)于中國公安部,其本質(zhì)就是一個層級的授權(quán)結(jié)構(gòu)。
enter image description here
對稱加密算法(Symmetric Encryption)是一種計算機(jī)加密技術(shù),使用加密密鑰來偽裝信息,它的數(shù)據(jù)轉(zhuǎn)換使用了一個數(shù)學(xué)算法和一個私有密鑰,這導(dǎo)致無法從加密后的消息中推出原始消息。對稱加密是一種雙向算法,只要有相同的私鑰,通過數(shù)學(xué)算法就能把以前用一把私鑰加密的信息還原成最初的原始信息,對稱加密算法的最大特點就是加密數(shù)據(jù)和解密數(shù)據(jù)使用的是同一個秘鑰。
舉個簡單的例子,大家都喜歡看諜戰(zhàn)劇,諜戰(zhàn)劇里面經(jīng)常會看到某一方截獲了另外一方的密電,這個密電就是經(jīng)過某一種方式加密過后的信息,那為什么要加密呢?因為電波是朝四面八方擴(kuò)散的,只要能夠接收電波,就能把電波里面附帶的信息記錄下來,如果不加密,特別是軍事情報,那豈不是太容易被截取并泄密了嗎?所以需要加密。加密的方式有多種多樣,舉個最簡單的加密方式,比如如果準(zhǔn)備用英文單詞寫電報的話,就按照字母表的順序混淆一下,比如把 a 替換成 d,b 替換成 e,c 替換成 f 等,總之就是把當(dāng)前的字母替換為后面第三位的字母,這種替換規(guī)則就是一個秘鑰。當(dāng)接受方接收到這個信息的時候,因為預(yù)先知道這個秘鑰,所以,接到密文后,反向替換即可,即把密文中的 d,還原成 a,e 還原成 b,f 還原成 c。因為加密解密用的同一份秘鑰,加密和解密通過秘鑰是完全對稱的,所以叫做對稱加密。
目前比較通用和常見的對稱加密算法主要有下面的種類:
千言萬語抵不過一幅圖,下面是筆者從網(wǎng)上找了張經(jīng)典的圖,大家一看圖就應(yīng)該明白了什么是對稱加密算法。
enter image description here
既然對稱加密算法這么強(qiáng)大,那為什么還要使用非對稱加密算法呢?那什么又是非對稱加密算法呢?
因為對稱加密算法有一個最不安全的地方,就是秘鑰的分發(fā);如何保證秘鑰能從 A 處共享給 B 的時候,特別是在復(fù)雜和萬能的互聯(lián)網(wǎng)上,如何保證在交換秘鑰的時候不被竊聽到?因為對于對稱加密算法,只要秘鑰被竊聽到了,其被這個秘鑰加密的任何密文幾乎不費吹灰之力就被破解出來了,那如何避免這種風(fēng)險呢?這個時候非對稱加密算法就粉墨登場了。
非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey),公開密鑰與私有密鑰是一對,如果用公開密鑰對數(shù)據(jù)進(jìn)行加密,只有用對應(yīng)的私有密鑰才能解密;如果用私有密鑰對數(shù)據(jù)進(jìn)行加密,那么只有用對應(yīng)的公開密鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。那為什么這種機(jī)制就能很好的解決秘鑰傳輸?shù)膯栴}呢? 舉個例子,假設(shè)有通信的雙方(A 和 B),需要交換一個秘密信息,A 會生成一個秘鑰對,公鑰 A 和私鑰 A;B 也會生成一個秘鑰對,公鑰 B 和私鑰 B,假設(shè) A 和 B 都能把自己私鑰保護(hù)的滴水不漏,只要 A 和 B 兩個人自己知道自己各自的私鑰,其他任何人都不知道,就能保證信息交換的安全,交換的過程如下:
是不是整個通信就非常安全了?因為任何第三方即使在公鑰 A 和公鑰 B 相互交換的過程中知道到了公鑰 A 和公鑰 B,也沒有用,因為私鑰 A 和私鑰 B 沒有相互交換,只有各自自己知道,從而保證了通信雙方通信的安全。
目前 SSL/TLS 支持三種算法,但實際上只有 RSA 這一種被廣泛使用;DSA 已經(jīng)被廢棄,而 ECDSA 在未來幾年內(nèi)有望被廣泛使用。
(1)RSA
需要說明的是,RSA 算法是最常見的一種選擇,基本上所有的 SSL/TLS 部署都會支持 RSA 算法,但是,RSA 在 2048 位(最小位數(shù))的密鑰下,比 ECDSA 密鑰在安全性上更弱并且性能更差。更糟的是,增加 RSA 密鑰長度是性能消耗的增加并不是線性的,如果你覺得 2048 位的加密強(qiáng)度不夠,需要使用更高的位數(shù)(比如 3072 位)的 RSA 密鑰時,在性能上就會有極大幅度的下降。
(2)DSA
DSA 算法現(xiàn)在被應(yīng)用的比較少了:因為 DSA 的密鑰長度最大只能到 1024 位(IE 瀏覽器也不支持更高強(qiáng)度),這個位數(shù)根本無法確保安全性,所以沒有人會在 SSL/TLS 實際應(yīng)用中使用 DSA 算法,與所有人背道而馳的結(jié)果是讓你陷入兼容性問題中。
(3)ECDSA(橢圓曲線數(shù)字簽名算法)
ECDSA 算法是未來的選擇,256 位的 ECDSA 密鑰有 128 位用于安全加密上,相對而言,2048 位的 RSA 密鑰只有 112 位是真正用于安全加密的。不僅如此,在這個加密強(qiáng)度下,ECDSA 比 RSA 算法快 2 倍;如果是與 3072 位的 RSA 密鑰在相同加密強(qiáng)度下相比,ECDSA 性能要快 6 倍以上。
因為橢圓曲線(Elliptic Curve,EC)算法是最近才被加入到 TLS 的安全體系中,所以 ECDSA 的問題在于:不是所有用戶端都支持這種算法。新的瀏覽器都支持 ECDSA,但是一些老版本的瀏覽器是不支持這個算法的。你可以通過同時部署 RSA 和 ECDSA 的密鑰來解決對新老瀏覽器的兼容,但并不是所有服務(wù)程序都能提供這種配置方式,另外這種方案也需要額外的工作來同時維護(hù)兩套密鑰和證書。因此,就現(xiàn)狀而言,ECDSA 的最佳使用場景是用于部署追求最高性能的 TLS 服務(wù)系統(tǒng)。未來,隨著我們對安全的日益重視,ECDSA 也會變得越來越重要。
千言萬語抵不過一幅圖,下面是筆者從網(wǎng)上找了張經(jīng)典的圖,大家一看圖就應(yīng)該明白了什么是非對稱加密算法。
enter image description here
電子商務(wù)認(rèn)證授權(quán)機(jī)構(gòu)(CA,Certificate Authority),也稱為電子商務(wù)認(rèn)證中心,是負(fù)責(zé)發(fā)放和管理數(shù)字證書的權(quán)威機(jī)構(gòu),并作為電子商務(wù)交易中受信任的第三方,承擔(dān)公鑰體系中公鑰的合法性檢驗的責(zé)任。其就好比頒發(fā)身份證的公安局,當(dāng)我們申請身份證的時候,我們必須要提供各種資料證明這個身份證是你的,比如你的戶口本、家庭成員信息,那么 CA 也是類似,對于一些正規(guī)的商業(yè)的知名的 CA,當(dāng)公司或者個人申請 SSL 證書的時候,CA 會驗證申請人的信息是否可信任。
CA 是證書的簽發(fā)機(jī)構(gòu),它是 PKI 的核心,CA 是負(fù)責(zé)簽發(fā)證書、認(rèn)證證書、管理已頒發(fā)證書的機(jī)關(guān)。它要制定政策和具體步驟來驗證、識別用戶身份,并對用戶證書進(jìn)行簽名,以確保證書持有者的身份和公鑰的擁有權(quán)。
CA 也擁有一個證書(內(nèi)含公鑰)和私鑰。網(wǎng)上的公眾用戶通過驗證 CA 的簽字從而信任 CA,任何人都可以得到 CA 的證書(含公鑰),用以驗證它所簽發(fā)的證書。
如果用戶想得到一份屬于自己的證書,他應(yīng)先向 CA 提出申請。在 CA 判明申請者的身份后,便為他分配一個公鑰,并且 CA 將該公鑰與申請者的身份信息綁在一起,并為之簽名,此后,便形成證書發(fā)給申請者。如果一個用戶想鑒別另一個證書的真?zhèn)?,他就?CA 的公鑰對那個證書上的簽字進(jìn)行驗證,一旦驗證通過,該證書就被認(rèn)為是有效的。
下面的目前世界上最知名的8家 SSL 證書 CA 供應(yīng)商。
簽發(fā) SSL 證書的 CA 供應(yīng)商之間的區(qū)別主要有:機(jī)構(gòu)品牌、證書加密方式、保險額度、服務(wù)與質(zhì)量、瀏覽器支持率等。當(dāng)然,CA 機(jī)構(gòu)也符合「越大越好」這個說法。
當(dāng)然網(wǎng)上也有一些能申請免費 SSL 證書的 CA 供應(yīng)商,比較知名的有:
上面介紹的免費 SSL 證書,要說最讓人放心的當(dāng)屬 Let's Encrypt、騰訊云和阿里云的 DV SSL 證書,其他免費的 SSL 證書,建議大家謹(jǐn)慎使用,對于一些重要的網(wǎng)站還是建議直接購買 SSL 證書。
為了區(qū)分不同的用戶級別,服務(wù)端證書可以分成 DV、OV 和 EV 證書,他們之間具體有什么區(qū)別,請參考云棲社區(qū)的一篇博客《CA 和證書那些事》,分析的很專業(yè)。
如果需要在實際公共互聯(lián)網(wǎng)(Internet)部署的 SSL 服務(wù)器,強(qiáng)烈推薦到商業(yè)的知名的 CA 去申請 SSL 證書。
但是在一個企業(yè)的內(nèi)部的私有網(wǎng)絡(luò)里,比如,局域網(wǎng)(Intranet)內(nèi),其可能會有很多企業(yè)自己的基于 Web 的網(wǎng)站系統(tǒng)(比如工作流審批、考勤、辦公等)或者消息中間件服務(wù)器或者其他企業(yè)級應(yīng)用系統(tǒng),這些應(yīng)用系統(tǒng)只暴露在局域網(wǎng)內(nèi),不會暴露在公有網(wǎng)絡(luò)中,但是又需要有 SSL 保護(hù)各個系統(tǒng)之間的通信,比如存儲企業(yè)所有應(yīng)用系統(tǒng)或者個人信息的密碼的 PMP 服務(wù)器(Password Management Professional),在訪問和調(diào)用其 API 的時候,就一定要基于 HTTPS,因為密碼可是機(jī)密信息啊。
但是出于成本考慮或者保密性要求,我們沒有必要向第三方商業(yè) CA 申請 SSL 證書,不但花錢,而且還要提供一些雜七雜八的企業(yè)證明信息,這個時候,就可以考慮在企業(yè)內(nèi)部搭建一個私有的 CA,搭建已給自己的局域網(wǎng)(Intranet)的一個私有 CA。具體的搭建步驟,在后面的文章會有實戰(zhàn)的例子和文章,比如如何生成 CA 的根證書,CA 的中級代理證書,如何用中級 CA 代理證書來進(jìn)行簽名 SSL 的證書請求,敬請拭目以待吧。
自簽名證書,就是自己給自己頒發(fā)證書,換句話就是說,證書的使用者和頒發(fā)者是同一個 SSL 服務(wù)器,自簽名證明一般用在開發(fā)或者測試環(huán)境,在正式的生產(chǎn)或者商用環(huán)境,建議大家生成證書請求,然后發(fā)送給第三方的 CA 或者自己搭建的企業(yè)內(nèi)部的 CA 去簽名部署。下面就是用 JDK 自帶的 Keytool 為 www.51talkdocter.com 生成一個自簽名證書的命令。
假設(shè)我們在 Windows 操作系統(tǒng)上面,打開 cmd(在 Linux 操作系統(tǒng)上面打開 Shell),輸入下面的命令:
輸入上面的命令后,其會讓我們輸入描述證書的信息,比如國家、組織、城市、省份等,輸入對應(yīng)的信息即可,如下圖說示意。
enter image description here
注意:因為上面一個命令同時生成了自簽名證書的公鑰和私鑰并存在在 KeyStore 文件中,所以需要一個保護(hù)這個 KeyStore 的密碼,比如當(dāng)前的這個例子,為了簡單起見,我輸入的是“123456”,這對于測試環(huán)境和開發(fā)環(huán)境已經(jīng)足夠,但是如果是正式的生成環(huán)境,建議用一個強(qiáng)度高的密碼進(jìn)行保護(hù)。
我們可以通過下面的命令查看 keystore.jks(比如路徑在 c:\keystore.jks)里面生成的自簽名證書的詳細(xì)細(xì)節(jié)。
注意,最后的參數(shù) -v 不能省略,其代表 Verbose,否則其就得不到詳細(xì)的信息,而且其會提示讓我們輸入密碼,密碼就是上面步驟提到的保護(hù)。
下面是其具體的輸出信息詳情。
enter image description here
從上圖的詳細(xì)情況來看,的的確確,證書的所有者(在圖中顯示的是 Owner)和證書的頒發(fā)者(在圖中顯示的是 Issuer)是一樣的,這就代表其是自簽名的證書。如果用瀏覽器訪問自簽名的證書的時候,瀏覽器會彈出一個警告的提示。
其實生成自簽名證書的方法很多,除了使用 JDK 外,后面提及到 OpenSSL、XCA、PowerShell、IIS 都自帶了生成自簽名證書的功能。如果你想進(jìn)一步了解他們的使用或者配置方法,不僅僅局限于自簽名,請繼續(xù)關(guān)注后續(xù)的系列文章內(nèi)容。
證書簽名請求(CSR,Certificate Signing Request)就是一段經(jīng)過編碼的字符文本,其會發(fā)送給 CA,CA 簽名之后,其就變成了一個 SSL 證書,所以發(fā)送給 CA 之前,其是一個 CSR 的文件,CA 簽名之后,其就變成了一張真正意義上的 SSL 證書,可以用于服務(wù)器的 SSL 配置了。
在理解證書簽名請求的時候,一定要記住,你生成證明簽名請求的私鑰一定不要發(fā)送給 CA,因為 CA 只需要你的 CSR 文件即可,不需要你提供生成證書簽名申請的私鑰,這個是初學(xué)者最容易犯的一個錯誤。
根據(jù) PCKS #10 的規(guī)范,CSR 一般使用 ASN.1 的編碼標(biāo)準(zhǔn)對 CSR 文件進(jìn)行編碼。CSR 文件中一般會包含下面的一些信息:
名稱解釋例子通用名 Common Name必須是你域的全名*.51talkdocter.com 或者mail.51talkdocter.com組織名 Organization組織的合法名稱,最好帶有下面類似的后綴, Inc、Corp or LLC51 talk Docter Inc.組織部門 Organizational Unit組織下面申請這個證書的部門比如 IT 部門城市 City/Locality公司所在的城市比如上海(Shanghai)省份或者州 State/County/Region公司所在的省份或者州比如California, 廣東省(Guangdong)國家 Country公司注冊地所在的國家,2位的 ISO碼,比如 cn、us中國的2位碼就是 cn,美國是us郵箱地址 Email address聯(lián)系你組織的郵箱地址比如 webmaster@google.com公鑰 Public Key生成的證書簽名請求 CSR 中里面一定包含了公鑰,但是沒有私鑰生成證書請求的時候,由第三方工具自動生成的
使用 OpenSSL,下面的一條命令就能生成。
如果你還不會安裝和使用 OpenSSL,沒有關(guān)系,后面會有文章深入淺出的詳細(xì)介紹使用 OpenSSL 來生成和管理證書。
假設(shè)我們是一個 Java 程序員,則也可以借助 JDK 自帶的 Keytool 生成證書請求,其一般經(jīng)過兩個步驟:
(1)生成私鑰,并在生成 CSR 的過程中輸入 SSL 證書的相關(guān)描述信息,比如通用名稱、國家、城市、省份、組織、部門等:
其中,-validity 3650 參數(shù)代表證書的生存周期是 10 年。
enter image description here
(2)利用私鑰生成 CSR:
生成的證書請求文件,用文本編輯器打開,其就是類似于下面的樣子。
enter image description here
需要注意的是 CSR 和私鑰的長度決定了其是否能被破解的難易程度,截止 2018 年,私鑰長度小于 2048 位的都可以被認(rèn)為是有潛在安全風(fēng)險的,因為根據(jù)現(xiàn)有的計算機(jī)的計算能力,小于 2048 的私鑰在幾個月內(nèi)就能根據(jù)公鑰成功碰撞私鑰,如果一旦私鑰被破解出來,初始化 SSL 連接其對稱加密的秘鑰就可能被破解者獲取,從而無法保證 SSL 在通信圖中的信息安全。建議在生成 CSR 的時候,使用的秘鑰的長度強(qiáng)烈推薦為 2048 位。
本章主要介紹了和 SSL 相關(guān)的幾個核心概念,比如什么是 SSL 證書、對稱加密和非對稱加密、商業(yè) CA 和私有 CA 的區(qū)別、證書簽名請求是什么以及其需要注意的事項。
限于篇幅有限,不可能把所有的概念面面俱到,這可能要寫好幾本書了,所以只列出了這些對后續(xù)的閱讀和理解非常有幫助的核心概念。作為讀者的一個引子,如果你對其中的一部分感興趣的話,也可以繼續(xù)深挖下去。
限于作者水平,如果有任何疏漏之處,敬請在讀者圈留言,我將盡我最大的能力在讀者圈里回答你的問題。最后,祝大家學(xué)習(xí)愉快。
工欲善其事必先利其器,在查看、生成、轉(zhuǎn)換、導(dǎo)入、導(dǎo)出等 SSL 證書的管理方面,OpenSSL 有著得天獨厚的功能是支撐。OpenSSL 采用 C 語言作為開發(fā)語言,這使得 OpenSSL 具有非常優(yōu)秀的跨平臺性能;它支持 Linux、Windows、Mac、VMS 等多個平臺,這使得 OpenSSL 具有非常廣泛的適用性,如 Apache 使用它加密 HTTPS 協(xié)議,OpenSSH 使用它加密 SSH。
本節(jié)是后面一些文章的基礎(chǔ),建議讀者按照本文列出的實戰(zhàn)步驟,動手自己安裝并執(zhí)行,肯定會有意想不到的收獲。
enter image description here
OpenSSL 是一個穩(wěn)定的、商用等級的、功能全面的、免費開源的,專為 SSL/TLS 而生一款工具,其命令功能主要分為下面三大類。
enter image description here
下面一些命令可能比較常用:
其也提供了下面的生成信息摘要的命令函數(shù)和工具:
其中不得不提的就是 MD(Message Digest)和 SHA,MD4 是 Rivest 于 1990 年設(shè)計的單向散列函數(shù),能夠產(chǎn)生 128 比特的散列值,不過隨著 Dobbertin 提出尋找 MD4 散列的碰撞的方法,因此現(xiàn)在它已經(jīng)不安全了。MD5 是也是由 Rivest 于 1991 年設(shè)計的單向散列函數(shù),也能夠產(chǎn)生 128 位的散列值,不過 MD5 的強(qiáng)抗碰撞性已經(jīng)被攻破,換句話就是說,現(xiàn)在已經(jīng)能夠產(chǎn)生具備相同散列值的兩條不同的消息,因此 MD4/MD5 的算法都已經(jīng)不安全了。
再來看看 SHA 相關(guān)的算法,SHA-1 是由 NIST(美國國家標(biāo)準(zhǔn)技術(shù)研究所)設(shè)計的一種能夠產(chǎn)生 160 比特的散列值的單向散列函數(shù),1993 年被美國聯(lián)邦信息處理標(biāo)準(zhǔn)規(guī)格發(fā)布的時候 SHA,1995 年又發(fā)布了一個修訂版,稱之為 SHA-1,不過 SHA-1 的強(qiáng)抗碰撞性已于 2005 年被攻破。SHA224、SHA256、 SHA384、SHA512 也都是有 NIST 設(shè)計的單向散列函數(shù),他們的散列值長度分別為 224 比特、256 比特、384 比特、512 比特,四種單向散列函數(shù)合起來稱為 SHA-2,SHA-2 目前還尚未被攻破。
那么在實際應(yīng)用中,是不是強(qiáng)度越高越好?筆者認(rèn)為不一定,畢竟生成的信息摘要的位數(shù)越多,其需要的計算能力越多,需要存儲生成的信息摘要的空間要求越大,如果是一個自己的小型的、臨時的應(yīng)用,MD4/MD5 生成的安全摘要已完全夠用,但是如果是需要暴露于公網(wǎng),且牽涉到一些財產(chǎn)生命安全相關(guān)的領(lǐng)域,當(dāng)然肯定是選用安全級別更高的 SHA-2 生成的信息摘要。
OpenSSL 不但有和管理生成 SSL 證書相關(guān)的命令,更令人驚艷的是其還是一個密碼學(xué)方面的專家工具箱,其提供了非常多的密碼學(xué)相關(guān)的工具函數(shù),如下。
enter image description here
大家比較常見的就是 RC(是一種對稱加密,加密的密鑰流和明文一樣長,同樣的密鑰和同樣的長度能確定同一個密鑰流),DES(一種將 64 比特的明文加密成 64 比特的密文的對稱加密算法),AES(Advanced Encryption Standard,在密碼學(xué)中又稱 Rijndael 加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)),BASE64(一種把二進(jìn)制加密成為 ASCII 字符),CBC(CBC 模式由 IBM 發(fā)明與 1976 年,在 CBC 模式中,每個明文塊先與前一個密文塊進(jìn)行異或后,再進(jìn)行加密)等算法。感興趣的讀者可以自行百度或者 Google,網(wǎng)上的資料比較多,這里就不再贅述了。
如果讀者用的是 Linux 操作系統(tǒng),恭喜你,一般的 Linux 操作系統(tǒng)都會自帶 OpenSSL 工具,你所需要確認(rèn)的就是其當(dāng)前是否安裝的是最新版本,如果你用的是 Windows 操作系統(tǒng),也不用擔(dān)心,OpenSSL 也提供了 Windows 版本的安裝程序,本文就以 Windows 操作系統(tǒng)為例子,和大家分享一下如何安裝 OpenSSL。
下載地址詳見這里。
enter image description here
OpenSSL 支持 32 位和 64 位,這個需要根據(jù)自己系統(tǒng)的實際情況選擇,這里我下載的是 Win64 OpenSSL v1.1.0g 進(jìn)行安裝。
enter image description here
下載完成之后就可以進(jìn)行安裝了。
enter image description here
安裝完成后進(jìn)行環(huán)境變量配置,例如 OpenSSL 安裝在 C:\OpenSSL-Win64 目錄下,則將 C:\OpenSSL-Win64\bin; 復(fù)制到 path 中(注意:下圖為 Windows10 系統(tǒng)下環(huán)境變量配置的配圖)。
enter image description here
打開 cmd 命令窗口,輸入 openssl version,如果顯示版本號,那么恭喜你安裝成功,否則安裝失敗。
enter image description here
因為在后面的章節(jié),比如《如何用 OpenSSL 搭建企業(yè)內(nèi)部 CA 認(rèn)證中心的根證書?》、《如何用 OpenSSL 搭建 CA 認(rèn)證中心的中級 CA 證書?》、《三種方法從 HTTPS 網(wǎng)站導(dǎo)出 SSL 證書鏈》等文章(但不局限于這些文章)都能看到 OpenSSL 的高級用法的身影,所以本部分的 OpenSSL 實戰(zhàn)操作將只和大家分享一些基本的 OpenSSL 的操作技能,讓大家找到感覺,而不至于在學(xué)習(xí)后面的課程時,感到一頭霧水。請注意,本文的所有例子都在 Windows 操作系統(tǒng)上進(jìn)行,對于非 Windows 操作系統(tǒng),其操作命令大同小異。
有的時候,我們想知道當(dāng)前安裝的 OpenSSL 版本、安裝的目錄等信息,此時,可以執(zhí)行下面的命令:openssl version -a。
enter image description here
如上圖所示,其顯示當(dāng)前的安裝版本是 1.1.0g,安裝的目錄是 “C:\Program Files\OpenSSL”。
當(dāng)學(xué)習(xí)一門新技術(shù)時,很多人首先會想它有沒有提供一些 help,那 OpenSSL 有沒有為我們提供呢? OpenSS 作為一個強(qiáng)大的工具庫,答案肯定是有。OpenSSL 為我們提供了 OpenSSL help 這個強(qiáng)大的命令,可以概覽 OpenSSL 的所有命令,我們只需要在 cmd 控制臺輸入 openssl help 即可:
enter image description here
使用 OpenSSL xxx -help 可以查看具體一條命令的用法以及它的參數(shù)(注意:xxx 為具體命令),如 OpenSSL md5 -help(下面的截圖只顯示了部分內(nèi)容)。
enter image description here
通過 openssl help 命令,我們可以知道通過 genrsa 可以生成一個高強(qiáng)度的私鑰,如果直接在 openSSL 的控制臺輸入 genrsa,則其會默認(rèn)生成一個 2048 位的私鑰。
enter image description here
當(dāng)然,我們也可以指定一些參數(shù),讓其輸入到指定的文件,比如事先已經(jīng)創(chuàng)建了一個 c:\openssldemo 的文件夾,然后在 OpenSSL 的環(huán)境下執(zhí)行下面的命令:
enter image description here
則其會生成一個 fd.key 的私鑰,用記事本打開,其內(nèi)容如下:
其是一個可以用文本編輯器打開的普通文本文件,其開頭的內(nèi)容顯示其是基于 AES 方式進(jìn)行加密的。中間的私鑰的內(nèi)容是基于 BaseCode 64 編碼格式的字符串。
上面我們用 genrsa 生成了一個私鑰,因為 OpenSSL 也提供了一些密碼學(xué)的工具,我們可以借助其提供的 RSA 的密碼工具,來查看其私鑰的相關(guān)的信息。
執(zhí)行上面的命令后,其會把 fd.key 的具體信息全部列出來,比如模的信息、共有組件、私有組件等,具體信息如下:
絕對是研究 RSA 算法的一個非常得力的工具。
我們在配置網(wǎng)站的時候,可能需要為網(wǎng)站創(chuàng)建一個 SSL 的證書請求,那么用 OpenSSL 應(yīng)該如何做呢?其實很簡單,因為 OpenSSL 就有一個 req 的命令,專門用來創(chuàng)建證書請求。需要注意的是,在創(chuàng)建一個 SSL 的證書請求前,先要創(chuàng)建一個私鑰來,我們可以直接使用上面的私鑰,通過 -key 的參數(shù) c:\openSSLDemo\fd.key 來指定,然后通過 -out 的參數(shù)指定其輸出的文件路徑。
中途需要輸入你的包含私鑰 c:\openSSLDemo\fd.key 的密碼,然后再需要你輸入證書的基本信息,比如國家、地區(qū)、城市、組織、通用名、郵箱地址等,比如下面我的申請。
證書請求生成后,可以通過下面的命令查看生成的證書請求。
其中,-text 表示已文本的方式查看,-in 后面需要知道待查看的證書的請求的路徑,-noout 表示不輸出其已經(jīng)被編碼的證書文本本身,下面為命令執(zhí)行結(jié)果的輸出。
如果你只是安裝一個 SSL/TLS 服務(wù)器,比如在 IIS 或者 Tomcat 上面部署一個 Web 站點,而且這個站點只是供你自己開發(fā)測試使用,這個時候,就沒有必要把證書請求發(fā)送給第三方的權(quán)威的商業(yè) CA 去簽名我們的證書請求,最快最方便的方式就是自己簽署自己,從而生成一個自簽名的 SSL 證書。OpenSSL 已經(jīng)為我們考慮好了,其命令如下:
其中,x509 -req 表示要進(jìn)行 SSL 證書的自簽名了,-days 365 表示自簽名的證書的有效期限為 1 年,從剛剛算起;-signkey 表示用的是生成證書請求的私鑰,也就是自己給自己簽名;-in 表示證書請求的路徑,-out 表示生成的自簽名證書輸出的路徑。
運行上面的命令后,生成的 fd.crt 自簽名的證書如下:
enter image description here
證書生成后,我們需要測試或者查看證書,這個時候,就可以使用下面的類似命令了。
其中,-in 參數(shù)表示的是需要查看的證書的路徑,-noout 表示不輸出其已經(jīng)被編碼的證書文本本身,命令的執(zhí)行結(jié)果如下:
本篇文章首先闡述了 OpenSSL 工具的作用,其主要是用來管理 SSL 證書的,但是也提供了非常有用的密碼學(xué)工具箱,用于密碼學(xué)測試驗證。緊接著,和大家分享了如何安裝 OpenSSL,特別是在 Windows 操作系統(tǒng)上,并以 Windows 操作系統(tǒng)為平臺,在上面根據(jù)不同的假設(shè)場景,實戰(zhàn)演練了一把。
知易行難,如果讀者能夠仿照上面的實戰(zhàn)步驟,一一執(zhí)行一下,我想不僅能夠加深印象,而且能夠?qū)ζ浠镜拿畈僮鞣绞秸业揭环N感覺,從而能夠舉一反三。限于筆者水平,如果有錯誤或者理解不當(dāng)之處,請與我聯(lián)系改正,最后祝大家學(xué)習(xí)愉快,收獲良多。
Ocserv 是 OpenConnect VPN server 的簡稱,是一個開源的 SSL VPN 服務(wù)器軟件,兼容 OpenConnect 和 Cisco AnyConnect VPN 客戶端。Ocserv 的設(shè)計目標(biāo)是高性能和高安全性,通常用于在遠(yuǎn)程用戶和公司網(wǎng)絡(luò)之間建立安全的 VPN 連接。
Ocserv 的特點和功能
兼容性:Ocserv 兼容 Cisco AnyConnect 和 OpenConnect 客戶端,支持多種平臺(包括 Windows、macOS、Linux 和移動設(shè)備)。
高性能:Ocserv 被設(shè)計為能夠處理大量的并發(fā)連接,同時保持高性能。
安全性:Ocserv 支持現(xiàn)代加密協(xié)議和認(rèn)證機(jī)制,確保連接的安全性。
簡單配置:Ocserv 提供了簡單的配置選項,使得配置和管理 VPN 服務(wù)器變得相對容易。
擴(kuò)展性:Ocserv 支持插件和擴(kuò)展,允許用戶根據(jù)需要自定義功能。
社區(qū)支持:作為一個開源項目,Ocserv 有一個活躍的社區(qū),提供支持和不斷的更新。
典型應(yīng)用場景
企業(yè) VPN:企業(yè)可以使用 Ocserv 為員工提供遠(yuǎn)程訪問公司內(nèi)部網(wǎng)絡(luò)的 VPN 服務(wù)。
個人隱私:個人用戶可以使用 Ocserv 在公共網(wǎng)絡(luò)上保護(hù)他們的隱私和數(shù)據(jù)安全。
學(xué)術(shù)和研究機(jī)構(gòu):學(xué)校和研究機(jī)構(gòu)可以使用 Ocserv 提供安全的遠(yuǎn)程訪問資源的服務(wù)。
安裝和配置 Ocserv
在基于 Debian 的系統(tǒng)(如 Ubuntu)上,可以通過以下命令安裝 Ocserv:
安裝完成后,可以編輯 Ocserv 的配置文件 /etc/ocserv/ocserv.conf 進(jìn)行配置。以下是一個基本配置的示例:
配置完成后,通過以下命令啟動 Ocserv 服務(wù):
通過以上步驟,你可以安裝并配置 Ocserv,以提供安全的 VPN 服務(wù)。如果需要更多高級配置和管理,建議參考 Ocserv 官方文檔和社區(qū)資源。