WCF認證:X.509證書1 非對稱密碼學(Asymmetric Cryptography)二、數字證書三、通過憑證三個屬性來分析X.509證書

1 非對稱密碼學(Asymmetric Cryptography)

站在消息交換的角度,密碼學就是幫助我們實現對整個消息或者對消息的某個部分進行數字簽名和加密的理論和方法

數字簽名和加密依賴於相應的加密算法(Cryptographic Algorithm) 從數學的角度來講,加密算法是就是將被加密的數據和密鑰作爲自變量,將加密後的數據作爲因變量的函數

與加密相對的操作是解密 按照加密和解密採用的密鑰是否相同,我們將加密算法分爲

  • 對稱加密算法 採用相同的密鑰進行加密和解密
  • 非對稱加密算法 採用一組相互配對的密鑰分別進行加密和解密。

對於非對稱加密,我們選擇密鑰對中某一個密鑰對消息進行加密,該密文只有通過另一個密鑰方能解密

非對稱密碼學具有兩個主要的應用

  • 直接通過對消息進行加密解決機密性問題
  • 通過數字簽名實現身份認證和數據一致性的問題

1.1 消息加密(Encryption)

非對稱加密依賴一組由公鑰/私鑰(Public Key /Private Key)組成的密鑰對,所以採用非對稱加密又被稱爲公鑰加密(Public Key Cryptography)。具體來說,公鑰和私鑰均可以用於加密。如果密鑰對中的其中一個用於加密,另一個則用於解密。公鑰公諸於衆,不具有隱私性,任何人均可以獲取;而私鑰專屬於擁有該密鑰對的實體,屬於絕對隱私。

對於消息交換來說,通過非對稱的方式對消息進行加密是能夠確保消息的機密性。具體的做法是:消息的發送方採用接收方的公鑰進行加密,接收方通過自己的私鑰進行解密。由於私鑰僅供接收方所有,所有其他人不能對密文進行解密。

數字簽名(Digital Signature)

我們所說的數字簽名實際上包括兩項主要的工作,簽名(Signing)和檢驗(Verification),前者創建一個數字簽名,後者驗證簽名的有效性。接下來,我們來簡單介紹一下在消息交換場景下的簽名和檢驗是如何實現的。

<figure style="box-sizing: border-box; list-style: inherit; margin: 20px 0px; display: block; text-align: center; color: rgb(51, 51, 51); font-family: PingFangSC-Light, "hiragino sans gb", "helvetica neue", "microsoft yahei ui", "microsoft yahei", simsun, arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">

image

</figure>

簽名的過程其實很簡單,整個流程如上圖所示。整個流程包括兩個步驟:首先,發送方首先採用某種算法對整個消息的內容實施哈希計算,得到一個哈希碼。然後,發送使用自己的私鑰對該哈希碼就行加密,加密後得到的密文就是數字簽名。該數字簽名最終會連同發送方密鑰對中的公鑰(該公鑰一般會內嵌於一個數字證書中)附加到原消息上一併發予接收方。

這三項被接收方接收之後,它就可以藉助這個數字簽名驗證發送方的真實身份和消息的完整性,這個過程被稱爲數字簽名的驗證。整個數字簽名檢驗流程如下圖所示。首先,原消息被提取出來,通過相同的哈希算法得到一個哈希碼。然後,數字簽名被提取出來,採用相同的算法利用公鑰對數字簽名進行解密,得到生成數字簽名的那個哈希碼。兩個哈希碼進行比較,如果一致則可以證明數字簽名的有效性以及消息本身的完整性。

<figure style="box-sizing: border-box; list-style: inherit; margin: 20px 0px; display: block; text-align: center; color: rgb(51, 51, 51); font-family: PingFangSC-Light, "hiragino sans gb", "helvetica neue", "microsoft yahei ui", "microsoft yahei", simsun, arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">

image

</figure>

