【问题标题】:How do I setup Client and Server Certificates for WCF Transport Security?如何为 WCF 传输安全设置客户端和服务器证书?
【发布时间】:2012-01-28 16:51:54
【问题描述】:

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

据我所知,阅读所有脱节且令人发疯的 MSDN 文章、Stackoverflow 线程、代码项目文章和其他博客。我需要的安全类型是: Transport 具有 Certificate clientCredentialType 的安全模式,使用 wsHttpBinding。第一个问题,我的假设是否正确?这会给我足够的安全感吗?这不是 B2B 或类似的东西。但是,它是跨域的,我只想确保我可以信任调用者。我的服务在特定用户拥有的 AppPool 中运行,因此我可以访问具有集成安全性的数据库。我需要确保只有我批准的服务的调用者才能进入。我不再需要加密消息,就像我不相信 SSL 一样。

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

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

我读过的所有开发文章都说证书设置是一种管理工具,超出了本文的范围。嗯,WCF 的东西很简单,它正是我需要帮助的 friggin cert 的东西,而且我还没有找到有用的文章。那些接近的人展示了如何使用 makecert.exe 进行操作,并说在生产中会有所不同,但没有说明如何在生产中进行。

我确定我的挫败感正在显现,对此我深表歉意。但是,对于如何在 WCF 中执行看似非常常见的安全方案没有明确的描述,这确实是没有意义的。

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

【问题讨论】:

  • sigh 正是我正在努力解决的问题......但没有回应。

标签: certificate wcf-security transport-security


【解决方案1】:

简答

我需要的安全类型是:传输安全模式 证书 clientCredentialType,使用 wsHttpBinding。第一个问题, 我猜对了吗?

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

如何设置证书?

请看下面的详细答案。

我从服务器给客户端什么,它去哪里了? 如果我有几个客户(一个网络农场),我是否必须有一个不同的 他们所有人的客户端证书,或者他们可以共享我的服务器的一个证书 接受吗?

您需要 3 个证书:

  • 客户端证书(所有客户端都相同)。
  • 服务器证书。
  • 证书颁发机构 (CA) 证书,客户端和服务器证书由该证书颁发机构 已发布。

客户需要:

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

我从客户端给服务器什么,它去了哪里?

服务器需要:

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

详细解答

在这种情况下(网络场和自托管网络服务之间的通信),您同时拥有客户端和服务器计算机。不需要第三方颁发的证书(您相信自己,对吗?)。这意味着您可以安全地使用自制证书。

这是一个快速指南,希望能帮助您(或其他人)实现这一目标。如果您已经拥有问题所建议的证书,请随时跳过步骤 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。

这是实现这 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 > 所有任务 > 导出。

二。安装服务器证书

在您的服务器机器(公开网络服务的机器)上,复制以下文件:

  • 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 证书管理单元中,右键单击 mywebserver.myprivatedomain.com > 所有任务 > 管理私钥...然后添加运行 AppPool 的身份。请注意,在使用 ApplicationPoolIdentity 时(默认情况下),身份名称为 IIS AppPool\YourAppPoolNameHere。

三。配置 IIS 以支持 SSL

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

四。配置服务(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>

V.安装客户端证书

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

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

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

  • MyRootCA.cer 和 MyRootCA.crl 进入Local Computer &gt; Trusted Root Certification Authorities &gt; Certificates
  • MyAmazonClient.pfx 转入Local Computer &gt; Personal &gt; 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>

就是这样。

【讨论】:

    猜你喜欢
    • 2011-12-16
    • 2010-12-23
    • 2012-11-14
    • 2012-02-25
    • 1970-01-01
    • 2015-08-17
    • 2012-08-19
    • 2017-02-03
    • 1970-01-01
    相关资源
    最近更新 更多