作者:三一斜狩
鏈接:https://www.zhihu.com/question/24294477/answer/74783418
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。
鏈接:https://www.zhihu.com/question/24294477/answer/74783418
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。
先說加密。
明文P,加上密碼W一混淆之后,變成密文M
如果不知道W,則無法從M反推回P。也就是無法進行解密。
類似這種加密方式,稱為對稱加密。也就是加密、解密使用的密碼是一樣的。
實際上加解密並不是直接使用密碼,而是經由密碼生成的密鑰。
這種算法有很多,比如AES。
另外還有一種神奇的加解密算法,叫做非對稱加密。比如RSA。
非對稱加密使用的密碼有一對,一個稱為公鑰Pub,一個稱為私鑰Priv。
明文P,經過公鑰Pub使用RSA加密算法一混淆之后,變成了密文M。
這個密文M,用公鑰Pub是解不開的,需要用私鑰Priv來解密。
同樣地,明文P,經過私鑰Priv使用RSA加密算法一混淆之后,變成了密文M。
這個M,也只能用公鑰pub來解密。
所謂公鑰,就是可以公開出去可以供所有人使用的密鑰。不像對稱加密里的密碼,要小心翼翼的存着。
還有一種算法,叫做hash算法。是單向加密。就是只能從明文得到密文,卻無法從密文得到明文。這種算法有一個好處,就是明文哪怕只有一位不一樣,加密后得到的密文也不一樣。所以常用來進行比較明文是否被篡改過。
有了以上的基礎,就可以開始說數字證書了。
首先,有一個權威的證書簽發機構,稱為CA——全球就那么幾個公司比較權威啦,這個機構,先用RSA產生一對公私鑰。
私鑰自己留着藏起來,你要是能偷到手就厲害了。
然后用自己的私鑰對自己的公鑰進行簽名,生成所謂的數字證書。
這個過程大概是這樣的:
先生成一個文件,文件內容大概是這樣的:
公鑰內容
簽發者ID----誰簽發的證書
Subject----也就是這個證書簽發給誰。這里subject和簽發者ID相同。
有效期
其他信息
以上內容都是明文。我們稱為內容P。
然后使用hash算法,對內容P進行hash計數,得到一個hash值H。
然后使用簽發機構的私鑰對H進行RSA加密,得到簽名信息S。
然后將P,S連成一個文件,這個文件就是所謂的數字證書了。
現在假設某人得到了這個證書,如何確認這個證書屬於誰的呢?
我們看數字證書里有些什么?可以得到P,可以得到S。
我們用同樣的hash算法對P進行hash計數,得到一個hash值H1.
P里有公鑰,簽發者ID,Subject,有效期,及其他信息。我們用公鑰解密S,得到了一個值H’。
這個H‘就是制作數字證書的時候,用私鑰對S加密的H。
現在對比H’和H1是否相等,如果相等,那么就證明這個證書是有簽發者簽發給subject的證書。否則就說明:1.內容P被篡改過,或者2.證書不是由CA簽發的。
這個是對自簽發證書的驗證過程。
既然自己可以給自己簽發證書,那黑客宣稱自己是CA,然后給自己簽發一個證書,那驗證者如何來驗證這個證書是黑客自己的呢還是CA呢?
這個問題,就是CA存在的意義了。
所謂全球權威的CA,就那么幾個公司,這幾個公司的證書,被各軟件廠商設置成可信任的根證書了。至於這些CA是怎么把自己的數字證書交給軟件廠商而且讓他們信任自己,我也不知道。如果你知道了,你就可以自己給自己簽發一個證書,交給微軟的IE,或者firefox等,讓他們把你的證書嵌入到軟件里去。這樣一來,你就成了全球權威的CA之一了!
現在知道了,自簽發的數字證書,要被各軟件信任,是不容易的。
我們舉一個例子,說明數字證書用來進行身份認證。就是https連接某網站的時候的身份認證過程。
首先,某網站要有一個數字證書。這個證書,要么是自己簽發的,要么是由第三方簽發的,一般這個第三方是全球權威的CA。
IE或者firefox用https連上web server,這個時候,IE或者firefox最擔心的是這個web server是冒充的網站,怎么確認這個網站是正確的呢?就要去web server提供自己的數字證書來證明自己的身份。
web server把自己的數字證書傳給瀏覽器。瀏覽器對之進行驗證,確認此網站的身份。
現在看這個數字證書怎么證明自己的身份。
假設數字證書是第三方簽發的,但這個第三方卻不權威。
這個時候,瀏覽器就會警告用戶,說這個網站提供的證書不安全,比如12306網站的:
查看此證書:
簽發者是SRCA,應該是這個簽發中心簽發的:
中鐵數字認證中心
這是什么意思呢?
就是說,中鐵數字認證中心簽發給12306網站的數字證書,其簽發者”中鐵數字認證中心“,在IE眼里是不受信任的。那IE自然對一個不受信任的簽發機構簽發的數字證書也認為不安全了。
那么這個數字證書到底能不能證明12306的身份呢?答案是不能。
因為這個證書是由SRCA簽發的,也就是需要SRCA的公鑰來驗證。但是IE並沒有得到這個公鑰。
如果SRCA將自己的數字證書嵌入到IE里了,IE自然就有了。
既然沒有嵌入進IE里,那通過手動添加SRCA到IE里可以嗎?當然可以,這就是為什么12306要求安裝受信任的根證書的原因。
那么這個安裝動作,就要非常小心了。你怎么能確認這個SRCA是一個合法權威的CA呢?一旦安裝了這個CA證書,其影響是鏈式的。
想想看我們為什么安裝了12306網站提供的根證書?是基於對12306網站的信任。這個根證書是網站自身提供的,但是我們從新聞聯播里,從大眾行為里,信任了這個網站,安裝了根證書。
我們看看這個證書:
簽發者和簽發給的人都是SRCA,就是自己給自己簽發。但是這個證書,沒有人能證明其是否可信任。但是我們,人類,基於對國家的信任,認為其可信任。安裝了這個證書之后,在IE里可以查看到它:
然后訪問 http://12306.cn,就沒有警告信息了:
那么SRCA是如何驗證12306網站的身份的呢?是如何驗證12306提供的數字證書的有效性呢?
以上描述中,對於自簽發證書中的公鑰的使用,可能對大家有一些誤導。實際上,數字證書中的公鑰,可以被用來驗證其他數字證書,也可以被用來進行兩個節點間通信時候的加密密鑰(當然實際使用的加密密鑰是另一回事情,這里暫且略過)。大多數https網站提供的數字證書的目的,一個是確認身份,一個是加密瀏覽器與Web Server之間的通信數據。
我們構造一個場景:
假設SRCA的公鑰證書已經被用戶添加為受信任的根證書。也就是SRCA的公鑰存於用戶的計算機系統中了。而SRCA的私鑰存在於公司董事長的某個保險櫃里。
12306網站向SRCA申請了數字證書。12306網站申請數字證書的時候,需要提供一些信息,主要包括:12306的URL,12306自己產生的一對RSA公私鑰對中的公鑰,其他一些相關信息。
SRCA就用自己的私鑰對12306的申請內容進行簽名,形成一個數字證書,還給12306網站。
所以這個證書里,包括了:
1.12306網站的URL
2.12306網站使用的RSA公私鑰對中的公鑰。
3.證書簽發者的信息。
4.證書簽名。
在12306網站里,於是就有一個數字證書,還有一份該數字證書中的公鑰對應的私鑰,這對公私鑰是12306自己產生的。
其中數字證書由SRCA的私鑰簽名了。而SRCA的公鑰已經存在於用戶瀏覽器中。
數字證書中包括了12306中的公私鑰對的公鑰。當瀏覽器用SRCA的公鑰證書驗證了證書之后,就得到了這個公鑰。瀏覽器有12306網站的公鑰,12306網站自己也有私鑰,二者就可以進行加密通訊了。
具體流程如下:
當用戶在瀏覽器地址欄里輸入了12306的網址后,就連接到了12306的網站。網站傳輸給瀏覽器一份數字證書CERT_12306。
瀏覽器根據數字證書內容,發現該證書簽名者是SRCA。
瀏覽器查找系統中受信任的根證書中是否有SRCA的公鑰證書。找到了。
瀏覽器得到SRCA公鑰證書中的公鑰Pub_SRCA。
用Pub_SRCA解密CERT_12306中的簽名部分,得到hash值H1.
瀏覽器計算CERT_12306中的明文內容,得到HASH值H2,對比H1,H2,驗證數字證書有效性。
如果有效,則得到明文內容中的URL,發現正在訪問的URL與證書中得到的URL一致,則此次訪問正常。身份認證通過。
所以12306數字證書的驗證,是使用SRCA公鑰證書中的公鑰驗證的。自簽發證書也是用自己證書中的公鑰來驗證自己的。
也就簽名的時候用什么RSA公私鑰中的私鑰,則驗證簽名的時候就需要用對應的公鑰。
而網站的數字證書提供了公鑰,網站自己有私鑰。瀏覽器於是產生一個隨機數R1,用公鑰加密發給服務器,服務器用私鑰解密后,得到這個隨機數R1,后續兩種就用這個R1作為對稱加密的密鑰來加密傳輸的數據。這個大約是SSL協議的簡單過程,原理是這樣的,細節可能差很多。
假設,有一個壞蛋,不知道用什么方法,讓訪問 http://12306.cn,不再連接到真正的12306網站,而連接到了自己網站,通過數字證書,能夠阻止壞蛋做這樣的事情嗎?
明文P,加上密碼W一混淆之后,變成密文M
如果不知道W,則無法從M反推回P。也就是無法進行解密。
類似這種加密方式,稱為對稱加密。也就是加密、解密使用的密碼是一樣的。
實際上加解密並不是直接使用密碼,而是經由密碼生成的密鑰。
這種算法有很多,比如AES。
另外還有一種神奇的加解密算法,叫做非對稱加密。比如RSA。
非對稱加密使用的密碼有一對,一個稱為公鑰Pub,一個稱為私鑰Priv。
明文P,經過公鑰Pub使用RSA加密算法一混淆之后,變成了密文M。
這個密文M,用公鑰Pub是解不開的,需要用私鑰Priv來解密。
同樣地,明文P,經過私鑰Priv使用RSA加密算法一混淆之后,變成了密文M。
這個M,也只能用公鑰pub來解密。
所謂公鑰,就是可以公開出去可以供所有人使用的密鑰。不像對稱加密里的密碼,要小心翼翼的存着。
還有一種算法,叫做hash算法。是單向加密。就是只能從明文得到密文,卻無法從密文得到明文。這種算法有一個好處,就是明文哪怕只有一位不一樣,加密后得到的密文也不一樣。所以常用來進行比較明文是否被篡改過。
有了以上的基礎,就可以開始說數字證書了。
首先,有一個權威的證書簽發機構,稱為CA——全球就那么幾個公司比較權威啦,這個機構,先用RSA產生一對公私鑰。
私鑰自己留着藏起來,你要是能偷到手就厲害了。
然后用自己的私鑰對自己的公鑰進行簽名,生成所謂的數字證書。
這個過程大概是這樣的:
先生成一個文件,文件內容大概是這樣的:
公鑰內容
簽發者ID----誰簽發的證書
Subject----也就是這個證書簽發給誰。這里subject和簽發者ID相同。
有效期
其他信息
以上內容都是明文。我們稱為內容P。
然后使用hash算法,對內容P進行hash計數,得到一個hash值H。
然后使用簽發機構的私鑰對H進行RSA加密,得到簽名信息S。
然后將P,S連成一個文件,這個文件就是所謂的數字證書了。
現在假設某人得到了這個證書,如何確認這個證書屬於誰的呢?
我們看數字證書里有些什么?可以得到P,可以得到S。
我們用同樣的hash算法對P進行hash計數,得到一個hash值H1.
P里有公鑰,簽發者ID,Subject,有效期,及其他信息。我們用公鑰解密S,得到了一個值H’。
這個H‘就是制作數字證書的時候,用私鑰對S加密的H。
現在對比H’和H1是否相等,如果相等,那么就證明這個證書是有簽發者簽發給subject的證書。否則就說明:1.內容P被篡改過,或者2.證書不是由CA簽發的。
這個是對自簽發證書的驗證過程。
既然自己可以給自己簽發證書,那黑客宣稱自己是CA,然后給自己簽發一個證書,那驗證者如何來驗證這個證書是黑客自己的呢還是CA呢?
這個問題,就是CA存在的意義了。
所謂全球權威的CA,就那么幾個公司,這幾個公司的證書,被各軟件廠商設置成可信任的根證書了。至於這些CA是怎么把自己的數字證書交給軟件廠商而且讓他們信任自己,我也不知道。如果你知道了,你就可以自己給自己簽發一個證書,交給微軟的IE,或者firefox等,讓他們把你的證書嵌入到軟件里去。這樣一來,你就成了全球權威的CA之一了!
現在知道了,自簽發的數字證書,要被各軟件信任,是不容易的。
我們舉一個例子,說明數字證書用來進行身份認證。就是https連接某網站的時候的身份認證過程。
首先,某網站要有一個數字證書。這個證書,要么是自己簽發的,要么是由第三方簽發的,一般這個第三方是全球權威的CA。
IE或者firefox用https連上web server,這個時候,IE或者firefox最擔心的是這個web server是冒充的網站,怎么確認這個網站是正確的呢?就要去web server提供自己的數字證書來證明自己的身份。
web server把自己的數字證書傳給瀏覽器。瀏覽器對之進行驗證,確認此網站的身份。
現在看這個數字證書怎么證明自己的身份。
假設數字證書是第三方簽發的,但這個第三方卻不權威。
這個時候,瀏覽器就會警告用戶,說這個網站提供的證書不安全,比如12306網站的:


