如何为WCF传输安全性设置客户端和服务器证书?

时间:2011-12-27 18:39:51

标签: certificate wcf-security transport-security

我的方案:我在Amazon EC2服务器上托管了面向公众的Web应用程序。我在防火墙后面有一个自托管的数据库服务器。我有自托管的Web服务服务器,带有用于数据访问的Web服务。我想只允许我批准的应用程序(我自己生活在云端)访问服务,我不希望任何数据以明文形式传递。

从我可以告诉我阅读所有脱节和疯狂混淆的MSDN文章,Stackoverflow线程,代码项目文章和其他博客。我需要的安全类型是: 使用 wsHttpBinding ,使用证书 clientCredentialType 传输安全模式。第一个问题,我是否正确地假设?这会给我足够的安全吗?这不是B2B或类似的东西。但是,它是跨域的,我只想确保我可以信任调用者。我的服务在特定用户拥有的AppPool中运行,因此我可以访问具有集成安全性的数据库。我需要确保只有我认可的服务的来电者才能进入。我不需要加密消息,而不是SSL我已经不相信了。

所有可能的场景都让人很难知道这是否是我想要的。但假设这是下一个问题,我该如何设置Certs?我目前在服务器上有一个证书,我只能使用Https访问。 (安全模式=“传输”,clientCredentialType =“无”)。但是对于我的生活,我无法弄清楚我需要做些什么来将clientCredentialType更改为Certificate并使其工作。

  • 我从服务器给客户端什么?它在哪里?
  • 我从客户端向服务器提供什么以及它在哪里?
  • 如果我有多个客户端(Web场)我是否必须为所有客户端提供不同的客户端证书,或者他们是否可以共享我的服务器接受的一个证书?

我读过的所有开发文章都说Cert安装程序是一个管理工具,超出了本文的范围。好吧,WCF的东西很简单,它正是我需要帮助的friggin证书,而且还没有我发现的有用文章。那些接近的人展示了如何用makecert.exe做到这一点,并说在生产中会有所不同,但后来却没有说如何在生产中这样做。

我确信我的挫折程度正在显示,抱歉。但是对于如何在WCF中做一个非常常见的安全场景没有明确的描述真的没有意义。

任何和所有帮助表示赞赏, 肯

1 个答案:

答案 0 :(得分:2)

简答

  

我需要的安全类型是:传输安全模式   使用wsHttpBinding证书clientCredentialType。第一个问题,   我是否正确地假设?

是。假设您不使用WCF流功能,消息安全性也会起作用,但是通过传输安全性,您可以从硬件加速中受益。

  

如何设置Certs?

请参阅下面的详细答案。

  

我从服务器向客户提供什么?它在哪里?   如果我有几个客户(一个网络农场),我必须有一个不同的   所有这些客户端证书,或者他们可以共享我的服务器的一个证书   接受?

您需要3张证书:

  • 客户证书(所有客户都一样)。
  • 服务器证书。
  • 证书颁发机构(CA)证书,由客户端和服务器证书 发了。

客户需要:

  • 安装在个人证书存储区中的客户端证书。
  • 安装在“受信任的根证书颁发机构”商店中的CA证书。
  

我从客户端向服务器提供什么以及它在哪里?

服务器需要:

  • 安装在“个人证书”存储区中的服务器证书。
  • 安装在“受信任的根证书颁发机构”商店中的CA证书。
  • 安装在“受信任人”商店中的客户端证书。

详细答案

在此方案(Web场和自托管Web服务之间的通信)中,您拥有客户端和服务器计算机。不需要第三方颁发的证书(您相信自己,对吧?)。这意味着您可以安全地使用自制证书。

这是一个快速指南,我希望能帮助你(或其他人)实现这一目标。如果您已根据问题建议拥有证书,请随意跳过步骤I.此外,您可能已经购买了第三方颁发的证书,在这种情况下,可能已经安装了根证书颁发机构(VeriSign,Microsoft等)证书您的客户端和服务器机器。

予。创建证书

