我如何configurationWCF通过互联网使用x509证书?

我需要使用x509证书通过互联网从富客户端获得安全的消息级别身份validation才能获得安全的WCF Web服务。

具体而言,我正在寻找设置,configuration,编码和部署的分步指南,包括创build“开发”证书,安装它,以及获取“真实”生产证书。

以下步骤是开始的一个指南:

1)首先,您需要一个Root Authority来生成您的客户端和服务器证书。 您可以使用外部授权机构(例如Verisign),也可以使用Microsoft Certificate Server等软件生成自己的授权。

要生成一个开发根权限证书,您可以使用Visual Studio附带的“makecert”工具,例如

makecert -n "CN=MyRootCA" -r -sv RootCA.pvk RootCA.cer 

2)然后您需要请求/生成您的客户端和服务器证书。 这两种证书都可以作为本地机器证书进行安装,并且都需要使用相同的root权限进行签名。 您可以从Microsoft证书服务器的Web界面请求客户端证书,例如http://mycertserver/certsrv

要为每台机器生成一个开发客户端证书,您可以再次使用“makecert”。 请注意,客户端证书使用步骤1中创build的开发Root Authority证书进行签名。

 makecert -pe -n "CN=MyCert" -ss my -sky exchange -sk MyCert -iv MyRootCA.pvk -ic MyRootCA.cer -sr localmachine MyCert.cer 

这会将运行该命令的机器上的证书安装到本地计算机存储中的个人证书文件夹中。

为了让服务器信任客户端证书,您将需要在服务器的受信任的根证书颁发机构存储中安装开发Root Authority证书(使用mmc证书pipe理单元执行此操作)。 客户还应该以相同的方式安装根证书,以便相信自己的证书。

3)configuration你的WCF服务,要求使用证书进行客户端authentication(例如通过web.config)。

 <services> <service name="TestService" behaviorConfiguration="wsHttpCertificateBehavior"> <endpoint name="TestEndPoint" address="" binding="wsHttpBinding" bindingConfiguration="wsHttpEndpointBinding" contract="TestService.IMyContract"> <identity> <dns value=""/> </identity> </endpoint> <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/> </service> </services> <bindings> <wsHttpBinding> <binding name="wsHttpEndpointBinding"> <security mode="Message"> <message clientCredentialType="Certificate"/> </security> </binding> </wsHttpBinding> </bindings> <behaviors> <behavior name="wsHttpCertificateBehavior"> <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"/> <serviceCredentials> <clientCertificate> <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck"/> </clientCertificate> <serverCertificate findValue="CN=MyCert"/> </serviceCredentials> </behavior> </behaviors> 

4)现在configuration调用者(例如通过app.config)。

 <client> <endpoint name="wsHttpBinding" address="https://localhost/TestService/TestService.svc" binding="wsHttpBinding" bindingConfiguration="wsHttpBinding" behaviorConfiguration="wsHttpCertificateBehavior" contract="TestService.IMyContract"> <identity> <dns value="MyCert"/> </identity> </endpoint> </client> <bindings> <wsHttpBinding> <binding name="wsHttpBinding"> <security mode="Message"> <message clientCredentialType="Certificate"/> </security> </binding> </wsHttpBinding> </bindings> <behaviors> <endpointBehaviors> <behavior name="wsHttpCertificateBehavior"> <clientCredentials> <clientCertificate findValue="MyCert" storeLocation="LocalMachine"/> <serviceCertificate> <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck" trustedStoreLocation="LocalMachine"/> </serviceCertificate> </clientCredentials> </behavior> </endpointBehaviors> </behaviors> 

我build议阅读微软的WCF安全指导

这涉及到这个场景以及其他许多问题

http://www.codeplex.com/WCFSecurityGuide/