程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WCF安全之X509證書

WCF安全之X509證書

編輯:關於.NET

概述

Windows Communication Foundation (WCF) 是 Microsoft 為構 建面向服務的應用程序而提供的統一編程模型(摘自MSDN),在分布式環境下的 安全問題尤為重要,如果你覺得使用了WCF默認的安全措施可以讓你高枕 無憂,那明天你可就以回家種田了,當然,對於學習來說,足夠了~,但我們講的是真 正的項目應用,WCF在各種協議下的安全提供和保證是不盡相同的。

X509 證書介紹

X.509 是由國際電信聯盟(ITU-T)制定的數字證書標准,相信 這是人盡皆知的了,目前X.509證書據我所知有三個版本,.net中使用的是 x.509-2,X.509-2 版引入了主體和簽發人唯一標識符的概念,以解決主體和/或 簽發人名稱在一段時間後可能重復使用的問題,x509-2(以下簡稱x509)證書由兩 把鑰匙組成,通常稱之為密鑰對,公鑰加密,私鑰解密。今天我想在這裡對x509 進行一個深入的介紹和了解,因為在WCF的安全體系中,x509證書應用是非常頻繁的,或者說是不可缺少的。

1、如何生成證書?

使用微軟提供的Makecert.exe測試證書生成工具可以很好的幫助我們得到一個x509標准證書,具體方法如下:下載Makecert.exe或者定位到你的計算機目錄:C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin下,找找就看見了,我強烈建議你copy Makecert.exe到一個單獨的目錄中,如copy到D:\\cers。

現在點擊開始菜 單-運行-輸入cmd,運行控制台應用程序,定位到D:\\cers,在控制台輸入: makecert -r  -pe  -$  individual -n “CN=mailSecurity” -sky exchange -sr currentuser -ss my mailSecurity.cer,即可在當前用戶 證書存儲區下的個人區中生成一個名為mailSecurityr的x509證書,並在當前目 錄輸出了證書文件mailSecurity.cer,以下簡單介紹一下各種參數意義,更復雜 的參數請參考:證書創建工具幫助

makecert 證書工具名

-r   表示即將生成的證書是自我簽署的,自己給自己發獎(這裡主要是指頒發機構)

-pe  表示將所生成的私鑰標記為可導出。這樣可將私鑰包括在證書中

-$  證書是個人用還是商用(individual/commercial)老美就是搞啊 ,這玩意用美元符號還真是形象得很。

-n  表示證書主題,你就當它 是標題吧,不管你取什麼名字,必須包含CN=前綴

-sky  指定主題的 密鑰類型,必須是 signature、exchange 或一個表示提供程序類型的整數。默 認情況下,可傳入 1 表示交換密鑰,傳入 2 表示簽名密鑰

-sr  指定 主題的證書存儲位置。Location 可以是 currentuser(默認值)或 localmachine(實際是必須是這兩個中的一個值)

-ss  指定主題的證 書存儲名稱,輸出證書即存儲在那裡

mailSecurity.cer  證書名稱,不 必與主題一致,不過建議你還是致的好。

通過在開始菜單-運行-輸入mmc 可以選擇證書單元來查看和管理證書,通過微軟的提供的certmgr.exe證書管理 工具也可管理證書,和makecert.exe在同一目錄,使用相當簡單,雙擊就可了, 當然你還可以通過命令行模式來運行它,在微軟的很多批處理文件中就很好的體 現了這一點,具體使用參見:證書管理器工具

2、證書中都包含些什麼秘 密?

首先我們必須知道的是:微軟提供的證書生成工具給我們准備了兩 種密鑰算法(MD5/SHA1)我們可以在生成證書的時候指定,如果沒有指定,則默 認使用MD5算法。但是我當我用SHA1算法生成證書的時候,奇怪的事情發生了, 看下圖。

公鑰加密強度為:1024

算法簽名:sha1RSA

版本:V3

3、看到這裡,我想我們都很想知道,為什麼會這樣?不是采用的 SHA1算法嗎?為什麼算法簽名為:sha1RSA?

看來,在這裡不得不提到 RSA算法提供程序,看看微軟的官方說明:如果安裝了 Microsoft Enhanced Cryptographic Provider,則 RSACryptoServiceProvider 支持長度從 384 位 至 16384 位(增量為 8 位)的密鑰。如果安裝了 Microsoft Base Cryptographic Provider,則支持長度從 384 位至 512 位(增量為 8 位)的 密鑰。

本機肯定是安裝了Microsoft Enhanced Cryptographic Provider 的,因為我今天剛測試過了,用最長密鑰長度生成密鑰,時間可能你都不敢想, 看圖說話算了。

