如何配置 WCF 以通过 Internet 使用 x509 证书?

Posted

技术标签:

【中文标题】如何配置 WCF 以通过 Internet 使用 x509 证书?【英文标题】:How can I configure WCF to use x509 certificates over the internet? 【发布时间】:2010-09-25 01:02:55 【问题描述】:

我需要使用 x509 证书从富客户端通过 Internet 到安全的 WCF Web 服务获取安全的消息级别身份验证。

具体来说,我正在寻找有关设置、配置、编码和部署的工作分步指南,包括创建“开发”证书、安装它以及获取“真正的”生产证书。

【问题讨论】:

【参考方案1】:

以下步骤是您入门的指南:

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>

【讨论】:

上面的 XML 不正确。不幸的是,我的编辑被拒绝了。如果您遇到问题,请注意&lt;serverCredentials&gt; 应该是&lt;serviceCredentials&gt;,并且缺少&lt;serviceBehaviors&gt; 元素。至少对于 .NET 4.5 来说是这样。见***.com/review/suggested-edits/7584410【参考方案2】:

我建议阅读 Microsoft 的 WCF 安全指南

这涉及这种情况以及许多其他情况

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

编辑:现在https://archive.codeplex.com/?p=wcfsecurityguide

【讨论】:

以上是关于如何配置 WCF 以通过 Internet 使用 x509 证书?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 WCF 配置为接受 SSL 和非 SSL

如何以编程方式将客户端连接到 WCF 服务?

再次理解WCF以及其通信(附加一個編程小經驗)

如何以编程方式配置 WCF 已知类型?

如何在生产中配置 WCF 客户端?

WCF 通过 MSMQ 到 WCF 请求和响应