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

使用 SSL 的 Windows Mobile 安全通信( WCF)

2013年9月24日

CPOL

5分钟阅读

viewsIcon

30504

downloadIcon

370

使用 SSL 证书保护 WCF 服务,并通过 Windows Mobile 6(.NET Compact Framework)进行访问。

引言

这是我的第一篇文章,我努力使其非常有用和互动。在这个企业世界中,各种应用程序在各种平台上相互通信。保护这种通信是必须的,特别是对于关键业务应用程序,这一点至关重要。

在本文中,我们主要关注通过 SSL 进行的 Windows Mobile 设备通信。我们将使用 Visual Studio 2008 创建一个 WCF 服务和一个智能设备项目。我们将尝试通过 HTTPS 协议从设备应用程序调用此服务。

使用的工具和技术 

  • Windows Mobile 6 Professional 模拟器
  • .NET 3.5, Visual Studio 2008
  • 使用 WCF 进行通信
  • SSL 测试证书。

背景  

通常,所有移动设备都在网络外部(更安全)运行,使用公共网络,如 GPRS、热点等。因此,设备通信必须是安全的。

使用代码 

首先,我们将了解 SSL 实现的实用性。以下是关于 SSL 如何工作的概览描述:

  1. 客户端(通常是浏览器)请求一个安全页面(URL 以 https:// 开头)。
  2. Web 服务器将其公钥连同其证书发送给客户端。
  3. 客户端检查该证书是由受信任的机构(证书颁发机构 [CA])颁发的,证书是否仍然有效,以及证书是否与所连接的站点相关。
  4. 客户端使用公钥生成加密密钥,并将加密密钥以加密格式发送给服务器,同时附带所需的 URL。
  5. Web 服务器使用其私钥解密加密密钥,然后使用该密钥解密浏览器请求。Web 服务器将返回请求的数据,该数据已使用密钥加密。
  6. 客户端使用加密密钥解密数据,并使用该信息(通常,客户端通过浏览器显示信息)。

现在,要遵循的实现安全通信的步骤:

  • 创建 WCF 服务并使其可以通过 HTTPS 访问。
  • 修改主机名。
  • 创建并安装测试 SSL 证书。
  • 创建智能设备项目并将其目标定位为 Windows Mobile 6 Professional。
  • 在设备项目中为上述 WCF 服务创建服务代理。

1. WCF over HTTPS

使用 Visual Studio 2008 或更高版本创建一个 WCF 服务应用程序,例如 WCFHttpsTestApp。默认情况下,模板将在您的 Service1.svc.cs 文件中创建两个方法,如下所示:

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;
    }
}

在本文中,我将不更改此代码。

Web.config 更改

默认情况下,.NET Framework 创建与 HTTP 兼容的绑定和终结点。要使其可以通过 HTTPS 访问,您需要进行以下更改:

注意:WCF 的安全性可以通过两种方式实现:消息级传输级。在本文中,我们实现传输级安全性。

  • 将定义新的终结点和绑定,并具有传输安全模式,如下所示:
  •  <endpoint address="" binding="basicHttpBinding" 
            bindingConfiguration="TransportSecurity" 
            contract="WCFHttpsTestApp.IService1">
     <bindings>
      <basicHttpBinding>
        <binding name="TransportSecurity">
           <security mode="Transport">
              <transport clientCredentialType="None"/>
           </security>
        </binding>
      </basicHttpBinding>
     </bindings>  

    如上所示,在 bindingConfiguration 属性中,我们定义了 TransportSecurity,它本质上是一个 basicHttpBinding,安全模式为 Transport

    注意:这里我们使用 BasicHttpBinding,因为 Windows Mobile 客户端支持的标准绑定只有 BasicHttpBinding

  • mexHttpsBinding 定义新的终结点,以便通过 HTTPS 交换元数据。在客户端创建此 WCF 服务代理时,需要此终结点。
  • <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
  • serviceBehaviour 下的 serviceMetadata 标记中,httpsGetEnabled 应设置为 true,如下所示:
  • <serviceMetadata httpsGetEnabled="true"/>