採用非對稱密碼學對消息加密解決的是消息的機密性問題,而數字簽名的作用則體現在如下三個方面:

  • 身份認證(Authentication):數字證書可以幫助我們驗證消息發送源的真實身份,因爲數字簽名的內容是由一個私鑰決定的,發送方只有通過專署於他的密鑰對中的私鑰生成數字簽名,採用通過對方利用公鑰實施的數字簽名檢驗。而私鑰是屬於擁有者的私密信息,不對外公開的。對數字證書的檢驗實際上就確認消息的發送源是否是私鑰的真正擁有者。
  • 防止抵賴(Non-repudiation):防止抵賴在這裏的代表對於接收到的經過數字簽名的消息,如果接收方採用某個實體的公鑰對數字簽名檢驗成功,那麼這個實體就是消息的發送方,不容對方抵賴。原因很簡單,能夠通過公鑰對某個數字簽名成功檢驗,證明生成該數字簽名使用的是正確的私鑰。
  • 消息一致性(Integrity):而數字簽名確實可以確保整個消息內容的一致性的,因爲最初被用於私鑰加密的哈希碼是針對整個消息的內容進行哈希計算獲得的。消息的內容一旦出現任何的改變,最終對數字簽名的檢驗都將失敗。

在上面介紹數字簽名的流程時,我們說發送方的公鑰會連同生成的數字簽名會附加到消息中,一併傳送給接收方,以輔助接收方對發送進行身份驗證。實際上,這個公鑰在一般情況下是通過數字證書的形式進行傳遞的。數字證實在這裏作爲發送方的憑證,現在我們就來簡單介紹一下數字證書。

二、數字證書

證書,又稱數字證書(Digital Certificate)或者公鑰證書(Public Key Certificate),是一種數字簽名的聲明,它將公鑰的值綁定到持有對應私鑰的個人、設備或服務的標識。由於大多數普通用途的證書基於 X.509 V3 證書標準,所以我們有將其稱爲X.509證書。X.509證書廣泛地被應用於加密(Encryption)和數字簽名(Digital Signature),以提供認證的實現和確保數據的一致性(Integrity)和機密性(Confidentiality)。

站在公鑰密碼學的角度來講,X.509證書就是一個將某個密鑰對中的公鑰與某個主題(Subject)進行綁定的文件。具體來講,和公鑰進行綁定的不僅僅包括相應主題的可辨別名稱(DN:Distinguished Name),可以包括主題相關的其它可選名稱,比如Email地址、DNS名稱等。

下面的代碼片斷體現了一個X.509證書的大體結構。其中包括版本號(V3)、序列號(7829)、簽名算法(md5WithRSAEncryption)、頒發者(CN=Root Agency)、有效日期(April ‎07, ‎2011 3:37:45 PM到January ‎01, ‎2040 7:59:59 AM)、主題信息(CN = www.artech.com)、公鑰(00:b4:31:98:... 52:7e:41:8f)和公鑰算法(rsaEncryption)以及頒發者的數字簽名(93:5f:8f:5f:... b5:22:68:9f)。

<pre class="prism-token token language-js" style="box-sizing: border-box; list-style: inherit; margin: 24px 0px; font: 400 14px/1.45 Consolas, "Liberation Mono", Menlo, Courier, monospace; padding: 16px; overflow: auto; background-color: rgb(247, 247, 247); border-radius: 3px; overflow-wrap: normal; text-align: left; white-space: pre; word-spacing: 0px; word-break: normal; tab-size: 2; hyphens: none; color: rgb(51, 51, 51); letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> 1: Certificate: 2: Data: 3: Version: V3 4: Serial Number: 7829 (0x1e95) 5: Signature Algorithm: md5WithRSAEncryption 6: Issuer: CN=Root Agency 7: Validity 8: Not Before: ‎Thursday, ‎April ‎07, ‎2011 3:37:45 PM 9: Not After : ‎Sunday, ‎January ‎01, ‎2040 7:59:59 AM 10: Subject: CN = www.artech.com 11: Subject Public Key Info: 12: Public Key Algorithm: rsaEncryption 13: RSA Public Key: (1024 bit) 14: Modulus (1024 bit): 15: 00:b4:31:98:... 52:7e:41:8f 16: Exponent: 65537 (0x10001) 17: Signature Algorithm: md5WithRSAEncryption 18: 93:5f:8f:5f: ... b5:22:68:9f</pre>

數字證書的頒發機制

