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

Ben*_*aan 37 wcf x509

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

具体来说,我正在寻找设置,配置,编码和部署的逐步指导,包括创建"开发"证书,安装它,以及获得用于生产的"真实"证书.

小智 44

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

1)首先,您需要Root Authority来生成客户端和服务器证书.您可以使用外部授权提供程序(例如Verisign),也可以使用Microsoft Certificate Server之类的东西生成自己的授权提供程序.

要生成开发Root Authority证书,您可以使用Visual Studio附带的"makecert"工具,例如

makecert -n "CN=MyRootCA" -r -sv RootCA.pvk RootCA.cer
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

为了使服务器信任客户端证书,您需要在服务器的受信任的根证书颁发机构存储中安装开发根权限证书(使用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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)


Chr*_*sCa 10

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

这涉及此场景以及许多其他场景

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

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