簽發者是SRCA,應該是這個簽發中心簽發的:
中鐵數字認證中心
這是什么意思呢?
就是說,中鐵數字認證中心簽發給12306網站的數字證書,其簽發者”中鐵數字認證中心“,在IE眼里是不受信任的。那IE自然對一個不受信任的簽發機構簽發的數字證書也認為不安全了。
那么這個數字證書到底能不能證明12306的身份呢?答案是不能。
因為這個證書是由SRCA簽發的,也就是需要SRCA的公鑰來驗證。但是IE並沒有得到這個公鑰。
如果SRCA將自己的數字證書嵌入到IE里了,IE自然就有了。
既然沒有嵌入進IE里,那通過手動添加SRCA到IE里可以嗎?當然可以,這就是為什么12306要求安裝受信任的根證書的原因。
那么這個安裝動作,就要非常小心了。你怎么能確認這個SRCA是一個合法權威的CA呢?一旦安裝了這個CA證書,其影響是鏈式的。
想想看我們為什么安裝了12306網站提供的根證書?是基於對12306網站的信任。這個根證書是網站自身提供的,但是我們從新聞聯播里,從大眾行為里,信任了這個網站,安裝了根證書。
我們看看這個證書:


然后訪問 http://12306.cn,就沒有警告信息了:

