1、原理
X.509 給出的鑒別框架是一種基於公開密鑰體制的鑒別業務密鑰管理。一個用戶有兩把密鑰:一把是用戶的專用密鑰(簡稱為:私鑰),另一把是其他用戶都可得到和利用的公共密鑰(簡稱為:公鑰)。該鑒別框架允許用戶將其公開密鑰存放在CA的目錄項中。一個用戶如果想與另一個用戶交換秘密信息,就可以直接從對方的目錄項中獲得相應的公開密鑰,用於各種安全服務。
創建X509證書方法較多,在Windows 環境下大致總結了幾中辦法,
1) 通過CA獲取證書,
2) 通過微軟提供的makecert 工具得到測試證書
3) 編程的方法創建,.Net提供了 X509Certificate2 類,該類可以用於創建證書,但只能從RawData中創建,創建后無法修改除FriendlyName以外的任何屬性。
查看生成的證書:
通過在開始菜單-運行-輸入mmc可以選擇證書單元來查看和管理證書,通過微軟的提供的certmgr.exe證書管理工具也可管理證書,和makecert.exe在同一目錄,使用相當簡單,雙擊就可了
網絡安全的四大要 素,即信息傳輸的保密性、數據交換的完整性、發送信息的不可否認性、交易者身份 的確定性
安全證書體制主要采 用了公開密鑰體制,其它還包括對稱密鑰加密、數字簽名、數字信封等技術。
我們可以使用數字證書,通過運用對稱和非對稱密碼體制等密碼技術建立起一套嚴密的身份認證系統,從而保證:信息除發送方和接收方外不被其它人竊取;信息在傳輸過程中不被篡改;發送方能夠通過數字證書來確認接收方的身份;發送方對於自己的信息不能抵賴。
數字證書原理介紹
數字證書采用公鑰體制,即利用一對互相匹配的密鑰進行加密、解密。每個用戶自己設定一把特定的僅為本人所知的私有密鑰(私鑰),用它進行解密和簽名;同時設定一把公共密鑰(公鑰)並由本人公開,為一組用戶所共享,用於加密和驗證簽名。當發送一份保密文件時,發送方使用接收方的公鑰對數據加密,而接收方則使用 自己的私鑰解密,這樣信息就可以安全無誤地到達目的地了。通過數字的手段保證加 密過程是一個不可逆過程,即只有用私有密鑰才能解密。在公開密鑰密碼體制中,常用的一種是RSA體制。其數學原理是將一個大數分解成兩個質數的乘積,加密和解密用的是兩個不同的密鑰。即使已知明文、密文和加密密鑰(公開密鑰),想要推導出解密密鑰(私密密鑰),在計算上是不可能的。按現在的計算機技術水平,要破解目前采用的1024位RSA密鑰,需要上千年的計算時間。公開密鑰技術解決了密鑰發布的管理問題,商戶可以公開其公開密鑰,而保留其私有密鑰。購物者可以用人人皆知的公開密鑰對發送的信息進行加密,安全地傳送給商戶,然后由商戶用自己的私有密鑰 進行解密。
2、WCF中使用X509證書
1) 創建WCF服務應用以及調用客戶端。
2) 創建客戶證書和服務端的X509證書
在VS2008 的DOS命令提示中,輸入下面的指令即可創建相關的服務器和客戶端證書
makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=ParkingClient -sky exchange -pe
E:\TFS\Makecert\makecert.exe -n "CN=test" -a sha1 -cy authority -r -sr LocalMachine -ss AuthRoot -sky exchange -e 12/31/2099 -pe //demo 設置過期時間,保存地址,頒發者
下面是各種參數的介紹
| 屬性 |
解析 |
| -sr |
指定的證書存儲區中的注冊表位置。 |
| -ss |
指定證書存儲的位置。 |
| -a |
指定相關的算法,可以選擇 MD5 算法或者 SHA1算法 |
| -n |
指定證書的名稱。該名稱遵循X.500命名標准。簡單例子如 "CN=MyName" 格式,如果沒有指定/n開關,證書默認的名稱是"Joe's Software Emporium"。 |
| -sky |
證書鍵類型。可以設置為 exchange 或者 signature。 |
| -pe |
證書可導出 |
3、檢查證書是否生成成功

