65.9K
CodeProject 正在变化。 阅读更多。
Home

WCF 启用 X.509 证书的九个简单步骤

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (55投票s)

2009 年 5 月 23 日

CPOL

6分钟阅读

viewsIcon

530282

downloadIcon

8748

WCF 启用 X.509 证书的九个简单步骤。

目录

引言和目标

在本文中,我们将讨论如何在 WCF 服务上启用证书。WCF 有两种数据传输模式:传输模式和消息模式。本教程将重点介绍如何在消息模式的数据传输中启用证书。

现在我正在分发我的 400 个问题和答案电子书,其中涵盖了主要的 .NET 相关主题,如 WCF、WPF、WWF、AJAX、核心 .NET、SQL Server、架构等等。我相信您会喜欢这本书:http://www.questpond.com/SampleDotNetInterviewQuestionBook.zip。我还一直在录制 .NET 技术视频,您可以在这里观看所有内容。

初学者 WCF FAQ

如果您是 WCF 新手,请参阅以下两篇 WCF FAQ 文章

  • WCF FAQ 第一部分:这是一篇包含 20 个问题的 FAQ,面向初学者,解释了 WCF 的基本概念,如终结点、契约和绑定。它还讨论了 WCF 服务的各种托管方法。文章最后讨论了绑定和 WCF 中的单向操作。
  • WCF FAQ 第二部分:这篇 FAQ 包含 10 个问题,讨论了双工契约、在不同协议上托管 WCF、MSMQ 绑定、事务隔离级别和双向通信等概念。文章还讨论了两个队列:易失性队列和死信队列。

步骤 1:创建客户端和服务器证书

使用 makecert.exe 创建两个证书,一个用于服务器,另一个用于客户端。您可以在“C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\Bin”文件夹中找到 makecert.exe。您可以打开 DOS 命令提示符并运行以下命令片段

makecert.exe -sr CurrentUser -ss My -a sha1 -n CN=WCfServer -sky exchange -pe
makecert.exe -sr CurrentUser -ss My -a sha1 -n CN=WcfClient -sky exchange -pe

以下是 makecert.exe 中各种属性的详细说明。

Attribute 解释

-sr

指定证书存储的注册表位置。SubjectCertStoreLocation 参数必须是以下之一

  • currentUser:指定注册表位置 HKEY_CURRENT_USER。
  • localMachine:指定注册表位置 HKEY_LOCAL_MACHINE。

-ss

指定存储生成证书的证书存储名称。

-a

指定算法。可以是 MD5 或 SHA1。

-n

为证书指定一个名称。此名称必须符合 X.500 标准。最简单的方法是使用“CN=MyName”格式。如果未指定 /n 开关,则证书的默认名称为“Joe's Software Emporium”。

-sky

指定密钥类型。可以是 exchange 或 signature。

-pe

使密钥可导出。

注意Makecert.exe 是 Microsoft 提供的一个免费工具,用于创建由系统测试根密钥或另一个指定密钥签名的 X.509 证书。这是一个测试证书,并非真实证书,不应用于生产环境。对于生产环境,请从 Thawte、Verisign、GeoTrust 等处购买合适的证书。

目前,我们已指定要创建名称为 WcfClient 的客户端密钥和名称为 WCFServer 的服务器密钥。证书应为当前用户创建,并且应该是可导出的。

运行命令后,您应该会看到如下所示的“Succeeded”消息。下图显示了为服务器和客户端创建的密钥。

步骤 2:将证书复制到“受信任的people”证书存储中

转到“开始”->“运行”,键入 MMC,然后按 Enter。您将看到 MMC 控制台。单击“文件”->“添加/删除管理单元”。您将看到“添加/删除管理单元”窗口,单击“添加”按钮,选择“证书”,然后选择“我的用户帐户”。

您可以在“个人”证书文件夹中看到为客户端和服务器创建的证书。我们需要将这些证书复制到“受信任的 people”->“证书”文件夹中。

步骤 3:在 WCF 服务 web.config 文件中指定证书路径和模式

