2009-12-18 46 views
2

我最近開發了一個WCF Facade服務。我是WCF的新手,無法理解安全實現部分。如何使用證書來保護3跳WCF外觀服務?

該服務如下:

  • 一個asp.net公共網站具有WCF客戶端,它訪問:一個DMZ,內
  • 甲WCF門面服務這又充當客戶端來訪問:
  • 內部網絡WCF服務

所有服務目前正在使用的WSHttpBinding。

我想在所有3個服務器之間使用X.509證書進行客戶端/服務器身份驗證(即公共客戶端應用程序和門面服務使用證書相互進行身份驗證,門面客戶端和內部服務使用證書相互進行身份驗證)。

有人可以一步一步解釋在生產環境中需要做些什麼來保證這一點?我所引用的每篇文章和書籍都解釋了makecert.exe的使用,但並未解釋使用來自真實CA的生產證書。我知道這可能很容易,但我似乎無法圍繞所需的概念包圍我的頭。

從受信任的CA獲得用戶訪問公共網站的SSL證書和SAN SSL證書,該證書可通過主題替代名稱應用於多達4個域名。如果我需要使用makecert.exe等來創建客戶端證書,我仍然對身份驗證感到困惑。

理想情況下,所有服務/客戶端配置都在app/web.config(無代碼)內。我擁有對所有三臺服務器(公共Web服務器,Facade/dmz服務器,內部Web服務器)的完全管理權限。

任何洞察力或指導將非常感激!

編輯基於評論提供更多的細節:

  • IIS 6
  • 用戶身份驗證,則無須對面向公衆的網站上的所有服務器。基本上,公衆訪問者將輸入信息的形式,由服務處理和處理。不需要認證。
  • 付費EV SSL證書將用於確保公共訪問者和網站之間的交互。

我感興趣的是如何在不同的WCF客戶端/服務之間實現雙向認證/身份驗證。所以:

    公共服務器和WCF服務門面/ DMZ服務器上
  • WCF客戶端相互識別和相互使用證書認證
  • 內部服務器上的門面/ DMZ服務器和WCF服務
  • WCF客戶端,然後還互相識別並使用證書對彼此進行身份驗證。

我從受信任的CA(DigiCert)獲得靈活的SAN證書,如果可能的話,我希望使用它來進行身份驗證。它可以通過主題替代名稱支持多達4個DNS條目。

感謝您提供任何幫助!

+0

一些問題,制約了答案: - 是服務的所有IIS託管,自託管瓦特/的ServiceHost,或組合? - 您是否期望客戶端身份驗證信息通過不同的層,或者您是否正在執行受信任的子系統模型,其中唯一的「變量」憑據位於公共站點上,那麼後端服務器具有固定的客戶端證書? - 您是否需要根據客戶端證書進行任何類型的授權,或者僅僅是由您的CA簽署的客戶端證書的存在足以完全訪問? - 您打算如何爲最終用戶頒發客戶端證書(Windows CA,makecert,付費威瑞信)? – nitzmahone 2009-12-19 02:45:50

+0

另外,我不清楚最終用戶是否使用證書,或者您是否有其他身份驗證機制,並且只想通過證書通過相互身份驗證來保護服務器 - 服務器通信。 – nitzmahone 2009-12-19 02:47:19

回答

1

經過大量調查和反覆試驗後,我想我已經圍繞這個問題進行了研究並找到了解決方案。

由於我使用簡單的SSL解決方案(具有多個名稱的SAN證書以同時保護內部Web服務器和DMZ服務器),因此我可以將相同的證書導入本地計算機\個人計算機和本地計算機\人們將這些服務器存儲在公共服務器的可信人員存儲區中。

從那裏,在配置中,我選擇使用傳輸和消息安全性(TransportWithMessageCredential)的組合來執行HTTPS和通過證書的消息級加密。

生成的服務行爲的配置:

<serviceBehaviors> 
    <behavior name="MyCustomBehavior"> 
    ... 
    <serviceCredentials> 
    <serviceCertificate findValue="MySANCertName" 
         x509FindType="FindBySubjectName" 
         storeLocation="LocalMachine" 
         storeName="My" />    
    </serviceCredentials> 
    ... 
    </behavior> 
</serviceBehaviors> 

和綁定:

<wsHttpBinding> 
    <binding name="MyWsBinding"> 
    <security mode="TransportWithMessageCredential"> 
     <message clientCredentialType="Certificate"/> 
    </security> 
    </binding> 
</wsHttpBinding> 

我用另外一個事情,可能是有用的那些誰有與證書認證的麻煩是打開審計:

<serviceBehaviors> 
    <serviceSecurityAudit 
    auditLogLocation="Application" 
    messageAuthenticationAuditLevel="SuccessOrFailure" 
    serviceAuthorizationAuditLevel="SuccessOrFailure" 
    suppressAuditFailure="false" /> 
    </behavior> 
</serviceBehaviors> 

以下參考文獻對我最有幫助mplementing我的解決方案:

http://notgartner.wordpress.com/2007/09/06/using-certificate-based-authentication-and-protection-with-windows-communication-foundation-wcf/ http://www.codeproject.com/KB/WCF/wcf_certificates.aspx?display=Print Essential Windows Communication Foundation For .NET Framework 3.5