我有兩臺機器之間的依賴於安全通信的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>
這是一個很好的例子,但它只檢查該客戶端具有有效的證書 - 任何有效的證書。不是嗎?如果不需要的客戶端具有公共部分的根證書,以便它可以驗證服務器的證書,並且不需要的客戶端也具有由VeriSign發佈的自己的證書,則它可以連接,不是嗎?這正是我想要阻止的。 –
@Johan:取決於您在證書中檢查的內容。我相信你可以添加某種序列號或某種東西,只要該密鑰不存在(如果有人設法竊取證書的公共部分),你就不會接受它。 –
證書具有專有名稱,序列號和指紋。我知道如何檢查代碼中的所有三個。我正在尋找一種方法來從app.config中聲明性地執行它,而不是從代碼中強制執行。但是當我問這個問題時,我認爲我的身份驗證和授權混淆了。更好的方法可能是驗證所有可信證書,然後在其上添加某種授權。也許我必須插入一些自定義代碼以某種方式將認證映射到角色,然後依靠基於角色的授權。 –