WCF分散式安全開發實踐(1):傳輸安全模式之匿名客戶端:Transport_None_WSHttpBinding

iDotNetSpace發表於2009-08-13
    WCF分散式安全開發實踐(1):傳輸安全模式之匿名客戶端:Transport_None_WSHttpBinding 
    主要是傳輸安全模式的None身份驗證方式,基於WSHttpBinding繫結協議。主要內容:先介紹傳輸安全模式之匿名客戶端基本概念,然後是製作證書、SSL證書設定、服務端配置、客戶端配置、總結等內容。Xp Window Server 2003要使用httpcfg來配置SSL埠證書。在 Windows Vista 中,使用 Netsh.exe 工具檢視當前埠配置。
    先來介紹一下此傳輸安全工作模式的原理。為什麼傳輸安全要使用證書?
    SSL安全套接字層一個資料傳輸加密機制,它可以確保在客戶機與伺服器之間傳輸的資料仍然是安全與隱密的。傳輸安全 (HTTPS) 確保保密性和完整性。使用安全套接字層 (SSL) 證書對伺服器進行身份驗證,並且客戶端必須信任伺服器的證書。對客戶端不通過任何機制進行身份驗證,因此是匿名的。SSL 廣泛用於 Internet 中,以便向客戶端證明服務的身份,並且隨後向通道提供保密性(加密)。這裡要經過三次握手以後,客戶端和服務端建立安全套接字連線。在握手期間,服務還將其 SSL 證書傳送到客戶端。該證書包含一些資訊,例如證書的到期日期、頒發機構以及網站的統一資源識別符號 (URI)。客戶端將該 URI 與它原來聯絡的 URI 進行比較,以確保二者匹配,並且對日期和頒發機構進行檢查。客戶機和伺服器對它們將要為此會話使用的金鑰及加密方法達成一致。客戶機使用伺服器證書驗證伺服器。握手之後,SSL 被用來加密和解密 HTTPS(組合 SSL 和 HTTP 的一個獨特協議)請求和伺服器響應中的所有資訊。這個就是為什麼WCF傳輸安全需要使用證書的原因,客戶端可以不進行身份驗證。但是要有一個伺服器證書來保證客戶端和伺服器之間能夠建立SSL安全套接字連線。
    瞭解了SSL的工作原理以後,我們在來進行WCF傳輸安全模式的無身份驗證的實踐程式設計工作。這裡還是從證書的製作和安裝開始,一直介紹到程式的執行。證書製作大家看過前面的文章,應該不會太陌生,主要關鍵的地方在SSL埠證書的配置。因為不實際操作是不會遇到這個問題的,而且XP ,Windows和Vista使用的工具還不一樣。設定錯誤就會出現異常。
【1】製作證書:
(1)使用makecert 工具:Microsoft Visual Studio 2008–>Visual Studio Tools–>Visual Studio 2008 命令提示行。
輸入:makecert -sr localmachine -ss My -n CN=WCFServerPK -sky exchange -pe -r



輸入:makecert -sr localmachine -ss My -n CN=WCFClientPK -sky exchange -pe -r。
-這裡製作了連個證書,主要只使用一個WCFServerPK,可以到出金鑰檔案pfx,後續我們要匯入到其他儲存區,設定為信任的證書。WCFClientPK -是為以後文章準備的,也是可以設定為信任的證書。

 (2) 開啟瀏覽器—->Internet 選項—–>內容—–>證書—–>個人,預設是儲存到當前使用者CurrentUser,你會看到剛才製作的證書。這個可以檢視部分證書,但是功能有限。我們還是使用控制檯證書管理工具。

 (3)使用MMC建立證書控制單元檢視證書的資訊:

  開始–執行–MMC–控制檯–新增刪除單元–證書–當前使用者和計算機各新增一個。能檢視和管理CurrentUser和LocalMachine的證書。如圖:
(4)匯入證書到信任的人和信任的CA機構裡。步驟如下:

    1.匯出證書檔案,帶金鑰的pfx檔案。使用mmc,儲存到桌面位置(方便查詢)。這裡記住你製作證書的密碼。要使用。

    2.匯入證書到信任的人。使用任務-匯入嚮導–選擇證書檔案,匯入即可。

    3.匯入證書到信任的機構,使用任務-匯入嚮導–選擇證書檔案,匯入即可。這個證書就被信任了。

