我需要使用x509证书从富客户端通过Internet获得安全的消息级别身份验证到安全的WCF Web服务。
具体来说,我正在寻找设置,配置,编码和部署的逐步指导,包括创建“开发”证书,安装它,以及获取“真实”的生产证书。
答案 0 :(得分:44)
以下步骤是帮助您入门的指南:
1)首先,您需要Root Authority来生成客户端和服务器证书。您可以使用外部授权提供商(例如Verisign),也可以使用Microsoft证书服务器等方式生成自己的授权提供商。
要生成开发Root Authority证书,您可以使用Visual Studio附带的“makecert”工具,例如:
makecert -n "CN=MyRootCA" -r -sv RootCA.pvk RootCA.cer
2)然后,您需要请求/生成您的客户端和服务器证书。两种类型的证书都可以作为本地计算机证书安装,并且都需要使用相同的根权限进行签名。您可以从Microsoft证书服务器的Web界面请求客户端证书,例如http://mycertserver/certsrv
。
要为每台计算机生成开发客户端证书,您可以再次使用“makecert”。请注意,客户端证书使用在步骤1中创建的开发根权限证书进行签名。
makecert -pe -n "CN=MyCert" -ss my -sky exchange -sk MyCert
-iv MyRootCA.pvk -ic MyRootCA.cer -sr localmachine MyCert.cer
这会将运行命令的计算机上的证书安装到本地计算机存储中的个人证书文件夹中。
为了使服务器信任客户端证书,您需要在服务器的受信任的根证书颁发机构存储中安装开发根权限证书(使用mmc证书管理单元执行此操作)。客户端也应该以相同的方式安装根证书,以便他们信任自己的证书。
3)将WCF服务配置为要求使用证书进行客户端身份验证(例如,通过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)现在配置调用者(例如通过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>
答案 1 :(得分:10)