4、給IIS賦予訪問私鑰的權限
1)證書的私鑰文件在計算機上的存儲位置?
Windows xp存放在:C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys
Windows vista存放在:C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
2) 哪個文件才是我們要找的證書的私鑰文件?
Crypto\RSA\MachineKeys 這個文件里可能有很多文件,有幾種方法可以確定。
1)根據文件的修改日期
2)如果根據文件的修改日期,不能確定是哪個文件,可以使用FindPrivateKey這個工具來獲取證書的完整路徑。
FindPrivateKey 工具需要證書存儲區名稱、證書存儲區位置以及可以唯一標識此證書的信息。
FindPrivateKey 工具接受將證書的主題名稱或其指紋作為唯一標識符。
下面的代碼示例使用 FindPrivateKey 工具來確定指紋為
46 dd 0e 7a ed 0b 7a 31 9b 02 a3 a0 43 7a d8 3f 60 40 92 9d
的證書的私鑰在 LocalMachine 的 My 存儲區中的位置:
findprivatekey.exe My LocalMachine -t "46 dd 0e 7a ed 0b 7a 31 9b 02 a3 a0 43 7a d8 3f 60 40 92 9d" -a
3)哪里獲取 FindPrivateKey 這個工具?
這里是 FindPrivateKey 的源代碼:FindPrivateKey.7z
如何把證書私鑰文件的讀訪問權限授予WCF所使用的帳戶?
1)通過資源管理器->文件屬性->安全,來設置證書私鑰文件讀訪問權限
2)使用 cacls.exe 等工具來設置證書私鑰文件讀訪問權限。
下面的代碼示例編輯 (/E) 指定文件的訪問控制列表 (ACL),以向“NETWORK SERVICE”帳戶授予 (/G) 對此文件的讀 (:R) 訪問權限:cacls.exe "C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\8aeda5eb81555f14f8f9960745b5a40d_38f7de48-5ee9-452d-8a5a-92789d7110b1" /E /G "NETWORK SERVICE":R
3) 配置服務端的配置文件,使之使用X509證書服務。
<behavior name="behavior0"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> <serviceCredentials> <clientCertificate> <authentication certificateValidationMode="None"/> </clientCertificate> <serviceCertificate findValue="TestX509Server" storeLocation="LocalMachine" x509FindType="FindBySubjectName" storeName="My"/> </serviceCredentials> </behavior>
4、 授權IIS訪問服務器證書
只需要給相應的賬號分配權限即可,這里IIS訪問證書密鑰的權限可以通過WinHttpCertCfg.exe來處理,只需要通過命令行執行該程序即可,如下所示。
winhttpcertcfg -g -c LOCAL_MACHINE\My -s ParkingServer -a "NETWORKSERVICE"
winhttpcertcfg 命令:
winhttpcertcfg -l -c LOCAL_MACHINE\My -s ParkingServer -a "NETWORKSERVICE"
給IIS的NETWORKSERVICE賬戶以基於證書名稱模式授權
winhttpcertcfg -g -c LOCAL_MACHINE\My -s ParkingServer -a "NETWORKSERVICE"
給IIS的NETWORKSERVICE賬戶以基於證書文件模式授權
winhttpcertcfg -g -i "ParkingServer.pfx" -c LOCAL_MACHINE\My -a "NETWORKSERVICE" -p
移除賬號對於證書的授權
winhttpcertcfg -r -c LOCAL_MACHINE\My -s ParkingServer -a "NETWORKSERVICE"
5、 在服務器證書管理中導入服務器端證書
6、 在客戶端導入客戶端證書,完成X509證書配置並調用服務。
<behavior name="behavior0"> <clientCredentials> <clientCertificate findValue="TestX509Client" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My"/> <serviceCertificate> <authentication certificateValidationMode="None"/> </serviceCertificate> </clientCredentials> </behavior>
證書authentication (服務器與客戶端)共有四種:
None= 未執行任何證書驗證
PeerTrust=如果證書位於被信任的人的存儲區中,則有效
ChainTrust=如果該鏈在受信任的根存儲區生成證書頒發機構,則證書有效
PeerOrChainTrust=如果證書位於被信任的人的存儲區或該鏈在受信任的根存儲區生成證書頒發機構,則證書有效
Custom=用戶必須插入自定義 X509CertificateValidator 以驗證證書(這種模式很有意思,后面會提到)
7、使用X509證書加密與不加密的區別如下:


