Windows Mobile 设备通过 SSL 安全通信的 WCF 实现

在企业环境中,各种应用程序需要在不同的平台上进行通信。确保这些通信的安全是至关重要的,尤其是对于业务关键型应用程序。本文主要关注在Windows Mobile设备上通过SSL进行通信。将创建一个WCF服务和智能设备项目,并尝试使用 HTTPS 协议从设备应用程序调用此服务。

使用的工具和技术

Windows Mobile 6 Professional 模拟器,.NET 3.5,Visual Studio2008,WCF 通信,SSL 测试证书。

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

使用代码

首先,将了解SSL实现的用途。以下是 SSL 工作原理的高级描述:

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

实现安全通信的步骤

创建一个 WCF 服务,并使其通过 HTTPS 访问。修改主机名。创建并安装测试SSL证书。创建一个针对 Windows Mobile 6 Professional 的智能设备项目。在设备项目中为上述 WCF 服务创建服务代理。

创建一个 WCF 服务应用程序,例如 WCFHttpsTestApp,使用Visual Studio2008 或更高版本。默认情况下,模板将在 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; } }

对于本文,将不更改此代码。

默认情况下,.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> </endpoint>

如上所见,在 bindingConfiguration 属性中,定义了 TransportSecurity,它实际上是一个基本的 HTTP 绑定,安全模式为传输。

注意:在这里使用 BasicHttpBinding,因为 Windows Mobile 客户端支持的唯一标准绑定是 BasicHttpBinding。

<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>

在 serviceBehaviour 下的服务元数据标签中,httpsGetEnabled 应为 true:

<serviceMetadata httpsGetEnabled="true"/>

发布到 IIS:在 IIS 服务器上发布上述创建的服务。

当在 IIS 中托管 WCF 服务时,默认情况下它在 Web 服务 URL 中使用 localhost 作为其主机名。这个 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。

到目前为止,WCF 服务已经发布得很好,但只能通过 HTTP 浏览此服务。要通过 HTTPS 浏览它,需要在 IIS 服务器中安装 SSL 证书。

注意:SSL 证书的名称应该是上面使用的主机名。这里将是 HCLMPPP-113。

微软提供了一个实用工具来创建测试证书,即 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 服务器中安装:

打开 Internet Information Services 管理器 MMC 快照。右键单击默认网站并选择属性。选择目录安全选项卡。单击服务器证书按钮。Web 服务器证书向导启动。完成向导。选择分配证书的选项。从显示的证书列表中选择 HCLMPPP-113 证书。

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

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

但是这段代码不会工作,因为没有向这个设备项目添加任何服务代理。

代理可以通过两种方式创建:使用设备应用程序中的“添加 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.cs,CFClientBase.cs:

C:\Program Files\Microsoft.NET\SDK\CompactFramework\v3.5\bin

将这两个文件复制并粘贴到设备项目中。

现在将能够通过 HTTPS 调用服务方法。让启动引擎,开始顺畅的旅程。

Windows Mobile应用程序经常与服务器使用 WCF 进行通信。因此,花一些时间了解与安全通信相关的概念是值得的,以便没有外部人员可以进入应用程序逻辑。试图使本文非常简单。希望会喜欢它并开始实施它。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485