2010-02-16 48 views
4

我有兩臺機器之間的依賴於安全通信的WCF客戶端/服務的應用程序標識的單個客戶端,我想使用已安裝在證書存儲在使用X509證書相互識別服務器和客戶端。我通過將綁定配置爲<security authenticationMode="MutualCertificate"/>來完成此操作。只有客戶端機器。如何配置WCF服務,只接受由X509證書

服務器具有頒發給server.mydomain.com安裝在本地計算機/個人存儲中的證書和客戶端發出client.mydomain.com安裝在同一個地方的證書。除此之外,服務器在本地計算機/受信任的人員中擁有客戶端的公共證書,並且客戶端在本地計算機/受信任的人員中擁有該服務器的公共證書。

最後,客戶端已配置爲檢查服務器證書。我在配置文件中使用了system.servicemodel/behaviors/endpointBehaviors/clientCredentials/serviceCertificate/defaultCertificate元素。

到目前爲止好,這一切工作。我的問題是,我想在服務器的配置文件中指定只允許客戶端使用來自Trusted People證書存儲區的client.mydomain.com證書進行身份驗證。

使用ServiceSecurityContext在服務器上提供了正確的信息,但我正在尋找一種方法來在app.config中指定WCF應該執行此檢查,而不是從代碼檢查安全上下文。

這可能嗎?任何提示將不勝感激。

順便說一句,我的服務器的配置文件看起來像這樣至今:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <services> 
     <service name="MyServer.Server" behaviorConfiguration="CertificateBehavior"> 
     <endpoint contract="Contracts.IMyService" binding="customBinding" bindingConfiguration="SecureConfig"> 
     </endpoint> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost/SecureWcf"/> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="CertificateBehavior"> 
      <serviceCredentials> 
      <serviceCertificate storeLocation="LocalMachine" x509FindType="FindBySubjectName" findValue="server.mydomain.com"/> 
      </serviceCredentials> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <customBinding> 
     <binding name="SecureConfig"> 
      <security authenticationMode="MutualCertificate"/> 
      <httpTransport/> 
     </binding> 
     </customBinding> 
    </bindings> 
    </system.serviceModel> 
</configuration> 

回答

2

似乎沒有成爲一個辦法做到我想用什麼樣的web.config。

我最終加入了行爲與此標籤:

<clientCertificate> 
    <authentication certificateValidationMode="PeerTrust" trustedStoreLocation="CurrentUser" revocationMode="NoCheck"/> 
</clientCertificate> 

然後在客戶端的證書添加到服務器運行的用戶的「信任的人」證書存儲區。

1

退房Codeplex上的WCF Security Guidance頁面 - 優秀的,非常有用的東西!

特別是,檢查出的操作方法的甚至更具體的

How To – Use Certificate Authentication and Message Security in WCF calling from Windows Forms

它解釋的很詳細瞭如何設置要求客戶出示有效證書WCF服務,如何檢查。如果您只想允許單個客戶端,則只將該證書專門部署到該單個客戶端。

希望這會有所幫助!

+0

這是一個很好的例子,但它只檢查該客戶端具有有效的證書 - 任何有效的證書。不是嗎?如果不需要的客戶端具有公共部分的根證書,以便它可以驗證服務器的證書,並且不需要的客戶端也具有由VeriSign發佈的自己的證書,則它可以連接,不是嗎?這正是我想要阻止的。 –

+0

@Johan:取決於您在證書中檢查的內容。我相信你可以添加某種序列號或某種東西,只要該密鑰不存在(如果有人設法竊取證書的公共部分),你就不會接受它。 –

+0

證書具有專有名稱,序列號和指紋。我知道如何檢查代碼中的所有三個。我正在尋找一種方法來從app.config中聲明性地執行它,而不是從代碼中強制執行。但是當我問這個問題時,我認爲我的身份驗證和授權混淆了。更好的方法可能是驗證所有可信證書,然後在其上添加某種授權。也許我必須插入一些自定義代碼以某種方式將認證映射到角色,然後依靠基於角色的授權。 –