【2】SSL證書設定:

   下面我們來設定SSL埠證書,這個步驟很重要。不然客戶端無法查詢到WCF服務。

【2.1】查詢SSL證書設定:

     需要為使用的埠SSL註冊證書。Windows Server 2003 或 Windows XP,則使用 HttpCfg.exe 工具。Windows Server 2003 中已安裝該工具。下載該工具/Files/frank_xl/HttpcfgFrankXuLei.rar。如果執行的是 Windows Vista,則使用已安裝的 Netsh.exe 工具。在WindowsSystem32目錄下。執行此工具需要命令視窗切換到相應工具解壓縮目錄下,我直接放置到D盤根目錄。方便查詢。

     (1)在 Windows Server 2003 或 Windows XP 中,通過 query 和 ssl 開關使用 HttpCfg.exe 工具檢視當前埠配置,在命令視窗切換到HttpCfg在檔案目錄,你如下面程式碼:
        httpcfg query ssl

  
  (2)Vista:
       netsh http show sslcert
    查詢SSL埠證書設定資訊,如圖:


如果沒有設定,這裡的資訊為空。長串數字是證書的指紋值,也叫縮圖,就是證書的身份證號。這個是唯一的。

【2.2】設定SSL證書:

    (1)在 Windows Server 2003 或 Windows XP:
       httpcfg set ssl -i 0.0.0.0:9001-h 9174185b2860b6d5ec3de133d5fcc4e1419b09e5
    (2)Vista:
       netsh http add sslcert ipport=0.0.0.0:9001 certhash=9174185b2860b6d5ec3de133d5fcc4e1419b09e5

  appid={111111111-2222-3333-4444-qqqqqqqqqqqqq} 。最後一個GUID.你可以隨便編寫一個。使用工具也可以。certhash 引數指定證書的指紋。ipport 引數指定 IP 地址和埠,功能類似於前述 Httpcfg.exe 工具的 -i 開關。appid 引數為可用於標識所屬應用程式的 GUID。
 【2.3】刪除SSL證書:
    (1)Windows Server 2003 和 Windows XP 中:
    httpcfg delete ssl -i 0.0.0.0:9001-h 9174185b2860b6d5ec3de133d5fcc4e1419b09e5
    (2)Vista:
    Netsh http delete sslcert ipport=0.0.0.0:9001。
