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

设置 IIS 以支持服务器和客户端证书以及 HTTPS:在几分钟内测试您的客户端或 Web 服务代码(无需使用 Win 2003 或证书服务器)。

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.32/5 (20投票s)

2007 年 3 月 9 日

CPOL

11分钟阅读

viewsIcon

109005

您是否编写了一个将通过 HTTPS 部署的 Web 服务,并希望在自己的计算机上进行测试?您是否编写了一个需要使用客户端证书调用 Web 服务的客户端,并希望在不涉及公司一半人员的情况下进行测试?方法如下!

引言

我敢打赌,鉴于我面临的任务的普遍性,一定有很多人和我一样。但令人惊讶的是,我没有找到多少好文章讨论解决方案。让我这样说吧——有大量文章讨论了我需要什么,但大多数文章讨论的是问题,而不是解决方案。因此,凭借从各处收集来的零散信息和我的两点看法,我设法弄清楚了如何确切地做到以下几点:在您自己的计算机上设置 IIS 以支持 HTTPS,然后创建客户端证书以供您的客户端程序需要发送时使用。所有这些无需使用 Win 2003 或证书颁发机构或证书服务器。我使用的是 XP Professional 和 IIS 5.0 - 但这应该同样适用于 IIS 6.0。

这是一篇技术性文章,涉及一些我无法像专家那样解释的步骤。我不会 Perl,而且我肯定不是 IIS 管理员。我只是一个团队中的一员,我们编写了一个必须访问第三方 Web 服务的 C# 客户端程序。这个 Web 服务受到了严密的保护——它是一个 HTTPS 链接,并且要求其客户端使用客户端证书。它还具有 HTTP 基本身份验证机制。在编写并功能性地测试了客户端程序后,我的团队必须对其进行“环境”测试。为了避免麻烦第三方开发人员让我们进入进行测试,我们快速编写了一个(同样是用 C# 编写的)模拟 Web 服务,其 WSDL 与他们的相同。完成之后,我们的下一个目标是:

  • 托管此模拟 Web 服务,使其可以通过 HTTPS URL 访问
  • 让我们的客户端程序发送客户端证书到模拟 Web 服务
  • 使此模拟 Web 服务受到“HTTP 基本身份验证”保护
  • 让我们的客户端程序将 HTTP 基本身份验证凭据发送到模拟 Web 服务

在本文中,我将介绍如何实现上述前两点。其余两点实际上很简单——您会找到很多关于如何实现它们的文章。如果您仍然找不到,请随时给我留言,我会分享。

使用服务器证书

首先,简要解释一下什么是“服务器证书”。当您安装 IIS 并托管 Web 服务时,您就是服务器。任何调用该 Web 服务的人(例如客户端程序或 Internet Explorer 浏览器窗口)都是客户端。如果您在服务器(IIS)上安装了服务器证书,客户端就可以使用 URL 中的 HTTPS 来调用您的 Web 服务。如果他们这样做,并且客户端是浏览器,它可能会收到一个警告对话框。但如果客户端是一个程序,您可以编写代码,以编程方式用“是”响应该警告对话框。在本文中,我将假设您知道如何编写所有这些代码——本文仅关于设置,即您在编写和编译代码之后所做的操作,以便您可以测试它。但是,如果您仍然想了解确切的编码技术,请随时给我留言。

服务器证书有什么作用?很简单:它允许或启用客户端使用 URL 中的“HTTPS”进行调用。这样做可以启动 HTTPS 协议而不是 HTTP,因此在发送数据到服务器之前会对其进行加密。反之亦然。请记住,根据您(即服务器所有者)的 IIS 配置方式,客户端可以:

  1. 被强制始终使用 HTTPS,或者 
  2. 可以选择使用 HTTP 或 HTTPS

稍后我们会看到这一点。

