在 WCF WsHttp 绑定上启用 HTTPS 的七个简单步骤






4.85/5 (31投票s)
WCF WsHttp 绑定启用 HTTPS 的七个简单步骤。
目录
- 引言和目标
- 步骤 1:使用 WCF 项目创建简单的服务
- 步骤 2:在服务的 web.config 文件中启用传输层安全性
- 步骤 3:配置绑定并指定 HTTPS 设置
- 步骤 4:使 Web 应用程序支持 HTTPS
- 步骤 5:在 Web 应用程序中消费该服务
- 步骤 6:忽略 HTTPS 错误
- 步骤 7:享受成功
- 源代码
引言和目标
当我们谈论 WCF 安全性时,有两种方式:传输层安全和消息层安全。传输层安全性就是协议内置的安全性。在消息层安全性中,我们需要加密数据,换句话说,安全性被注入到数据本身。在本文中,我们将探讨如何使用 WsHttp 绑定实现传输层安全性。对于传输层安全性,我们无需进行额外的开发,因为它更多的是协议固有的安全模型。在本文中,我们将使用 HTTPS 作为传输安全来实现 WsHttp。
步骤 1:使用 WCF 项目创建简单的服务
第一步是创建一个简单的 WCF 项目。因此,单击“新建项目”并选择“WCF 服务项目”。默认情况下,WCF 项目会创建一个默认函数 GetData()
。在本示例中,我们将使用相同的函数。
public class Service1 : IService1
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
步骤 2:在服务的 web.config 文件中启用传输层安全性
下一步是在 WsHttp 绑定中启用传输安全性。这可以通过“Security”XML 标签来完成,如下面的代码片段所示。
<bindings>
<wsHttpBinding>
<binding name="TransportSecurity">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
步骤 3:配置绑定并指定 HTTPS 设置
现在我们需要将绑定与终结点关联起来。因此,使用 bindingConfiguration
标签来指定绑定的名称。我们还需要指定托管服务的地址。请注意地址标签中的 HTTS。
将第二个终结点中的 mexHttpBinding
更改为 mexHttpsBinding
。
<service name="WCFWSHttps.Service1" behaviorConfiguration="WCFWSHttps.Service1Behavior">
<!-- Service Endpoints -->
<endpoint address="https:///WCFWSHttps/Service1.svc" binding="wsHttpBinding"
bindingConfiguration="TransportSecurity" contract="WCFWSHttps.IService1"/>
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
</service>
在 serviceMetadata
中,我们还需要将 httpGetEnabled
更改为 httpsGetEnabled
。
<serviceBehaviors>
........
.........
<serviceMetadata httpsGetEnabled="true"/>
.........
.........
</serviceBehaviors>
步骤 4:使 Web 应用程序支持 HTTPS
现在我们已经完成了 WCF 服务项目创建和必要的配置更改,是时候编译 WCF 服务项目并将其托管在启用了 HTTPS 的 IIS 应用程序中了。
我们将使用 makecert.exe,这是一个免费的 Microsoft 工具,用于启用 HTTPS 以供测试。MakeCert (Makecert.exe) 是一个命令行工具,它创建一个由系统测试根密钥或另一个指定密钥签名的 X.509 证书。该证书将证书名称绑定到密钥对的公有部分。证书被保存到文件、系统证书存储或两者中。
您可以从 C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\Bin 获取它,或者也可以从 Windows SDK 获取。
您可以在“C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\Bin”下的 DOS 命令提示符中键入以下内容。请注意,“compaq-jzp37md0”是服务器名称,您需要将其替换为您的 PC 名称。
makecert -r -pe -n "CN= compaq-jzp37md0 " -b 01/01/2000 -e 01/01/2050 -eku 1.3.6.1.5.5.7.3.1
-ss my -sr localMachine -sky exchange -sp
"Microsoft RSA SChannel Cryptographic Provider" -sy 12
如果通过命令提示符运行此命令,您应该会收到如下所示的成功消息。
现在是时候将此证书分配给您的 IIS 网站了。因此,转到 IIS 属性,单击“目录安全性”选项卡,您应该会看到“服务器证书”按钮。
单击“服务器证书”按钮,然后您将进入 IIS 证书向导。在向导中选择“分配现有证书”。
您会看到证书列表。“compaq-jzp37md0”证书就是我们刚刚使用“makecert.exe”创建的证书。
现在尝试不使用“HTTPS”测试站点,您将收到如下错误…这意味着您的证书正在工作。
不要忘记启用 IIS 匿名访问。
步骤 5:在 Web 应用程序中消费该服务
现在是时候在 ASP.NET Web 应用程序中消费服务应用程序了。因此,单击“添加服务引用”并指定您的服务 URL。您会看到一个警告框,如下图所示。当我们使用 makecert.exe 时,我们没有将主机名指定为服务 URL。所以只需忽略它。
步骤 6:忽略 HTTPS 错误
‘makecert.exe’创建的是测试证书。换句话说,它不是由 CA 签名的。因此,我们需要在我们的 ASP.NET 客户端消费者中忽略这些错误。我们创建了一个名为 IgnoreCertificateErrorHandler
的函数,即使有错误也会返回 true。此函数作为回调函数附加到 ServicePointManager.ServerCertificateValidationCallback
。
在同一段代码中,您还可以看到消费服务的代码,它调用 GetData
函数。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebApplicationConsumer.ServiceReference1;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
namespace WebApplicationConsumer
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(IgnoreCertificateErrorHandler);
Service1Client obj = new Service1Client();
Response.Write(obj.GetData(12));
}
public static bool IgnoreCertificateErrorHandler(object sender,
X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}
}
}
步骤 7:享受成功
现在进行最简单的步骤,编译您的 ASP.NET 客户端并享受成功。
源代码
我还附上了包含客户端和服务的源代码。
进一步阅读,请观看下面的面试准备视频和分步视频系列。