如此msdn article中所述,使用makecert生成3个证书:

  1. 根证书颁发机构证书,我们称之为 MyRootCA 及其撤销列表。
  2. 服务器SSL证书。该名称必须是您的Web场客户端将用于调用Web服务的域名。例如,如果您的客户使用以下网址:https://mywebserver.myprivatedomain.com/service1.svc,则您的证书CN(公用名)将为 mywebserver.myprivatedomain.com
  3. 客户X.509证书,我们称之为 MyAmazonClient
  4. 这是一个实现这3个步骤的简单批次:

    REM 1: MyRootCA
    makecert -n "CN=MyRootCA" -r -sv "MyRootCA.pvk" "MyRootCA.cer"
    makecert -crl -n "CN=MyRootCA" -r -sv "MyRootCA.pvk" "MyRootCA.crl"
    
    REM 2: mywebserver.myprivatedomain.com
    makecert -sk "mywebserver.myprivatedomain.com" -iv "MyRootCA.pvk" -n "CN=mywebserver.myprivatedomain.com" -ic "MyRootCA.cer" -sr LocalMachine -ss My -sky exchange -pe
    
    REM 3: MyAmazonClient
    makecert -sk "MyAmazonClient" -iv "MyRootCA.pvk" -n "CN=MyAmazonClient" -ic "MyRootCA.cer" -sr LocalMachine -ss My -sky signature -pe
    

    此批处理将在当前文件夹中创建3个文件:

    • MyRootCA.cer :包含根CA证书的公钥。
    • MyRootCA.crl :包含证书吊销列表。
    • MyRootCA.pvk :包含根CA证书的私钥。

    其他2个证书(客户端和服务器)安装在本地计算机证书存储区中。

    使用Certificates MMC Snap-in,将它们导出为.pfx文件:

    • 找到LocalMachine>我的>证书。
    • 右键单击 MyAmazonClient >所有任务>出口。
    • 右键单击 mywebserver.myprivatedomain.com >所有任务>出口。

    II。安装服务器证书

    在服务器计算机(公开Web服务的计算机)上,复制以下文件:

    • MyRootCA.cer
    • MyRootCA.crl
    • MyAmazonClient.pfx
    • mywebserver.myprivatedomain.com.pfx

    使用服务器计算机上的证书MMC管理单元,在以下位置安装证书:

    • MyRootCA.cer MyRootCA.crl 加入Local Computer > Trusted Root Certification Authorities > Certificates
    • MyAmazonClient.pfx 加入Local Computer > Trusted People > Certificates
    • mywebserver.myprivatedomain.com.pfx 加入Local Computer > Personal > Certificates

    授予您的IIS AppPool访问mywebserver.myprivatedomain.com证书的私钥的权限。在MMC Certificates Snap-in中,右键单击mywebserver.myprivatedomain.com>所有任务>管理私钥...然后添加运行AppPool的身份。请注意,与使用ApplicationPoolIdentity(默认情况下)时相比,身份名称为IIS AppPool\YourAppPoolNameHere

    III。配置IIS以支持SSL

    使用IIS管理器,找到您的网站并使用mywebserver.myprivatedomain.com证书添加https绑定。请参阅Step 4: Configure Your Temporary Service Certificate in IIS to Support SSL

    IV。配置服务(web.config)

      <system.serviceModel>
        <protocolMapping>
          <add scheme="https" binding="wsHttpBinding" />
        </protocolMapping>
        <bindings>
          <wsHttpBinding>
            <!-- configure wsHttp binding with Transport security mode and clientCredentialType as Certificate -->
            <binding>
              <security mode="Transport">
                <transport clientCredentialType="Certificate"/>            
              </security>
            </binding>
          </wsHttpBinding>
        </bindings>
      </system.serviceModel>
    

    诉安装客户端证书

    在每台客户端计算机(Web场)上,复制以下文件:

    • MyRootCA.cer
    • MyRootCA.crl
    • MyAmazonClient.pfx

    在客户端计算机上使用证书MMC管理单元,将证书安装在以下位置:

    • MyRootCA.cer MyRootCA.crl 加入Local Computer > Trusted Root Certification Authorities > Certificates
    • MyAmazonClient.pfx 加入Local Computer > Personal > Certificates

    授予您的IIS AppPool访问MyAmazonClient证书的私钥(与 II 相同的步骤)。

    VI。配置客户端(web.config)

      <system.serviceModel>
        <client>
          <!-- this endpoint has an https: address -->
          <endpoint address="https://mywebserver.myprivatedomain.com/service1.svc" 
                    behaviorConfiguration="endpointCredentialBehavior"
                    binding="wsHttpBinding" 
                    bindingConfiguration="Binding1" 
                    contract="MyWebApp.IServiceContract"/>
        </client>
        <behaviors>
          <endpointBehaviors>
            <behavior name="endpointCredentialBehavior">
              <clientCredentials>
                <clientCertificate findValue="MyAmazonClient"
                                   storeLocation="LocalMachine"
                                   storeName="My"
                                   x509FindType="FindBySubjectName" />
              </clientCredentials>
            </behavior>
          </endpointBehaviors>
        </behaviors>
        <bindings>
          <wsHttpBinding>
            <!-- configure wsHttpbinding with Transport security mode
                       and clientCredentialType as Certificate -->
            <binding name="Binding1">
              <security mode="Transport">
                <transport clientCredentialType="Certificate"/>
              </security>
            </binding>
          </wsHttpBinding>
        </bindings>
      </system.serviceModel>
    

    就是这样。