數字證書在大部分場景中是作爲證明某個實體身份的憑證被使用,而證書的主題部分的內容代表了該用戶憑證所代表的身份。那麼我們的第一個問題是,我們爲什麼要信任這個證書?

我們可以通過與日常生活中使用的證書進行類比,進而加深對數字證書的理解。比如居民身份證就是一種典型的證書,它的一個重要的特徵就是該證書是由官方認可的合法機構頒發,一般情況下身份證的辦法機構就是戶口所在地的公安機關。對於數字證書,尤其是用於商業用途的數字證書,也具有相應的官方辦法機構,我們將這樣的機構稱之爲認證權威機構(CA:Certification Authority,以下簡稱CA)。我們熟悉的CA包括VeriSign、Thawte(OpenSSL)等。證書的頒發機構體系是一個樹形結構,每一個CA可以具有一到多個子CA,最上層的CA被稱爲根CA。

在日常生活中,人們對居民身份證的普遍認可來源於對頒發機構,即戶口所在地的公安機關的信任。這種基於對頒發機構認可的方式同樣適合對數字證書。在一般情況下,認證方通過檢驗數字證書的CA的信任程度而作出對證書合法性的判斷。不過,現在的問題是:居民身份證具有若干防僞標識幫助認證方鑑別真僞,對於數字證書來說,我們採用怎樣的方式來判斷它是不是僞造的呢?驗證數字證書的有效性,需要防止以下兩種情況:

  • 用戶僞造一個證書以假冒與證書公鑰綁定的那個身份,並且該證書具有一個我們普遍認可的CA;
  • 用戶對CA頒發的證書進行篡改,改變公鑰或者其他身份信息。這兩個問題都可以通過數字簽名技術來解決。

從上面給出的數字證書我們知道,證書中不僅僅包括CA的基本信息,還包括一個數字簽名和簽名採用的算法。CA通過自己的私鑰對證書的數據部分進行簽名,並將此簽名連同簽名採用的算法置於證書之中。按照我們前面介紹的關於數字簽名的原理,如果我們具有CA的公鑰,我們不僅僅可以驗證證書的CA,也能校驗證書的內容是否被篡改。那麼在對證書進行驗證的時候,CA的公鑰從何而來呢?

實際上,CA的公鑰也保存在一個數字證書之中,並被存儲於一個受信任的證書存儲之中。按照證書代表身份的不同,我們可以將其分爲兩種類型:CA證書(CA Certificate)和終端實體證書(End Entity Certificate),其中前者代表CA,後者代表接受CA證書的最終實體。實際上,CA證書和終端實體證書並沒有本質的區別。除了最頂層的根CA,所有的CA證書頒發者是它的上一級CA,即上級的CA作爲該CA證書的CA。CA的這種層級關係組成了一種信任鏈(Trust Chain)。

爲了存儲數字證書,Windows中具有相應的證書存儲區(Certificate stores)。根據目的或者信任範圍的不同,不同的證書被存儲於不同的存儲區。關於證書存儲,由於篇幅所限,我不會做過多的介紹,有興趣的朋友可以查閱MSDN在線文檔。對於證書存儲管理,MMC爲你提供一個可視化的管理工具,你也可以通過Certmgr.exe工具已命令行的方式來進行。

在若干證書存儲區中,有一個被稱爲“受信任的根證書頒發機構”(Trusted Root Certification Authorities)的存儲區,它裏面存儲的所有CA證書代表所信任的證書頒發機構。在默認情況下,對於一個待驗證的證書,如果基於該證書CA信任鏈上的任何一個CA在該存儲區中存在一個證書,那麼這個證書是合法的。

創建數字證書

用戶對數字證書的認可決定於對證書頒發機構的信任,所以證書頒發機構決定了數字證書的可用範圍。由於官方認可的數字證書頒發機構,比如VeriSign、Thawte(OpenSSL),具有普遍的信任度,在大部分情況下是理想的選擇。但是對於學習研究或者開發測試,我們沒有必要去購買這些商用證書,採用利用一些工具以手工的方式創建證書。