现在我们已经创建了两个证书,需要在 WCF 项目中引用它们。我们创建了两个项目:一个包含 WCF 服务,另一个是用于消费 WCF 服务的 Web 应用程序。

让我们打开 WCF 服务的 web.config 文件并输入两项重要内容

  • 证书存储位置以及 WCF 应用程序如何找到它。这使用 serviceCertificate 标签定义,如下面的代码片段所示。
  • certificationvalidationmode 定义了如何验证客户端证书。
证书验证模式 描述

证书链信任

在这种情况下,客户端证书将根据根证书进行验证。

对等信任

PeerTrust 确保证书的公钥部分位于客户端计算机上的“受信任的 people”证书文件夹中

证书链或对等信任

这只是链信任和对等信任的 OR 条件。

以上两点合并后输入到 WCF 服务的 web.config 文件中。

<serviceCredentials>
  <clientCertificate>
    <authentication certificateValidationMode="PeerTrust"/>
  </clientCertificate>
  <serviceCertificate findValue="WCfServer"
    storeLocation="CurrentUser"
    storeName="My"
    x509FindType="FindBySubjectName" />
</serviceCredentials>

步骤 4:定义绑定

现在我们已经定义了证书和身份验证类型,我们需要定义身份验证值将通过消息使用证书进行发送。您可以看到我们定义了 WsHttpBinding,并设置了 message 属性,指定 WCF 客户端需要发送一个证书进行验证。

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpEndpointBinding">
      <security>
        <message clientCredentialType="Certificate" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

步骤 5:将绑定与终结点关联

完成后,我们需要将此绑定与终结点关联。这可以通过使用 bindingConfiguration 标签完成,如下面的代码片段所示。

<endpoint address="" binding="wsHttpBinding" 
   bindingConfiguration="wsHttpEndpointBinding" contract="WCFServiceCertificate.IService1">

步骤 6:制作您的 Web 应用程序客户端以消费 WCF 服务

以上是 WCF 服务方面的所有工作。编译 WCF 服务并使用“服务引用”在 ASP.NET Web 应用程序中引用它。下面是引用服务并调用服务 GetData 函数的代码片段。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebConsumer.ServiceReference1;
namespace WebConsumer
{
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Service1Client obj = new Service1Client();
        Response.Write(obj.GetData(12));
    }
}
}

现在,如果您尝试运行客户端(即 Web 应用程序),您应该会遇到如下所示的错误。错误清楚地表明,在提供客户端证书之前,您无法使用 WCF 服务。

步骤 7:在 WCF 客户端中定义证书

让我们开始在 WCF 客户端中定义证书的过程。我们定义身份验证证书模式和证书路径的方式,也需要为 WCF 客户端定义。您可以看到我们将身份验证模式定义为 peertrust,并指定客户端证书名称为 WcfClient

<behaviors>
  <endpointBehaviors>
    <behavior name="CustomBehavior">
      <clientCredentials>
        <clientCertificate findValue="WcfClient" x509FindType="FindBySubjectName" 
          storeLocation="CurrentUser" storeName="My" />
        <serviceCertificate>
          <authentication certificateValidationMode="PeerTrust"/>
        </serviceCertificate>
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>

步骤 8:在 WCF 客户端中将行为与终结点关联

我们需要将上述定义的行为与终结点关联。您可以看到我们使用 behaviorConfiguration 属性绑定了行为。我们还需要指定 DNS 值为 WcfServer,这是您的服务器证书名称。

<client>
  <endpoint address="https://:1387/Service1.svc" binding="wsHttpBinding"
      bindingConfiguration="WSHttpBinding_IService1" contract="ServiceReference1.IService1"
      name="WSHttpBinding_IService1" behaviorConfiguration="CustomBehavior">
    <identity>
      <dns value="WcfServer" />
    </identity>
  </endpoint>
</client>

步骤 9:享受您的劳动成果

完成后,您可以运行 ASP.NET Web 应用程序,您应该会看到如下显示。

下载代码

您可以在此处下载服务器和客户端代码。 

如需进一步阅读,请观看以下面试准备视频和分步视频系列。

© . All rights reserved.