【3】服務端配置:
    SSL埠證書配置完成以後,我們就要對WCF服務端進行配置,直接使用配置檔案,這裡簡單。也可以使用程式碼來完成。

    (1)服務類定義:

     這裡服務類就一個方法就是更具使用者的name來列印呼叫時間,程式碼如下:
 //1.服務契約
    [ServiceContract(Namespace = http://www.cnblogs.com/frank_xl/)]

    
public interface IWCFService

    {

        
//操作契約
        [OperationContract]

        
string SayHello(string name);


    }

    
//2.服務類,繼承介面。實現服務契約定義的操作
    public class WCFService : IWCFService

    {

        
//實現介面定義的方法
        public string SayHello(string name)

        {

            Console.WriteLine(
Hello! {0},Calling at {1} , name,DateTime.Now.ToLongTimeString());

            
return Hello!  + name;

        }

    }
    (2)傳輸安全模式配置:

       使用傳輸安全模式,不採用客戶端身份驗證策略。配置資訊如下:
   <wsHttpBinding>

      
<binding name=BindingConfiguration>

        
<security mode=Transport>

          
<transport clientCredentialType=None/>

        
</security>

      
</binding>

    
</wsHttpBinding>
   這個配置要應用到服務的終結點配置上。才會生效。

    (3)證書使用:

    在服務行為節點屬性裡配置使用證書WCFServerPK,配置資訊如下:
<serviceBehaviors>

        
<behavior name=WCFService.WCFServiceBehavior>

          
<serviceMetadata httpsGetEnabled=true />

          
<serviceDebug includeExceptionDetailInFaults=false />

          
<serviceCredentials>

              
<serviceCertificate  storeName=My  x509FindType=FindBySubjectName findValue=WCFServerPK storeLocation=LocalMachine/>

          
</serviceCredentials>

        
</behavior>

      
</serviceBehaviors>
【4】客戶端配置:
    (1)引用後設資料:

    因為服務的後設資料交換節點啟用了Https協議,我們在客戶端專案新增後設資料地址https://computer:9001/mex查詢服務資訊的時候,會提示SSL證書資訊,介面如下:
    這個證明我們的服務端證書設定已經起作用,而且是可信的。現在我們點選Yes。繼續就會新增完畢服務引用。過程和普通的新增服務後設資料引用一樣,會產生客戶端相關程式碼檔案。輸入NameSpace,等待完成即可。   

(2)測試程式碼:

    等待程式碼生成結束,我們這裡就直接生成客戶端代理類的例項來呼叫服務進行測試。程式碼簡單如下:


                WCFClient.ClientProxy.WCFServiceClient wcfServiceProxyHttp 
= new WCFClient.ClientProxy.WCFServiceClient(WSHttpBinding_IWCFService);

                
//通過代理呼叫SayHello服務
                string sName = Frank Xu Lei Transport None WSHttpBinding;

                
string sResult = string.Empty;
                Util.SetCertificatePolicy();//強制信任證書。重寫驗證服務端證書的方法。
                sResult = wcfServiceProxyHttp.SayHello(sName);

                Console.WriteLine(
Returned Result is {0}, sResult);
    (4)測試結果:

    啟動宿主程式,然後啟動客戶端程式,稍作等待,就會看到宿主列印的訊息,正確呼叫成功,如圖:
【5】總結

    學習了本節Transport安全模式的無身份認證的模式以後,我們就會了解傳輸安全模式為什麼必須使用證書了。而且為什麼它只能保證點對點的訊息安全。因為Transport安全模式需要使用證書來建立SSL傳輸層,證書用來實現資料的加密和安全性。

   (1)這個None身份驗證模式,有多種叫法,比如匿名客戶端身份驗證的傳輸安全。大家注意理解,都是指的是一個意思。不注意的話很容易和別的概念混淆,而理解為一種新的安全實現方式。

   (2)此節示例,看著簡單,只是幾個步驟就可以完成,但是實際操作很容易出錯,尤其是SSL證書如果不瞭解或者配置不當,整個程式在除錯過程中會遇到很多問題。不過大家也要調整好心態,遇到的問題越多,基本學習的收穫也就越大。

   (3)最後給出參考程式碼下載:
/Files/frank_xl/1.1.WCFServiceSecurityDemoFrankXuLei_Transport_None_WSHttpBinding.rar

    這裡的繫結協議是WSHttpBinding,其它的BasicHttpsBinding等協議大家可以根據需要擴充套件。我這裡就不給出實現了。

重要的是大家理解這個安全模式的原理和實現過程。無論學習還是實際運用都會有個參考。

   謝謝。

參考文章:

0.WCF分散式安全開發實踐(10):訊息安全模式之自定義使用者名稱密碼:Message_UserNamePassword_WSHttpBinding 
1.WCF分散式開發常見錯誤(22):The caller was not authenticated…如何在XP系統為WCF設定可信任的證書 
2.WCF分散式開發常見錯誤(21):unable to open its IChannelListener.分發器未能開啟偵聽器 
3.http://social.microsoft.com/Forums/zh-CN/wcfzhchs/thread/e1aa7bea-90d8-41e6-b91b-7addba44f8e3
4.WSE3.0構建Web服務安全(2):非對稱加密、公鑰、金鑰、證書、簽名的區別和聯絡以及X.509 證書的獲得和管理,具體5.http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cptools/html/cpgrfcertificatecreationtoolmakecertexe.asp
6.Httpcfg 語法:http://technet.microsoft.com/zh-cn/library/cc781601(WS.10).aspx
7.安全套接字層(SSL)-安全套接字層(SSL)簡介:http://www.hudong.com/wiki/%E5%AE%89%E5%85%A8%E5%A5%97%E6%8E%A5%E5%AD%97%E5%B1%82%28SSL%29#1



 本文轉自 frankxulei 51CTO部落格,原文連結:http://blog.51cto.com/frankxulei/320345,如需轉載請自行聯絡原作者



相關文章