以上描述中,對於自簽發證書中的公鑰的使用,可能對大家有一些誤導。實際上,數字證書中的公鑰,可以被用來驗證其他數字證書,也可以被用來進行兩個節點間通信時候的加密密鑰(當然實際使用的加密密鑰是另一回事情,這里暫且略過)。大多數https網站提供的數字證書的目的,一個是確認身份,一個是加密瀏覽器與Web Server之間的通信數據。
我們構造一個場景:
假設SRCA的公鑰證書已經被用戶添加為受信任的根證書。也就是SRCA的公鑰存於用戶的計算機系統中了。而SRCA的私鑰存在於公司董事長的某個保險櫃里。
12306網站向SRCA申請了數字證書。12306網站申請數字證書的時候,需要提供一些信息,主要包括:12306的URL,12306自己產生的一對RSA公私鑰對中的公鑰,其他一些相關信息。
SRCA就用自己的私鑰對12306的申請內容進行簽名,形成一個數字證書,還給12306網站。
所以這個證書里,包括了:
1.12306網站的URL
2.12306網站使用的RSA公私鑰對中的公鑰。
3.證書簽發者的信息。
4.證書簽名。
在12306網站里,於是就有一個數字證書,還有一份該數字證書中的公鑰對應的私鑰,這對公私鑰是12306自己產生的。
其中數字證書由SRCA的私鑰簽名了。而SRCA的公鑰已經存在於用戶瀏覽器中。
數字證書中包括了12306中的公私鑰對的公鑰。當瀏覽器用SRCA的公鑰證書驗證了證書之后,就得到了這個公鑰。瀏覽器有12306網站的公鑰,12306網站自己也有私鑰,二者就可以進行加密通訊了。
具體流程如下:
當用戶在瀏覽器地址欄里輸入了12306的網址后,就連接到了12306的網站。網站傳輸給瀏覽器一份數字證書CERT_12306。
瀏覽器根據數字證書內容,發現該證書簽名者是SRCA。
瀏覽器查找系統中受信任的根證書中是否有SRCA的公鑰證書。找到了。
瀏覽器得到SRCA公鑰證書中的公鑰Pub_SRCA。
用Pub_SRCA解密CERT_12306中的簽名部分,得到hash值H1.
瀏覽器計算CERT_12306中的明文內容,得到HASH值H2,對比H1,H2,驗證數字證書有效性。
如果有效,則得到明文內容中的URL,發現正在訪問的URL與證書中得到的URL一致,則此次訪問正常。身份認證通過。
所以12306數字證書的驗證,是使用SRCA公鑰證書中的公鑰驗證的。自簽發證書也是用自己證書中的公鑰來驗證自己的。
也就簽名的時候用什么RSA公私鑰中的私鑰,則驗證簽名的時候就需要用對應的公鑰。
而網站的數字證書提供了公鑰,網站自己有私鑰。瀏覽器於是產生一個隨機數R1,用公鑰加密發給服務器,服務器用私鑰解密后,得到這個隨機數R1,后續兩種就用這個R1作為對稱加密的密鑰來加密傳輸的數據。這個大約是SSL協議的簡單過程,原理是這樣的,細節可能差很多。
假設,有一個壞蛋,不知道用什么方法,讓訪問 http://12306.cn,不再連接到真正的12306網站,而連接到了自己網站,通過數字證書,能夠阻止壞蛋做這樣的事情嗎?