幾近7分鐘,長度16384位。

RSA加密過程:

RSACryptoServiceProvider rsa = new  RSACryptoServiceProvider(16384);

UnicodeEncoding ue = new  UnicodeEncoding();

byte[] encryptdata = ue.GetBytes("你 好,很高興認識你~。");

rsa.ImportParameters (rsa.ExportParameters(true));

byte[] data = rsa.Encrypt (encryptdata, false);

byte[] dedata = rsa.Decrypt(data,  false);

string dstr = ue.GetString(dedata);

4、從這裡可 以看出,我們證書所能生成的密鑰長度還可以很長,當你使用SHA1算法生成證書 時,makecert默認加密強度為1024位,加密後的內容長度為128位,很標准的, 當然,你還可以用上面的代碼測試其它長度,但請注意,每個長度增量為8位, 如1024位,下一個長度為:1024+8=1032,指定密鑰長度必須符合增量規范。

5、證書存儲位置選擇

有朋友也許認為,證書存儲位置一般不都 是照搬微軟的那一套嘛,其實不然,有以下幾種情況是我們在真正的項目應用中 不容忽視的。

開發模式:開發模式時,為方便我們一般都采用控制台作 為WCF服務的宿主,意味著當前運行的帳戶權限為當前賬戶,估計多半是管理員 權限了,這個時候你是不用擔心你的證書存儲在哪裡的,只要你的證書生成了就 好,實際真的就是這麼回事,當你將你的WCF安全配置更改一下,看代碼了:

<serviceCredentials>
<clientCertificate>
<authentication  certificateValidationMode="PeerTrust"/>
</clientCertificate>
</serviceCredentials>

如果你的證書現在不受信任, 如果你還過得了服務,你就牛X了。 證書authentication (服務器與客戶端) 共有四種:

None= 未執行任何證書驗證

PeerTrust=如果證書位於 被信任的人的存儲區中,則有效

ChainTrust=如果該鏈在受信任的根存儲 區生成證書頒發機構,則證書有效

PeerOrChainTrust=如果證書位於被信 任的人的存儲區或該鏈在受信任的根存儲區生成證書頒發機構,則證書有效

Custom=用戶必須插入自定義 X509CertificateValidator 以驗證證書( 這種模式很有意思,後面會提到)

實際上,只要你把信任模式更改為: None,證書放在哪裡都無所謂了。

2、部署模式

我強烈推薦以 windows service作為WCF宿主,不論從效率或者安全及穩定性上來說,windows service都是最棒的,特別是你的WCF服務還是以TCP命名管道作為主要通信手段 的時候,windows servcie就更值得你考慮了,先不要說IIS6.0不支持TCP協議先 。

在以windows servcie方式運行WCF host的時候,你首先會碰上第一個 問題,找不到證書,一般都會提示你,不能以下列搜索標准找到證書,該進程必 須具有對私鑰的訪問權限,哥們,聽我一句話,在這個時候,你就千萬不要相信 人雲亦雲的通過微軟的FindPrivateKey工具找到證書文件,給LOCAL SERVICE訪 問權限,你不信去試試,問題依舊。

實際上產生這個問題的原因很搞笑 ,只是因為你在開發時總是使用同一個證書,想當然的部署的時候只是用一個證 書,如果你一開始就用兩個證書,客戶端和服務器之間利用證書時行相互認證和 加密,那你應該是沒有問題的,以下第一條是很嚴肅的原則。

(1)以 windows servcie作為WCF Host宿主,如果采用了消息加密策略,並啟用了X509 證書安全,那X509證書的安裝位置必須為LocalMachine,同時,證書應位於 TrustedPeople位置中。

(2)這只是最基本的要求,不要把它當作教條 ,實際上,證書必須存儲在LocalMacnine是沒錯的,但是位置就應該按你的 <authentication  certificateValidationMode="PeerTrust"/>策略來調整了,如果 你把證書放在了:ROOT(受信任的根證書頒發機構),你再把證書放到哪裡去都 是沒有問題,甚至可以放到My(個人)區中。

(3)同時,你還應當把客 戶端證書復制到受信任的證書人區域中,最基本的嘛,當然,這還是和安全策略 有關。

(4)客戶端和服務器使用證書進行相互認證,並在真正意義上使 用了不對稱加密,關於客戶端和服務相互認證,下次再說吧,我覺得有點長了。

3、當你啟用安全策略時的思考

千萬記住,安全策略決定著你的 服務安全級別,當然也不是越高越好,你剛才也看到了,光是生成個密鑰就用了 7分鐘,很難消受得起的嘛~~,是不?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved