在企业环境中,各种应用程序需要在不同的平台上进行通信。确保这些通信的安全是至关重要的,尤其是对于业务关键型应用程序。本文主要关注在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 进行通信。因此,花一些时间了解与安全通信相关的概念是值得的,以便没有外部人员可以进入应用程序逻辑。试图使本文非常简单。希望会喜欢它并开始实施它。