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






4.68/5 (6投票s)
使用 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 如何工作的概览描述:
- 客户端(通常是浏览器)请求一个安全页面(URL 以 https:// 开头)。
- Web 服务器将其公钥连同其证书发送给客户端。
- 客户端检查该证书是由受信任的机构(证书颁发机构 [CA])颁发的,证书是否仍然有效,以及证书是否与所连接的站点相关。
- 客户端使用公钥生成加密密钥,并将加密密钥以加密格式发送给服务器,同时附带所需的 URL。
- Web 服务器使用其私钥解密加密密钥,然后使用该密钥解密浏览器请求。Web 服务器将返回请求的数据,该数据已使用密钥加密。
- 客户端使用加密密钥解密数据,并使用该信息(通常,客户端通过浏览器显示信息)。
现在,要遵循的实现安全通信的步骤:
- 创建 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 服务器上安装
- 打开 Internet Information Services Manager MMC 管理单元。
- 右键单击默认网站,然后选择属性。
- 选择目录安全性选项卡。
- 单击服务器证书按钮。Web 服务器证书向导将启动。
- 完成向导。选择分配证书的选项。从显示的证书列表中选择 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.cs、CFClientBase.cs:C:\Program Files\Microsoft.NET\SDK\CompactFramework\v3.5\bin。
- 将这两个文件复制并粘贴到您的设备项目中。
- 现在您将能够通过 HTTPS 调用服务方法。让我们启动引擎,享受顺畅的旅程。
结论
Windows Mobile 应用程序经常使用 WCF 与服务器通信。因此,花一些时间了解与安全通信相关的概念是值得的,这样任何外部人员都无法进入我们的应用程序逻辑。我已尽力使本文对大家非常简单。希望您会喜欢并开始实施。