我需要使用 x509 证书从富客户端通过 Internet 获取安全的消息级别身份验证到安全的 WCF Web 服务。
具体来说,我正在寻找一个关于设置、配置、编码和部署的工作分步指南,包括创建“开发”证书、安装它,以及获得用于生产的“真实”证书。
以下步骤是帮助您入门的指南:
1)首先,您需要一个根权限来生成您的客户端和服务器证书。您可以使用外部授权提供程序(例如 Verisign),也可以使用 Microsoft 证书服务器之类的工具生成自己的授权提供程序。
要生成开发根授权证书,您可以使用 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>