您需要的工具

  1. OpenSSL 二进制文件 zip 文件:访问 http://sourceforge.net/project/showfiles.php?group_id=23617&release_id=188569,搜索(Ctrl+F)“openssl”,单击第一次出现,在结果页面中,下载“...bin.zip”文件。或者,这里是直接下载链接:http://downloads.sourceforge.net/gnuwin32/openssl-0.9.7c-bin.zip?modtime=1065139200&big_mirror=1
  2. OpenSSL 源代码 zip 文件:遵循与上面相同的步骤,但下载“...src.zip”文件。或者,这里是直接下载链接:http://downloads.sourceforge.net/gnuwin32/openssl-0.9.7c-src.zip?modtime=1065139200&big_mirror=1
  3. 可以运行 PERL 脚本的某些软件。我使用了 ActivePerl。要获取 ActivePerl(它是免费软件),请访问 ActivePerl 主页(http://www.activestate.com/Products/ActivePerl/)并按照下载链接进行操作,选择您的平台等。我下载了 MSI 文件并安装了 ActivePerl。

为什么需要运行 Perl 脚本?因为 IIS 不允许您直接创建服务器证书。但它允许您创建一个“证书请求”。在实际环境中,您通常会创建这样的请求,然后将其提交给外部公司来根据该请求颁发证书。但我们要做的是,我们将使用 OPENSSL 的开源免费软件从该请求创建服务器证书(而不是联系外部公司)。这个开源软件是一个 Perl 脚本(您很快就会看到)。所以您需要一个可以运行 PERL 的东西。这就是原因。

步骤

  1. 解压上面 1 和 2 中的两个 ZIP 文件。bin zip 将创建一个 bin 文件夹——它将包含 OPENSSL.EXE 和 2 个 DLL。将这 3 个文件全部复制到从另一个 zip 文件(src.zip)创建的“.../src/openssl-0.9.7c/apps”子文件夹中。
  2. apps 子文件夹中,会有一个文件 CA.PL。这是一个 Perl 脚本。用文本编辑器打开它。会有一行
    $SSLEAY_CONFIG=$ENV{"SSLEAY_CONFIG"};

    将其更改为

    $SSLEAY_CONFIG="-config openssl.cnf";

    保存并关闭文件。

  3. 打开 Internet Information Services (IIS) 控制面板窗口。转到“默认网站”,右键单击,属性,目录安全性选项卡,在“安全通信”分组框内单击“服务器证书...”按钮。在向导中单击下一步。选择“创建新证书”单选按钮,然后单击下一步。选择“立即准备请求,稍后发送”,然后单击下一步。在接下来的几个屏幕中,输入任何您喜欢的内容,或接受默认设置——这些是名称等。最后,向导会询问请求文件的名称和位置。它会建议 CertReq.TXT。我接受了该名称。您必须提供完整路径,例如“C:\CertReq.TXT”。完成。您的请求文件已准备好。
  4. 将上面第 3 步中的 CERTREQ.TXT 复制到“apps”子文件夹(第 2 步中提到的)。将其重命名为“newreq.pem”。
  5. 打开命令窗口。“cd”到 apps 文件夹。按此顺序运行 2 个命令
    perl CA.pl -newca
    perl CA.pl -signreq
  6. 上一步将在 apps 文件夹内创建一个文件“NewCert.PEM”。用任何文本编辑器打开它。删除“-----BEGIN CERTIFICATE-----”行之前的所有内容。(使 -----BEGIN CERTIFICATE----- 行成为您的第一行)。保存。关闭。
  7. 返回 IIS 并单击与第 3 步中单击的相同的“服务器证书...”按钮。现在单选按钮将不同。选择“处理挂起的请求并安装证书”单选按钮,然后单击下一步。浏览到 apps 文件夹中的 newcert.pem 文件(您需要将文件选择过滤器设置为“所有文件”才能看到它)。单击下一步完成。现在您的 IIS 上已安装了服务器证书。这意味着现在客户端可以使用 HTTP 或 HTTPS 调用您。
  8. 再次,从 IIS 窗口,转到“默认网站”,右键单击,属性,“网站”选项卡,单击“高级”按钮,在“此网站的多个 SSL 标识”分组框中,确保端口 443 的 IP 地址为“默认”。
  9. 此时,您可以托管的任何 Web 服务都可以通过 HTTPS 访问。尝试从浏览器使用 HTTPS 访问您的 Web 服务——您应该会看到警告窗口。但是,即使现在,也存在使用 HTTP 或 HTTPS 的选项。如果您希望将任何特定的 Web 服务配置为只能通过 HTTPS 请求访问,方法如下:
    • 在 IIS 窗口中,右键单击您要配置的 Web 服务的虚拟目录。单击属性。目录安全性选项卡。编辑...按钮。选中“需要安全通道 (SSL)”复选框,然后应用,确定。从这一点开始,您将无法通过 HTTP 调用该特定 Web 服务。它必须始终通过 HTTPS URL 调用。
    • 如果您将此更改应用于整个 IIS 实例(右键单击“默认网站”而不是特定的虚拟目录),而不是应用于特定的 Web 服务或 Web 应用程序,那么您托管的所有 Web 服务或应用程序都需要 HTTPS 访问,其中任何一个都不会响应 HTTP 请求。

使用客户端证书

没有 Microsoft Certificate Server 等软件,您无法轻松创建客户端证书。但话虽如此,我确实为我的特定需求找到了一种解决方法。所以也许这个解决方法可以帮助您!这就是为什么我在这里列出它的原因。

第一步是配置您的 Web 服务以要求客户端证书。在 IIS 窗口中,右键单击对应于您的特定 Web 服务的虚拟目录,单击属性。目录安全性选项卡。编辑...按钮。选择“需要客户端证书”单选按钮,然后确定。现在您的 Web 服务已配置为要求客户端证书。这意味着任何调用它的客户端都必须在请求中发送客户端证书。

继续尝试使用浏览器调用您的 Web 服务,看看会发生什么。

但是从哪里获取客户端证书呢?我们需要测试的客户端程序通过配置条目接受 CER 文件路径,并使用该 CER 文件创建的 X509 证书对象添加到请求的 Certificates 集合中。在生产环境中,这个第三方会提供给我们一个正确的 CER 文件。部署团队将简单地将 CER 文件保存在他们告诉我的任何地方,并更新 CONFIG 文件中的路径。但是我怎么知道代码会起作用呢?我现在就需要在这里测试!

当然,如果我们留空 CER 文件配置条目,我可以说代码是有效的。这意味着它找不到任何 CER 文件可以与请求捆绑,因此会发送没有 CER 文件的请求。在这种情况下,并且在将模拟 Web 服务配置为要求客户端证书后,我们收到了 SOAP 错误(确切地说是协议错误)。这是预料之中的。

然后我想到一个主意。我自己像个瘾君子一样浏览互联网。当然有些客户端证书安装在我的计算机上(浏览器用于发送到某些需要它们的网站)。为什么不尝试从其中一个导出 CER 文件呢?使用 Internet Explorer,方法如下:打开 Internet Explorer,工具 -> Internet 选项,内容选项卡,证书按钮,然后出现的对话框中有许多选项卡。从最左边的“个人”选项卡到最右边的“不受信任的发布者”选项卡——我的计算机上安装了大量客户端证书。我选择了一个。选择证书后,“导出...”按钮会启用。单击它,单击下一步,选择“DER 编码的二进制 X.509 (.CER)”格式,单击下一步,输入完整路径和名称(以 .CER 结尾),然后导出证书。好了,这就是我的 CER 文件。

但事实仍然是,我只使用了任何随机的 CER 文件。我没有使用我的 Web 服务需要的那个唯一证书。但是,我将把完整的解释留给我的听众(使其完整)——为什么它奏效了。我也很想知道原因。所以如果您有比我更正确的解释,请留言说明以下事实:我将那个 CER 文件用于我的客户端程序,并且它运行得很好!它调用了我的模拟 Web 服务,没有任何问题。不再出现协议错误,这证明了客户端代码能够捆绑客户端证书并将其发送到目标 Web 服务,一切都很好!

我的解释(可能不够充分)如下:

我没有配置我的 Web 服务对客户端证书进行任何有意义的操作(例如验证)。如果我这样做了,只使用任何随机的客户端证书将不会奏效。但就我的测试而言,我只是证明了代码有效,这就是我的目标。毕竟,在现实生活中,我的客户端代码将调用第三方 Web 服务,该服务将提供他们自己的 CER 文件。所以我不需要知道一旦我的客户端程序将其与 SOAP 请求捆绑在一起并发送出去,他们会如何处理那个 CER 文件!

当然,如果您作为 Web 服务作者阅读本文,并希望使用调用者发送的客户端证书,那么我的小实验对您没有直接帮助。无论如何,如果您发现这一点,并想分享,以便网络空间得到更丰富的充实,请给所有人留言。

Postscript

这在很大程度上是我对某个特定问题反应的一篇文章。而这似乎是一个许多其他人很可能面临的问题。这促使我写下这篇文章。请原谅某些领域缺乏深入的解释。

另外,本文引用了一些我没有详细说明的代码片段。如果您需要获取它们,请告诉我。

历史

  • 2007 年 3 月 9 日:初始帖子
© . All rights reserved.