由於WCF的安全機制廣泛使用到數字證實,我們很有必要學會手工創建數字證書。微軟爲我們提供了一個強大的創建數字證書的工具MakeCert.exe,我們可以藉助這個工具採用命令行的方式創建我們需要的數字證書。MakeCert.exe具有很多命令行開關,限於篇幅的問題不可能對它們一一介紹,在這裏僅僅對幾個常用的開關作一下簡單的介紹,有興趣的讀者可以查閱MSDN在線文檔瞭解MakeCert.exe所有命令行開關的含義,對應的地址爲http://msdn.microsoft.com/zh-cn/library/bfsktky3(v=vs.80).aspx

  • -n x509name:指定主題的證書名稱。最簡單的方法是在雙引號中指定此名稱,並加上前綴CN=,例如,"CN=My Name";
  • -pe:將所生成的私鑰標記爲可導出,這樣可將私鑰包括在證書中;
  • -sr location:數字證書的存儲位置,具有兩個可選值:CurrentUser(和LocalMachine。前者基於當前登錄用戶,後者基於本機;
  • -ss store:數字證書的存儲區;
  • -sky keytype:指定主題的密鑰類型,必須是 signature、exchange 或一個表示提供程序類型的整數。默認情況下,可傳入1表示交換密鑰,傳入2表示簽名密鑰。

比如我通過下面的命令會創建一個主題名稱爲www.artech.com的數字證書,該證書具有交換密鑰類型,並且包含私鑰。

<pre class="prism-token token language-javascript" style="box-sizing: border-box; list-style: inherit; margin: 24px 0px; font: 400 14px/1.45 Consolas, "Liberation Mono", Menlo, Courier, monospace; padding: 16px; overflow: auto; background-color: rgb(247, 247, 247); border-radius: 3px; overflow-wrap: normal; text-align: left; white-space: pre; word-spacing: 0px; word-break: normal; tab-size: 2; hyphens: none; color: rgb(51, 51, 51); letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> 1: MakeCert -n "CN=www.artech.com" -pe -sr LocalMachine -ss My -sky exchange</pre>

一旦上面的命令成功執行,生成的證書會自動保存到基於本機的個人(Personal)存儲區中。你可以通過MMC的證書管理單元(Snap-in)查看該證書, 關於如何通過MMC查看證書,可以參考這個地址:http://msdn.microsoft.com/zh-cn/library/ms788967.aspx。下圖是證書MMC管理單元的截圖,你可以看到我們創建的數字證書已經被存儲到了我們在命令行中指定的存儲區,頒發機構被默認設定爲Root Agency。

<figure style="box-sizing: border-box; list-style: inherit; margin: 20px 0px; display: block; text-align: center; color: rgb(51, 51, 51); font-family: PingFangSC-Light, "hiragino sans gb", "helvetica neue", "microsoft yahei ui", "microsoft yahei", simsun, arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: pre-wrap; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">

image

</figure>

三、通過憑證三個屬性來分析X.509證書

在上面中我們站在非對稱密碼學得角度對數字證書進行了相應的介紹,在這裏我們從用戶憑證的角度進一步地認識數字證書。我們照例採用用戶憑證的三個屬性來分析數字證書。

  • 憑證與申明的一致性:證書的申明反映在於公鑰綁定的於主題相關的信息;
  • 持有人對憑證的擁有性:在絕大部分的認證過程中,都需要被認證方提供的數字證書具有相應的私鑰。私鑰的私有性在某種程度上證明了數字證書持有者就是該證書的擁有者;
  • 證書的合法性:這可以通過頒發者對證書的數字簽名來驗證。

如果被認證方通過一個數字證書作爲用戶憑證,認證方一般採用信任鏈(Trust Chain)模式對其實施認證。在該模式下,認證方從數字證書的直接頒發機構向上追溯,如果具有任何一個頒發機構是受信任的,那麼認證成功。不過,有時我們還是會採用其他的認證模式,比如嚴格比較證書主題信息甚至是序列號。

對於WCF來說,不僅僅客戶端可以將數字證書作爲證明自己身份的憑證,提供給服務端對自己進行認證。也可以將服務和某個數字證書綁定起來,通過證書代表服務的身份,供客戶端進行驗證。總之,數字證書在WCF中具有十分廣泛的應用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章