发布日期 : 2/28/2005 | 更新日期 : 2/28/2005
James Pratt
Microsoft
适用于:
Microsoft® Windows® Powered Smartphone 2002
Windows Mobile™ 2003 software for Smartphones
Windows Mobile 2003 Second Edition software for Smartphones
Microsoft ActiveSync®
Microsoft Visual Studio® .NET 2003
Microsoft eMbedded Visual C++® version 3.0
Microsoft eMbedded Visual C++ version 4.0
摘要:本文介绍应用程序开发人员必须了解的有关 Smartphone 应用程序安全模型的内容、以及当某款基于 Windows Mobile 的 Smartphone 推向市场时移动运营商所拥有的不同策略选择。
本页内容
摘要
应用程序安全背景
代码签名实践
小结
附录 A:受保护的注册表项
附录 B:特权 API 列表
摘要
Microsoft™ 基于 Windows Mobile 的 Smartphone 是根据数字代码签名实现应用程序安全模型的。希望以基于 Windows Mobile 的 Smartphone 为目标的应用程序开发人员需要了解 Smartphone 应用程序安全模型、以及当某款基于 Windows Mobile 的 Smartphone 推向市场时移动运营商所拥有的不同策略选择。
如果您是一位了解构建 Pocket PC 或 Smartphone 应用程序的 Smartphone 开发人员,并且还在构建 Pocket PC 和/或 Smartphone 安装包 (.cab),本文将提供您所需的一切,以帮助您了解 Smartphone 应用程序安全模型、特权与非特权应用程序的不同之处、如何确定您的应用程序是否需要特权信任、如何配置进行 Smartphone 开发的开发环境,以及如何通过代码签名供应商进行应用程序签名。
应用程序安全背景
Mobile2Market FAQ 提供了一个非常不错的针对应用程序安全与代码签名的高级指南。在阅读本文之前,您可能希望阅读 Mobile2Market FAQ,以便为您提供有价值的背景知识。
数字代码签名
数字代码签名是一种验证数字内容来源的方式。在 Windows Mobile 领域中,有时会将它与徽标认证混淆。徽标认证是验证某个 Windows Mobile 应用程序是否符合一组实现 Windows Mobile 应用程序的指导原则的过程。当前的指导原则可以在 Mobile2Market 站点上找到。经过认证的应用程序在应用程序中和它的包装上都标有“Designed for Windows Mobile”徽标。“Designed for Windows Mobile”徽标不担保应用程序是由它声明的软件供应商构建的,也不担保如果它由该软件供应商构建,它没有在软件供应商发出它和您接收到它的这段时间内遭到恶意篡改。而代码签名确实提供了这些担保。
让人感到不解的是,数字代码签名既使用数字证书,又有一个单独的徽标认证程序。其实,这两者有完全不同的目的和目标。
究竟为什么要进行数字代码签名?
数字代码签名不是基于 Windows Mobile 的 Smartphone 所独有的。每次 Microsoft® Internet Explorer 询问您是否希望安装 Active X® 控件,然后询问您是否希望“信任来自 X 公司的内容”时,应用程序是在要求您决定是否信任内容提供商。Internet Explorer 断言相关的包在签名后没有更改过。如果您信任该来源,那么您就可以信任该应用程序,因为它来源于一个经过验证的源。代码签名将验证数字内容的来源以及自从它签名后没有更改过的事实。
用于 Smartphone 的 Windows Mobile 软件的应用程序安全
通过禁止用户从一个未知源安装应用程序,基于 Windows Mobile 的 Smartphone 应用程序安全可以帮助保护最终用户的 Smartphone 设备的完整性。
应用程序安全是一种通过代码签名实施的策略决策。在移动运营商将电话推向市场之前,他们会做出策略决策。移动运营商在任何时候都可以更改策略决策。
基于 Windows Mobile 的 Smartphone 实现了周边安全和运行时安全。周边安全控件可以安装 在设备上。运行时安全控件可以在设备上执行。例如,您只需安装一种铃声或一个主屏幕,然而您需要安装并执行一个应用程序。如果您创建内容并安装在没有包含任何可执行组件的设备上,则您只需考虑周边安全。如果您在创建一些可执行的东西(例如应用程序或组件),那么您需要考虑周边安全和运行时安全。
Smartphone 包含三个不同的证书存储区:一个非特权执行信任存储区、一个特权执行信任存储区和一个安装信任存储区。证书存储区包含安装在电话上的数字证书的公共部分。证书的公共版可以用来验证应用程序的数字签名,但不能用来对应用程序进行签名。
什么时候我需要拥有超越非特权执行模式的特权?
大多数应用程序只需要非特权执行模式,例如游戏和有助于提高工作效率的个人应用程序。如果您计划在应用程序中完成以下某件事情,您可能需要特权执行模式,因此应当使用特权证书进行签名:
-
修改系统注册表项(参阅附录 A)
-
访问 SMS 子系统(SmsXXX 函数)
-
进行或截获电话呼叫并访问其他的 exTAPI API
-
访问 SIM 管理子系统(SimXXX 函数)
-
直接通过无线电接口层访问无线电设备(不通过 Smartphone SDK 提供)
-
使用低级系统 API,例如 Kernel IOControl
-
编写用来插入到系统进程或者特权进程的组件,例如 DLL。一个常见的例子是 Microsoft ActiveSync® 服务提供程序,它作为设备端 ActiveSync 应用程序应归类为特权应用程序。
注 附录 B 包含了需要特权访问的 API 列表。
特权与非特权执行模式
Smartphone 应用程序安全模型的设计很灵活,可以满足各种移动运营商的网络的需要。特权与非特权应用程序的概念指的是给定应用程序访问设备上的功能和 API 的权限级别:
-
特权信任应用程序可以完全访问系统和 API。在特权证书存储区进行证书签名的应用程序以这种执行特权运行。
-
非特权信任应用程序可以有限访问系统和 API。在非特权证书存储区进行证书签名的应用程序以这种执行特权运行。
-
不受信任应用程序不允许加载到 Smartphone 并且不能访问系统或 API。
由运营商选择 Smartphone 安全策略。这种策略可能允许不受信任的应用程序以非特权访问模式运行,也可能需要对应用程序进行数字签名。下一节讨论安全策略矩阵。
什么是可能的安全策略?
对于安装应用程序(周边安全),运营商的策略选择很简单:
-
允许安装未经签名的安装包
-
不允许安装未经签名的安装包
在 Smartphone 2003 中,有另外一种模式,这种模式询问用户是否希望安装应用程序。
对于执行应用程序(运行时安全),移动运营商必须选择是否允许应用程序或组件以特权和非特权信任模式运行。下表显示了需要通过其进行签名才能运行的证书类型(取决于策略)。在 Smartphone 2002 中:
策略
|
执行模式
|
执行模式
|
|
非特权
|
特权
|
不受限制
|
无
|
无
|
标准
|
无
|
需要运营商特权证书
|
受限
|
需要 Mobile2Market 非特权证书
|
需要运营商特权证书
|
基于 Windows Mobile 2003 的 Smartphone 还可以支持提示模式。运营商不是简单地否认用户安装或运行应用程序的能力,而是可以通过指定提示模式来推迟针对用户的决策。在这种情况中,系统会提示并询问用户是否允许运行或安装应用程序。执行策略如下:
策略
|
执行模式
|
执行模式
|
|
非特权
|
特权
|
不受限制
|
无
|
无
|
标准
|
需要 Mobile2Market 非特权证书(提示模式一样)
|
需要 Mobile2Market 或运营商特权证书
|
受限
|
需要 Mobile2Market 非特权证书
|
需要 Mobile2Market 或运营商特权证书
|
如果您访问 Mobile2Market Build Applications 页,则可以找到主流移动运营商所采用的安全策略决策。
代码签名实践
作为一名软件开发人员,在开发代码和部署应用程序的过程中,代码签名会对您产生影响。在开发过程中,您需要了解如何用证书配置仿真程序或设备来支持开发。当您想要部署应用程序时,您需要了解如何对应用程序进行数字签名、需要对哪些组件进行签名,以及如何对这些组件进行签名。
在开始开发 Smartphone 应用程序之前,您需要准备您的 Smartphone 设备和开发环境。对于 Smartphone 2002,您将了解如何配置 eMbedded Visual C++® 3.0 以及如何选择是否使用特权或非特权证书进行签名。对于 Smartphone 2003,您将了解如何配置 eMbedded Visual C++ 4.0 和 Microsoft Visual Studio® .NET 2003,以便使它们使用一套相同的证书,从而简化开发过程。
Smartphone 2002 和 2003 的共同配置步骤
对于 Smartphone 2002 和 Smartphone 2003,您需要使用 SDK 工具目录的命令提示来执行一些配置步骤。如果您已经在默认的位置安装了这些工具,则工具的目录为:
平台
|
工具目录
|
Smartphone 2002
|
C:\Windows CE Tools\wce300\Smartphone 2002\tools
|
Smartphone 2003
|
C:\Program Files\Windows CE Tools\wce420\SMARTPHONE 2003\Tools
|
按照下面这些步骤打开命令提示,并将目录切换到工具目录:
-
单击 Start 菜单,然后单击 Run(或者按下 Windows 徽标键和 R)。Run 对话框打开。
-
在编辑字段中键入 cmd,然后按下 ENTER 键。命令窗口打开。
图 1. 打开命令窗口
-
将目录切换到上面特定于平台的工具目录。键入 cd <tools path>,然后按下 ENTER 键。
图 2. 将目录切换到特定于平台的工具目录
创建开发证书
Smartphone 2002 和 2003 SDK 附带有称为 spdps 的工具,该工具可用于创建特权开发人员证书,以便对设备端开发工具进行签名,并将该证书提供给 Smartphone 和 Smartphone 仿真程序。应当单独对 Smartphone 2002 和 Smartphone 2003 运行 spdps 命令,以确保仿真程序配置有适当的证书和对您的调试工具进行签名。
spdps 工具安装在 SDK 工具目录中。按照前面的步骤打开命令提示,并将目录切换到适当的工具目录:
平台
|
工具名称
|
工具目录
|
Smartphone 2002
|
sp2002dps
|
C:\Windows CE Tools\wce300\Smartphone 2002\tools
|
Smartphone 2003
|
spdps
|
C:\Program Files\Windows CE Tools\wce420\SMARTPHONE 2003\Tools
|
现在用 /create 与 /device 参数运行前表中指定的工具;例如,键入“sp2002dps /create /device”,<ENTER> 将会运行 Smartphone 2002 的工具。在发出该命令之前,您必须将设备连接到 PC 和已建立的 ActiveSync 连接中。
图 3 显示的是您期望看到的情形。
图 3. 按下 ENTER 返回特定于平台的工具的结果
我们在这里做的是对所有的设备端开发组件、远程工具和具有本地创建证书的调试器进行签名。这些工具需要对设备进行特权访问,因此我们将本地创建的证书“推”到了设备的特权执行信任存储区,这样设备将允许组件以特权进程运行。
有些移动运营商可能选择不支持即装即用开发的设备配置。在这种情况下,您将会看到下面的错误:
图 4. 选择不支持即装即用开发的设备配置会返回一个错误
如果您的电话不支持即装即用开发,您需要联系移动运营商,看看他们是否提供配置电话的服务,这样您可以为其进行开发。例如,他们可能在 Web 上有一个开发人员计划,您可以加入并能够进行电话开发。
如果您在多个电话上进行开发,则您可以使用 spdps /device 命令将开发证书“推”到每个电话中。在这种情况下,您只需要使用 /device 参数。
图 5. 使用一个参数
当您使用不带 /create 开关的 /device 时,实用工具会要求您选择一种证书。
图 6. 选择一种证书
当 eVC 第一次以 Smartphone 设备为目标时,会自动创建“<username> Default Development Certificate”。可以通过 spdps /create 创建“Smartphone Privileged Development Certificate for <username>”。在这种情况下,我们希望选择“Smartphone Privileged Development Certificate for <username>”以“推”到设备中。该过程完成后,您将会看到一个同前面一样的成功屏幕。
切记,如果您硬重置电话或者电池完全没电,您需要通过重复这些步骤来重新配置电话。
Smartphone 2002 的特定配置步骤
对于 Smartphone 2002,您只能使用 eMbedded Visual C++ 3.0 来开发应用程序。采用上面提及的步骤,您可以在设备的特权和非特权证书存储区上创建一个已知的证书。这将会帮助您确定您的应用程序是否需要进行特权或非特权签名。这种方法重点在于通过仿真程序配置实际的 Smartphone 设备。仿真程序配备有开放式安全策略,这使得您能够开发任何类型的应用程序。由于运营商选择他们自己的安全策略,因此只有在您作为开发人员面对设备时才需要知道您使用哪一种证书进行签名。
Smartphone 2003 的特定配置步骤
您可以使用两种工具来为 Smartphone 2003 开发应用程序。前面的步骤已经配置好设备,这样 eMbedded Visual C++ 4.0 就可以将应用程序部署到设备和仿真程序并进行调试。Smartphone 2003 SDK 附带有特权和非特权开发证书。这些证书已经加载到了仿真程序特权和非特权证书存储区中。Visual Studio .NET 2003 使用非特权证书作为默认的证书。这部分重点在于配置您的设备,以便可以使用这些证书,这样您所有的工具和仿真程序就都有一套一致的证书。
将测试证书添加到个人证书存储区
首先,您必须在您的开发 PC 上将 SDK 工具目录附带的证书添加到个人证书存储区中。这些证书文件称为 TestCert_Privileged.pfx and TestCert_UnPrivileged.pfx。为了将各个证书安装到个人证书存储区中,您需要:
-
在 Explorer 中双击 .pfx 文件。
-
单击“Next”。
-
再次单击“Next”。
-
再次单击“Next”— 证书没有密码。
-
选择“Automatically select cert store”,然后单击“Next”。
-
单击“Finish”。
将证书提供给设备
一旦您将证书添加到个人证书存储区,您就需要将它们添加到设备。这里您需要使用 rapiconfig 工具。Smartphone 2003 SDK 附带有将这些证书添加到适当设备证书存储区中的配置文件。使用前面给出的指导打开命令提示,并切换到 SDK 工具目录。类型:
rapiconfig /p sdktestcerts.xml <press enter>
您应看到:
图 7. 使用 rapiconfig 工具切换目录
配置 eMbedded Visual C++ 4.0 项目
现在您的设备包含了 SDK 测试证书。最后一步是更新 eMbedded Visual C++ 4.0 项目,这样在部署它时它使用非特权测试证书来对应用程序进行签名。在 eMbedded Visual C++ 4.0 中:
-
转到 Project,然后选择“Settings”。
-
滚动到最右侧的选项卡“Security”(参见步骤 7 中的注释)。
-
只选中顶部的复选框(对该应用程序进行签名)。
-
按下上面的“Browse”按钮。
-
选择称为“Smartphone 2003 Unprivileged Test Signing Authority”的证书,然后单击“OK”。
-
取消选中“Configure device to trust signed applications”复选框。
注 我们已经将证书提供到我们希望它们位于其中的存储区;因此我们不希望工具再次提供它们。通过取消选中该框,我们可以防止错误的证书进入到错误的存储区中。
-
单击“OK”。
注 Security 选项卡仅出现在 Smartphone 项目中。确保主 IDE 中的目标平台设置为 Smartphone 而不是 Pocket PC。即使您创建的是一个 Smartphone 项目,eMbedded Visual C++ 4.0 有时也会默认选择 Pocket PC,而不是 Smartphone。
配置 Visual Studio .NET 2003
Visual Studio 默认情况下,.NET 2003 使用 Smartphone 2003 SDK 所附带的证书。用适当的证书配置设备的步骤就是完成配置 Visual Studio .NET 2003 以自动用非特权证书对应用程序进行签名所需的步骤。
如果您确定您的 Visual Studio .NET 2003 应用程序需要进行特权签名,您就需要使用称为“Smartphone 2003 Privileged Test Signing Authority”的特权测试证书对应用程序组件(.exe 与 .dll)进行手动签名。您可以使用 signcode 工具来做到这一点。signcode 工具的使用在为部署进行应用程序签名 一节中进行介绍。
注 这使得您能够通过从设备启动可执行文件来运行 一个需要特权信任的应用程序。然而,如果您从开发环境运行或调试应用程序,它将会使用非特权证书再次对应用程序进行签名。
考虑特权访问的开发
访问特权注册表项
您可以打开和浏览特权注册表项和值,但是您不能创建、修改,或者删除项或值。所有的注册表访问函数都返回一个 LONG 值。当您试图对一个要求特权访问的项执行创建、修改或删除时,返回值将为 ERROR_ACCESS_DENIED (0x05)。一定要检查这些注册表函数返回值并得体地失败!
在附录 A 中有一个特权注册表项列表。
调用特权 API
如果您的应用程序中某个 API 失败,那可能是您调用了一个特权 API 而没有以特权信任模式运行。在这种情况下,函数调用会失败。每个函数指示它失败的方式是不同的,一般是通过一些返回值来指示。这本身不足以指示调用失败,因为您需要以特权信任模式运行。
如果由于您需要特权信任而怀疑某个函数调用失败,您可以调用 GetLastError 函数。如果返回值为 0x05 (ERROR_ACCESS_DENIED),则表明为了使用该函数您可能需要以特权信任模式运行。
参阅说明由于需要特权签名而引发问题时如何进行经验测试的章节。
在附录 B 中有一个特权 API 列表。
编写 DLL 与其他的组件
对于一个可执行文件来说,从其他的可执行组件(例如 DLL)加载功能是很常见的。通常,这是以运行时或者链接时加载函数的形式进行。有些标准的 Smartphone 应用程序允许通过编写实现特定功能的 DLL 来扩展其自身,例如 ActiveSync、Inbox 和 Home Screen。
当某个 Smartphone 可执行文件试图加载另一个组件时,系统要检查可执行文件的特权级别。如果它发现组件的信任级别低,它就不允许加载该组件。
几乎所有的系统可执行文件都是以特权信任模式运行的,记住这一点尤为重要。
对于 Smartphone 2002,试图将一个非特权组件加载到一个特权进程中将会失败而且系统不会给出任何提示。例如,您可能会试图创建一个 ActiveSync 服务提供程序。虽然您已经正确地在桌面和设备上安装了组件,而在桌面端,服务提供程序以 ActiveSync 选项的形式出现,当您试图进行同步时,没有传输数据,因为您的组件从来就没有加载到设备端。根据经验,任何插入到系统应用程序的组件都需要用特权证书进行签名。
对于 Smartphone 2003,试图将非特权组件加载到一个特权进程中的结果取决于安全策略。如有运营商允许提示模式,则系统会提示用户并请求决定是否加载组件。询问用户:
This program needs a component from an unknown source that may not be trustworthy.
Do you want to load this component?
如果运营商不支持提示模式,则该行为与 Smartphone 2002 的一样。
如果由于它需要特权签名而使我的应用程序或组件失败,我应如何进行经验测试?
如果您遵循了前面的配置指导,您的开发环境应当配置成自动用一个已知的非特权证书对应用程序进行签名。如果您遵循了这些配置指导并认为应用程序或组件可能需要特权签名,则您可以进行经验测试,方法是用您知道的设备特权存储区中的一个特权证书来进行签名。假定您已经利用前面的指导配置了环境,您可以通过以下步骤来帮助识别与安全有关的失败。
eMbedded Visual C++ 3.0 与 4.0
对于 eMbedded Visual C++ 系列,您需要在项目设置中更改用来进行应用程序或组件签名的证书。取决于您使用的是 eMbedded Visual C++ 3.0 还是 4.0£¬您需要进行稍有点不同的选择。
注 由于 Smartphone 2002 仿真程序附带有开放式安全策略,所以您不能使用仿真程序来对 Smartphone 2002 执行这种测试。
eVC 版本
|
证书名称
|
3.0
|
<username> 的 Smartphone 特权开发证书
|
4.0
|
Smartphone 2003 特权测试签名颁发机构
|
-
转到 Project 并选择 Settings。
-
滚动到最右侧的选项卡 Security(参见步骤 7 中的注释)。
-
只选中上面的复选框(对该应用程序进行签名)
-
按下上面的 Browse 按钮。
-
从上表选择证书。
-
取消选中“Configure device to trust signed applications”复选框。
注 我们已经将证书提供到了我们希望它们位于其中的存储区;因此我们不希望工具再次提供它们。通过取消选中该框,我们可以防止错误的证书进入到错误的存储区中。
-
单击“OK”。
注Security 选项卡仅出现在 Smartphone 项目中。确保主 IDE 中的目标平台设置为 Smartphone 而不是 Pocket PC。即使您创建的是一个 Smartphone 项目,eMbedded Visual C++ 4.0 有时会默认选择 Pocket PC,而不是Smartphone。
如果您现在重新构建所有的 应用程序或组件,则会使用一个特权证书进行签名。如果您的应用程序或组件现在像您所期望的那样开始正常工作,应用程序就需要进行特权签名。
Visual Studio .NET 2003
用 Visual Studio .NET 2003测试稍有不同。在这种情况下,您需要使用 signcode 工具来对组件进行手动签名,然后尝试部署它们。关于使用 signcode 的指导在本文档的为部署进行应用程序签名 一节中。您需要选择 Smartphone 2003 特权测试签名颁发机构 证书来对应用程序或组件进行签名。切记,Visual Studio .NET 2003 只支持 Smartphone 2003。
查询 Smartphone 的证书存储区中有哪些证书
Smartphone 2003 和 Smartphone 2002 SDK 都附带有一个称为 rapiconfig 的工具。rapiconfig 允许您对电话上的证书存储区进行查询。2002 和 2003 SDK 都附带有一个名为 querystore.xml 的示例文件。您可以使用该文档来确切地查询电话在其特权、非特权以及安装存储区中有哪些证书。您将学会如何做到这些,包括:
-
为特权、非特权以及安装存储区创建适当的 .xml 文件。
-
使用 rapiconfig 获取电话信息。
-
识别电话是否为开发而锁定。
创建查询文件
模板 querystore.xml 如下所示:
<!-- Sample XML to query a certificate store -->
<wap-provisioningdoc>
<characteristic type="CertificateStore">
<characteristic-query type="{Enter certificate store name over here}" />
</characteristic>
</wap-provisioningdoc>
您需要创建该文档的三个名为 querystore_priv.xml、querystore_unpriv.xml 和 querystore_spc.xml 的副本。名称并不重要;然而,在整个示例中我们将要使用这些名称。在 SDK 工具目录中制作 querystore.xml 的多个副本,这样它们就可以更容易地与命令行工具 rapiconfig 一起使用。
您可以使用记事本、喜爱的文本或 XML 编辑器来编辑这些文件。
对于_
|
替换_
|
使用_
|
Querystore_unpriv.xml
|
{在此输入证书存储区的名称}
|
非特权执行信任 Authorities
|
Querystore_priv.xml
|
{在此输入证书存储区的名称}
|
特权执行信任 Authorities
|
Querystore_spc.xml
|
{在此输入证书存储区的名称}
|
SPC
|
Using RAPIConfig
请参阅“配置开发环境”一节,打开 SDK 工具目录中的命令提示。rapiconfig 工具的工作方式对于 2002 和 2003 有点不同。2002 版输出在屏幕上;而 2003 版输出到一个文件。下面的指令将产生三个 .xml 文件。每个 .xml 文件都包含有某个特定存储区中的证书列表。
Smartphone 2002
rapiconfig /p querystore_unpriv.xml > unpriv_certs.xml <press enter>
rapiconfig /p querystore_priv.xml > priv_certs.xml <press enter>
rapiconfig /p querystore_spc.xml > spc_certs.xml <press enter>
Smartphone 2003
rapiconfig /p querystore_unpriv.xml <press enter>
copy rapiconfigout.xml priv_certs.xml
rapiconfig /p querystore_priv.xml <press enter>
copy rapiconfigout.xml priv_certs.xml
rapiconfig /p querystore_spc.xml <press enter>
copy rapiconfigout.xml spc_certs.xml
您现在有三个文件,每个都包含有某个证书存储区中的证书列表:
文件
|
证书列表_
|
priv_certs.xml
|
特权存储区
|
priv_certs.xml
|
非特权存储区
|
spc_certs.xml
|
安装存储区
|
如果您从 rapiconfig 获得一条错误消息,您应当检查下一部分。
如果由于开发您的 Smartphone 被锁定,将会发生什么情况?
运营商可以控制的电话安全的一个方面就是开发人员是否能够从他们的开发机器连接到电话。如果运营商选择了受限的策略,您将会接收到一条错误消息:
Config failed (0x80070005): Access is denied
如果是这种情况,您就需要联系运营商,弄清楚他们是否为开发人员制定了一个允许您根据他们的特定电话硬件进行开发的计划。
注 如果 .xml 文件中有错误,您也会接收到一条拒绝访问错误消息;但是错误号将为 0x80042004。
为部署进行应用程序签名
要对应用程序进行签名,您需要获得受一个或多个目标电话信任的数字证书。该数字证书的信任级别必须达到运行所需的执行特权;也就是说,如果需要特权信任执行,则需用特权证书进行签名。如果只需要非特权信任执行,则需用非特权证书进行签名。对于大多数应用程序来说,非特权信任执行足够了。
获得证书
Mobile2Market 在所有附带基于 Windows Mobile 的 Smartphones 的非特权存储区中都有证书。为了对应用程序进行签名,以便使其在各种手机中工作,我们建议您从 Mobile2Market Participate Now 一节中的一个参与证书供应商处购买证书。
从这些供应商处获得的证书通常是不受电话信任的。您必须使用此证书来对应用程序进行签名,然后将经过签名的应用程序提交给(通常通过 Web 接口)您的证书供应商。然后,该证书供应商会让一个自动进程用 Smartphone 信任的证书对应用程序进行签名,并为您提供一个下载该应用程序的链接。完成这些后,该供应商就可以验证您的身份,从而帮助维护电话信任证书的完整性。
该证书通常附带有包含所需 PIN 代码的物理 USB 设备。供应商会给您发送如何装配的指导。
对应用程序和安装程序进行签名
一旦您已经完成开发并获得证书,就可以通过 5 个简单的步骤来创建经过签名的应用程序:
-
可以用从一个 Mobile2Market 证书供应商处购买的证书来对应用程序的可执行组件(.exe 和 .dll)进行签名。下面是关于如何完成这些的指导。
-
通过 Web 接口将经过签名的应用程序组件提交给证书供应商。联系您的证书供应商以获得具体指导。受电话信任的证书签名的一个或多个文件将返回给您。
-
将这些组件构建到安装包 (.cab) 文件中。
-
使用从某个 Mobile2Market 证书供应商处购买的证书对 .cab 文件进行签名。本文后面的部分有关于如何这样做的指导。
-
通过 Web 接口将经过签名的 .cab 文件提交给您的证书供应商。联系您的证书供应商以获得具体指导。经过签名的 .cab 文件将返回给您。
然后,可以将该 .cab 文件安装在所有基于 Windows Mobile 的 Smartphone 上。该应用程序无需提示即可自己运行。
为了对 .exe、.dll 或 .cab 文件进行签名,您需要使用 signcode.exe 工具,对于 Smartphone 2002 和 Smartphone 2003,该工具都安装在 Tools 目录中。这两种工具完全相同。运行该工具时,系统将呈现一个向导。
图 8. 打开数字签名向导
单击 Next,系统将询问您想要对哪个文件进行签名。您必须为每个要签名的组件(即为每个 .exe 和 .dll 以及您最终的 .cab 文件)运行一次该工具。可以看到我已经从我的项目的 ARMRel 目录中选择了 Signing Demo.exe。
图 9. 在数字签名向导中选择文件
单击 Next 后,系统将询问您是想要 Typical 设置还是 Advanced 设置;选择 Typical。下一屏让您选择签名所使用的证书。选择 Select From Store,然后,个人证书存储区中将为您呈现一个证书列表。您要使用的不是我们现在已经用完的本地创建的证书,而是从供应商处购买的证书。
注 用 codesign 签名不会用完包含提供程序的签名事件。只有在通过供应商的 Web 站点将本地签名的应用程序提交给他们时,才会使用签名事件。
图 10. 选择签名证书
您应该很容易就能够识别您的 Mobile2Market 证书,因为 Issued By 字段和您从中购买证书的公司名相同。例如,我选择了 Geotrust 证书。一旦单击了 OK,就可以单击 Next。
下一屏将询问可选的描述数据;您可以单击 Next。您也不需要添加时间戳,所以可单击时间戳屏幕上的 Next。
现在,您已经成功地导航了该向导。单击 Finish,系统会对您的 .exe、.dll 或 .cab 进行签名。现在,您已准备好将组件提交给您的签名供应商。请参考供应商的指导来完成这些,但一般情况下一定要登录他们的 Web 站点,通常要使用他们发送的 USB 证书来验证身份。一旦登录,您就可以上载组件,并将这些组件用受 Smartphone 信任的证书进行签名。
对需要特权访问的应用程序进行签名
对于某些安全策略,运营商拥有特权证书存储区中的证书。如果确定需要特权执行信任,那么您就需与您的运营商联系,通常通过他们的开发人员计划来确定如何用该证书对您的应用程序进行签名。
注 运营商可以自行决定是否为您提供该项服务。
小结
Smartphone 应用程序安全策略和代码签名开始时可能会让人畏缩,似乎很复杂。而实际上它非常简单,通过本文,您现在可以了解 Smartphone 的不同证书存储区、如何将证书放置在这些存储区中,以及在开始部署时如何确保用正确的证书来对应用程序进行签名。使用这些简单的方法,可以确保您用正确的信任级别来对应用程序进行签名。
如果您有关于本文内容的任何反馈,请发送邮件到 wmsecfbk@microsoft.com。
附录 A:受保护的注册表项
注册表项
|
HKEY_LOCAL_MACHINE\Comm
HKEY_LOCAL_MACHINE\Drivers
HKEY_LOCAL_MACHINE\HARDWARE
HKEY_LOCAL_MACHINE\SYSTEM
HKEY_LOCAL_MACHINE\Init
HKEY_LOCAL_MACHINE\Security
HKEY_LOCAL_MACHINE\WDMDrivers
HKEY_LOCAL_MACHINE\Services
HKEY CLASSES_ROOT (device specific)
|
附录 B:特权 API 列表
组件
|
API
|
Public
|
SetInterruptEvent
SetSystemMemoryDivision
CESetThreadPriority
CeSetThreadQuantum
ForcePageout
VirtualCopy
LockPages
UnlockPages
SetProcPermissions
SetKMode
ReadProcessMemory
WriteProcessMemory
SetCleanRebootFlag
PowerOffSystem
DebugActiveProcess
CreateProcess(仅 DEBUG_ONLY_THIS_PROCESS 和 DEBUG_PROCESS 调试标志)
KernelIOControl
|
扩展的电话应用程序接口 (ExTAPI)
|
lineRegister
lineSetCallBarringPassword
lineSetCallBarringState
lineUnregister
lineSetPreferredOperator
lineSetEquipmentState
lineGetGeneralInfo
lineManageCalls
lineSetGprsClass
lineGetNumberCalls
lineSetHSCSDState
lineGetUSSD
lineSendUSSD
lineSetSendCallerIDState
lineSetCallWaitingState
|
SIM 管理器
|
simUnlockPhone
simSetLockingStatus
simGetSmsStorageStatus
simChangeLockingPassword
simReadMessage
simWriteMessage
simDeleteMessage
simReadRecord
simWriteRecord
simGetRecordInfo
|
短消息服务
|
SmsSetMessageNotification
SmsClearMessageNotification
SmsReceiveAllMessagesFromSIM
SmsSetSMSC
|
连接管理器
|
ConnMgrProviderMessage
|
Critical Process Monitor (CPM)
|
CPMRegister (Reboot)
CPMShutdown
CPMStatus
CPMRegisterTest
|
无线电接口层
|
全部 RIL API
注 RIL API 所需的信任级别可通过将下列注册表项的值从 2 更改为 1 而得以修改: [HKEY_LOCAL_MACHINE\Security\Policy\APIs\RILGSM] @="2"
|