发布到 IIS:将上面创建的服务发布到 IIS 服务器。

2. HTTPS 的主机名修改

当您在 IIS 中托管 WCF 服务时,默认情况下它会将 localhost 作为其主机名包含在 Web 服务 URL 中。对于在单独的机器(模拟器)上运行的移动客户端来说,localhost 是不可接受的。因此,我们需要修改我们的主机名。通常,我们使用计算机名(如 HCLMPPP-113)作为主机名。

我们可以使用 IIS 服务器和 Visual Studio 命令提示符修改主机名。在本文中,我们将使用 Visual Studio 命令提示符。

cscript //nologo %systemdrive%\inetpub\adminscripts\adsutil.vbs set W3SVC/1/SecureBindings ":443:HCLMPPP-113" 

443 是所有 HTTPS 请求的端口。在这里,我们将主机名修改为 HCLMPPP-113。

3. SSL 证书

到目前为止,WCF 服务已成功发布,但您只能通过 HTTP 浏览此服务。要通过 HTTPS 浏览,您需要在 IIS 服务器上安装 SSL 证书。

注意:SSL 证书的名称应与您上面使用的 主机名 相同。在这里,它将是 HCLMPPP-113。

Microsoft 提供了一个用于创建测试证书的实用工具,即 makecert.exe。我将使用它。

将使用以下脚本:

makecert -r -pe -n "CN= HCLMPPP-113" -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 

这将创建一个名为 HCLMPPP-113 的 SSL 测试证书。

现在您需要将此证书安装到 IIS 服务器以及您的 Windows Mobile 设备上。

在 IIS 服务器上安装

  1. 打开 Internet Information Services Manager MMC 管理单元。
  2. 右键单击默认网站,然后选择属性
  3. 选择目录安全性选项卡。
  4. 单击服务器证书按钮。Web 服务器证书向导将启动。
  5. 完成向导。选择分配证书的选项。从显示的证书列表中选择 HCLMPPP-113 证书。

现在证书已创建,您可以使用 https://hclmppp-113/WCFHttpsTestApp/Service1.svc 浏览您的服务。

有关更多详细信息,您可以参考 这里

4. 智能设备应用程序

使用 Visual Studio 2008 或更高版本创建一个新的 Windows Mobile 智能设备应用程序,例如 HttpsDeviceTest。

将一个文本框、一个按钮和一个标签添加到 Form1。单击此按钮时,将调用 WCF 服务的 GetData 方法,该方法将文本框数据作为参数,并将字符串结果打印到 Label 控件中,如下所示:

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        if (textBox1.Text != String.Empty)
        {
            Service1Client client = new Service1Client();
            string data = client.GetData(Convert.ToInt32(textBox1.Text));
            label1.Visible = true;
            label1.Text = data;
        }
        else
        {
            MessageBox.Show("UserID is null!");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

但是这段代码将无法工作,因为我们没有为该设备项目添加任何服务代理。

5. 服务代理创建

可以通过两种方式创建代理:

  • 在设备应用程序中使用添加 Web 引用。
  • 使用 NetCFSvcUtil.exe

在本文中,我们将使用 NetCFSvcUtil.exe 创建服务代理。

步骤

  • 在命令提示符下找到 NetCFSvcUtil.exe 文件。通常可以在这里找到:C:\Program Files\Microsoft.NET\SDK\CompactFramework\v3.5\bin
  • 使用服务 URL 创建代理:https://hclmppp-113/WCFHttpsTestApp/Service1.svc
  • 它将在以下位置创建两个文件 - Service1.csCFClientBase.csC:\Program Files\Microsoft.NET\SDK\CompactFramework\v3.5\bin
  • 将这两个文件复制并粘贴到您的设备项目中。
  • 现在您将能够通过 HTTPS 调用服务方法。让我们启动引擎,享受顺畅的旅程。

结论

Windows Mobile 应用程序经常使用 WCF 与服务器通信。因此,花一些时间了解与安全通信相关的概念是值得的,这样任何外部人员都无法进入我们的应用程序逻辑。我已尽力使本文对大家非常简单。希望您会喜欢并开始实施。

链接

© . All rights reserved.