發(fā)布日期 : 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
摘要:本文介紹應(yīng)用程序開發(fā)人員必須了解的有關(guān) Smartphone 應(yīng)用程序安全模型的內(nèi)容、以及當(dāng)某款基于 Windows Mobile 的 Smartphone 推向市場(chǎng)時(shí)移動(dòng)運(yùn)營(yíng)商所擁有的不同策略選擇。
本頁(yè)內(nèi)容
摘要
應(yīng)用程序安全背景
代碼簽名實(shí)踐
小結(jié)
附錄 A:受保護(hù)的注冊(cè)表項(xiàng)
附錄 B:特權(quán) API 列表
摘要
Microsoft™ 基于 Windows Mobile 的 Smartphone 是根據(jù)數(shù)字代碼簽名實(shí)現(xiàn)應(yīng)用程序安全模型的。希望以基于 Windows Mobile 的 Smartphone 為目標(biāo)的應(yīng)用程序開發(fā)人員需要了解 Smartphone 應(yīng)用程序安全模型、以及當(dāng)某款基于 Windows Mobile 的 Smartphone 推向市場(chǎng)時(shí)移動(dòng)運(yùn)營(yíng)商所擁有的不同策略選擇。
如果您是一位了解構(gòu)建 Pocket PC 或 Smartphone 應(yīng)用程序的 Smartphone 開發(fā)人員,并且還在構(gòu)建 Pocket PC 和/或 Smartphone 安裝包 (.cab),本文將提供您所需的一切,以幫助您了解 Smartphone 應(yīng)用程序安全模型、特權(quán)與非特權(quán)應(yīng)用程序的不同之處、如何確定您的應(yīng)用程序是否需要特權(quán)信任、如何配置進(jìn)行 Smartphone 開發(fā)的開發(fā)環(huán)境,以及如何通過(guò)代碼簽名供應(yīng)商進(jìn)行應(yīng)用程序簽名。
應(yīng)用程序安全背景
Mobile2Market FAQ 提供了一個(gè)非常不錯(cuò)的針對(duì)應(yīng)用程序安全與代碼簽名的高級(jí)指南。在閱讀本文之前,您可能希望閱讀 Mobile2Market FAQ,以便為您提供有價(jià)值的背景知識(shí)。
數(shù)字代碼簽名
數(shù)字代碼簽名是一種驗(yàn)證數(shù)字內(nèi)容來(lái)源的方式。在 Windows Mobile 領(lǐng)域中,有時(shí)會(huì)將它與徽標(biāo)認(rèn)證混淆。徽標(biāo)認(rèn)證是驗(yàn)證某個(gè) Windows Mobile 應(yīng)用程序是否符合一組實(shí)現(xiàn) Windows Mobile 應(yīng)用程序的指導(dǎo)原則的過(guò)程。當(dāng)前的指導(dǎo)原則可以在 Mobile2Market 站點(diǎn)上找到。經(jīng)過(guò)認(rèn)證的應(yīng)用程序在應(yīng)用程序中和它的包裝上都標(biāo)有“Designed for Windows Mobile”徽標(biāo)。“Designed for Windows Mobile”徽標(biāo)不擔(dān)保應(yīng)用程序是由它聲明的軟件供應(yīng)商構(gòu)建的,也不擔(dān)保如果它由該軟件供應(yīng)商構(gòu)建,它沒有在軟件供應(yīng)商發(fā)出它和您接收到它的這段時(shí)間內(nèi)遭到惡意篡改。而代碼簽名確實(shí)提供了這些擔(dān)保。
讓人感到不解的是,數(shù)字代碼簽名既使用數(shù)字證書,又有一個(gè)單獨(dú)的徽標(biāo)認(rèn)證程序。其實(shí),這兩者有完全不同的目的和目標(biāo)。
究竟為什么要進(jìn)行數(shù)字代碼簽名?
數(shù)字代碼簽名不是基于 Windows Mobile 的 Smartphone 所獨(dú)有的。每次 Microsoft® Internet Explorer 詢問(wèn)您是否希望安裝 Active X® 控件,然后詢問(wèn)您是否希望“信任來(lái)自 X 公司的內(nèi)容”時(shí),應(yīng)用程序是在要求您決定是否信任內(nèi)容提供商。Internet Explorer 斷言相關(guān)的包在簽名后沒有更改過(guò)。如果您信任該來(lái)源,那么您就可以信任該應(yīng)用程序,因?yàn)樗鼇?lái)源于一個(gè)經(jīng)過(guò)驗(yàn)證的源。代碼簽名將驗(yàn)證數(shù)字內(nèi)容的來(lái)源以及自從它簽名后沒有更改過(guò)的事實(shí)。
用于 Smartphone 的 Windows Mobile 軟件的應(yīng)用程序安全
通過(guò)禁止用戶從一個(gè)未知源安裝應(yīng)用程序,基于 Windows Mobile 的 Smartphone 應(yīng)用程序安全可以幫助保護(hù)最終用戶的 Smartphone 設(shè)備的完整性。
應(yīng)用程序安全是一種通過(guò)代碼簽名實(shí)施的策略決策。在移動(dòng)運(yùn)營(yíng)商將電話推向市場(chǎng)之前,他們會(huì)做出策略決策。移動(dòng)運(yùn)營(yíng)商在任何時(shí)候都可以更改策略決策。
基于 Windows Mobile 的 Smartphone 實(shí)現(xiàn)了周邊安全和運(yùn)行時(shí)安全。周邊安全控件可以安裝 在設(shè)備上。運(yùn)行時(shí)安全控件可以在設(shè)備上執(zhí)行。例如,您只需安裝一種鈴聲或一個(gè)主屏幕,然而您需要安裝并執(zhí)行一個(gè)應(yīng)用程序。如果您創(chuàng)建內(nèi)容并安裝在沒有包含任何可執(zhí)行組件的設(shè)備上,則您只需考慮周邊安全。如果您在創(chuàng)建一些可執(zhí)行的東西(例如應(yīng)用程序或組件),那么您需要考慮周邊安全和運(yùn)行時(shí)安全。
Smartphone 包含三個(gè)不同的證書存儲(chǔ)區(qū):一個(gè)非特權(quán)執(zhí)行信任存儲(chǔ)區(qū)、一個(gè)特權(quán)執(zhí)行信任存儲(chǔ)區(qū)和一個(gè)安裝信任存儲(chǔ)區(qū)。證書存儲(chǔ)區(qū)包含安裝在電話上的數(shù)字證書的公共部分。證書的公共版可以用來(lái)驗(yàn)證應(yīng)用程序的數(shù)字簽名,但不能用來(lái)對(duì)應(yīng)用程序進(jìn)行簽名。
什么時(shí)候我需要擁有超越非特權(quán)執(zhí)行模式的特權(quán)?
大多數(shù)應(yīng)用程序只需要非特權(quán)執(zhí)行模式,例如游戲和有助于提高工作效率的個(gè)人應(yīng)用程序。如果您計(jì)劃在應(yīng)用程序中完成以下某件事情,您可能需要特權(quán)執(zhí)行模式,因此應(yīng)當(dāng)使用特權(quán)證書進(jìn)行簽名:
-
修改系統(tǒng)注冊(cè)表項(xiàng)(參閱附錄 A)
-
訪問(wèn) SMS 子系統(tǒng)(SmsXXX 函數(shù))
-
進(jìn)行或截獲電話呼叫并訪問(wèn)其他的 exTAPI API
-
訪問(wèn) SIM 管理子系統(tǒng)(SimXXX 函數(shù))
-
直接通過(guò)無(wú)線電接口層訪問(wèn)無(wú)線電設(shè)備(不通過(guò) Smartphone SDK 提供)
-
使用低級(jí)系統(tǒng) API,例如 Kernel IOControl
-
編寫用來(lái)插入到系統(tǒng)進(jìn)程或者特權(quán)進(jìn)程的組件,例如 DLL。一個(gè)常見的例子是 Microsoft ActiveSync® 服務(wù)提供程序,它作為設(shè)備端 ActiveSync 應(yīng)用程序應(yīng)歸類為特權(quán)應(yīng)用程序。
注 附錄 B 包含了需要特權(quán)訪問(wèn)的 API 列表。
特權(quán)與非特權(quán)執(zhí)行模式
Smartphone 應(yīng)用程序安全模型的設(shè)計(jì)很靈活,可以滿足各種移動(dòng)運(yùn)營(yíng)商的網(wǎng)絡(luò)的需要。特權(quán)與非特權(quán)應(yīng)用程序的概念指的是給定應(yīng)用程序訪問(wèn)設(shè)備上的功能和 API 的權(quán)限級(jí)別:
-
特權(quán)信任應(yīng)用程序可以完全訪問(wèn)系統(tǒng)和 API。在特權(quán)證書存儲(chǔ)區(qū)進(jìn)行證書簽名的應(yīng)用程序以這種執(zhí)行特權(quán)運(yùn)行。
-
非特權(quán)信任應(yīng)用程序可以有限訪問(wèn)系統(tǒng)和 API。在非特權(quán)證書存儲(chǔ)區(qū)進(jìn)行證書簽名的應(yīng)用程序以這種執(zhí)行特權(quán)運(yùn)行。
-
不受信任應(yīng)用程序不允許加載到 Smartphone 并且不能訪問(wèn)系統(tǒng)或 API。
由運(yùn)營(yíng)商選擇 Smartphone 安全策略。這種策略可能允許不受信任的應(yīng)用程序以非特權(quán)訪問(wèn)模式運(yùn)行,也可能需要對(duì)應(yīng)用程序進(jìn)行數(shù)字簽名。下一節(jié)討論安全策略矩陣。
什么是可能的安全策略?
對(duì)于安裝應(yīng)用程序(周邊安全),運(yùn)營(yíng)商的策略選擇很簡(jiǎn)單:
-
允許安裝未經(jīng)簽名的安裝包
-
不允許安裝未經(jīng)簽名的安裝包
在 Smartphone 2003 中,有另外一種模式,這種模式詢問(wèn)用戶是否希望安裝應(yīng)用程序。
對(duì)于執(zhí)行應(yīng)用程序(運(yùn)行時(shí)安全),移動(dòng)運(yùn)營(yíng)商必須選擇是否允許應(yīng)用程序或組件以特權(quán)和非特權(quán)信任模式運(yùn)行。下表顯示了需要通過(guò)其進(jìn)行簽名才能運(yùn)行的證書類型(取決于策略)。在 Smartphone 2002 中:
策略
|
執(zhí)行模式
|
執(zhí)行模式
|
|
非特權(quán)
|
特權(quán)
|
不受限制
|
無(wú)
|
無(wú)
|
標(biāo)準(zhǔn)
|
無(wú)
|
需要運(yùn)營(yíng)商特權(quán)證書
|
受限
|
需要 Mobile2Market 非特權(quán)證書
|
需要運(yùn)營(yíng)商特權(quán)證書
|
基于 Windows Mobile 2003 的 Smartphone 還可以支持提示模式。運(yùn)營(yíng)商不是簡(jiǎn)單地否認(rèn)用戶安裝或運(yùn)行應(yīng)用程序的能力,而是可以通過(guò)指定提示模式來(lái)推遲針對(duì)用戶的決策。在這種情況中,系統(tǒng)會(huì)提示并詢問(wèn)用戶是否允許運(yùn)行或安裝應(yīng)用程序。執(zhí)行策略如下:
策略
|
執(zhí)行模式
|
執(zhí)行模式
|
|
非特權(quán)
|
特權(quán)
|
不受限制
|
無(wú)
|
無(wú)
|
標(biāo)準(zhǔn)
|
需要 Mobile2Market 非特權(quán)證書(提示模式一樣)
|
需要 Mobile2Market 或運(yùn)營(yíng)商特權(quán)證書
|
受限
|
需要 Mobile2Market 非特權(quán)證書
|
需要 Mobile2Market 或運(yùn)營(yíng)商特權(quán)證書
|
如果您訪問(wèn) Mobile2Market Build Applications 頁(yè),則可以找到主流移動(dòng)運(yùn)營(yíng)商所采用的安全策略決策。
代碼簽名實(shí)踐
作為一名軟件開發(fā)人員,在開發(fā)代碼和部署應(yīng)用程序的過(guò)程中,代碼簽名會(huì)對(duì)您產(chǎn)生影響。在開發(fā)過(guò)程中,您需要了解如何用證書配置仿真程序或設(shè)備來(lái)支持開發(fā)。當(dāng)您想要部署應(yīng)用程序時(shí),您需要了解如何對(duì)應(yīng)用程序進(jìn)行數(shù)字簽名、需要對(duì)哪些組件進(jìn)行簽名,以及如何對(duì)這些組件進(jìn)行簽名。
在開始開發(fā) Smartphone 應(yīng)用程序之前,您需要準(zhǔn)備您的 Smartphone 設(shè)備和開發(fā)環(huán)境。對(duì)于 Smartphone 2002,您將了解如何配置 eMbedded Visual C++® 3.0 以及如何選擇是否使用特權(quán)或非特權(quán)證書進(jìn)行簽名。對(duì)于 Smartphone 2003,您將了解如何配置 eMbedded Visual C++ 4.0 和 Microsoft Visual Studio® .NET 2003,以便使它們使用一套相同的證書,從而簡(jiǎn)化開發(fā)過(guò)程。
Smartphone 2002 和 2003 的共同配置步驟
對(duì)于 Smartphone 2002 和 Smartphone 2003,您需要使用 SDK 工具目錄的命令提示來(lái)執(zhí)行一些配置步驟。如果您已經(jīng)在默認(rèn)的位置安裝了這些工具,則工具的目錄為:
平臺(tái)
|
工具目錄
|
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 徽標(biāo)鍵和 R)。Run 對(duì)話框打開。
-
在編輯字段中鍵入 cmd,然后按下 ENTER 鍵。命令窗口打開。
圖 1. 打開命令窗口
-
將目錄切換到上面特定于平臺(tái)的工具目錄。鍵入 cd <tools path>,然后按下 ENTER 鍵。
圖 2. 將目錄切換到特定于平臺(tái)的工具目錄
創(chuàng)建開發(fā)證書
Smartphone 2002 和 2003 SDK 附帶有稱為 spdps 的工具,該工具可用于創(chuàng)建特權(quán)開發(fā)人員證書,以便對(duì)設(shè)備端開發(fā)工具進(jìn)行簽名,并將該證書提供給 Smartphone 和 Smartphone 仿真程序。應(yīng)當(dāng)單獨(dú)對(duì) Smartphone 2002 和 Smartphone 2003 運(yùn)行 spdps 命令,以確保仿真程序配置有適當(dāng)?shù)淖C書和對(duì)您的調(diào)試工具進(jìn)行簽名。
spdps 工具安裝在 SDK 工具目錄中。按照前面的步驟打開命令提示,并將目錄切換到適當(dāng)?shù)墓ぞ吣夸洠?/p>
平臺(tái)
|
工具名稱
|
工具目錄
|
Smartphone 2002
|
sp2002dps
|
C:\Windows CE Tools\wce300\Smartphone 2002\tools
|
Smartphone 2003
|
spdps
|
C:\Program Files\Windows CE Tools\wce420\SMARTPHONE 2003\Tools
|
現(xiàn)在用 /create 與 /device 參數(shù)運(yùn)行前表中指定的工具;例如,鍵入“sp2002dps /create /device”,<ENTER> 將會(huì)運(yùn)行 Smartphone 2002 的工具。在發(fā)出該命令之前,您必須將設(shè)備連接到 PC 和已建立的 ActiveSync 連接中。
圖 3 顯示的是您期望看到的情形。
圖 3. 按下 ENTER 返回特定于平臺(tái)的工具的結(jié)果
我們?cè)谶@里做的是對(duì)所有的設(shè)備端開發(fā)組件、遠(yuǎn)程工具和具有本地創(chuàng)建證書的調(diào)試器進(jìn)行簽名。這些工具需要對(duì)設(shè)備進(jìn)行特權(quán)訪問(wèn),因此我們將本地創(chuàng)建的證書“推”到了設(shè)備的特權(quán)執(zhí)行信任存儲(chǔ)區(qū),這樣設(shè)備將允許組件以特權(quán)進(jìn)程運(yùn)行。
有些移動(dòng)運(yùn)營(yíng)商可能選擇不支持即裝即用開發(fā)的設(shè)備配置。在這種情況下,您將會(huì)看到下面的錯(cuò)誤:
圖 4. 選擇不支持即裝即用開發(fā)的設(shè)備配置會(huì)返回一個(gè)錯(cuò)誤
如果您的電話不支持即裝即用開發(fā),您需要聯(lián)系移動(dòng)運(yùn)營(yíng)商,看看他們是否提供配置電話的服務(wù),這樣您可以為其進(jìn)行開發(fā)。例如,他們可能在 Web 上有一個(gè)開發(fā)人員計(jì)劃,您可以加入并能夠進(jìn)行電話開發(fā)。
如果您在多個(gè)電話上進(jìn)行開發(fā),則您可以使用 spdps /device 命令將開發(fā)證書“推”到每個(gè)電話中。在這種情況下,您只需要使用 /device 參數(shù)。
圖 5. 使用一個(gè)參數(shù)
當(dāng)您使用不帶 /create 開關(guān)的 /device 時(shí),實(shí)用工具會(huì)要求您選擇一種證書。
圖 6. 選擇一種證書
當(dāng) eVC 第一次以 Smartphone 設(shè)備為目標(biāo)時(shí),會(huì)自動(dòng)創(chuàng)建“<username> Default Development Certificate”。可以通過(guò) spdps /create 創(chuàng)建“Smartphone Privileged Development Certificate for <username>”。在這種情況下,我們希望選擇“Smartphone Privileged Development Certificate for <username>”以“推”到設(shè)備中。該過(guò)程完成后,您將會(huì)看到一個(gè)同前面一樣的成功屏幕。
切記,如果您硬重置電話或者電池完全沒電,您需要通過(guò)重復(fù)這些步驟來(lái)重新配置電話。
Smartphone 2002 的特定配置步驟
對(duì)于 Smartphone 2002,您只能使用 eMbedded Visual C++ 3.0 來(lái)開發(fā)應(yīng)用程序。采用上面提及的步驟,您可以在設(shè)備的特權(quán)和非特權(quán)證書存儲(chǔ)區(qū)上創(chuàng)建一個(gè)已知的證書。這將會(huì)幫助您確定您的應(yīng)用程序是否需要進(jìn)行特權(quán)或非特權(quán)簽名。這種方法重點(diǎn)在于通過(guò)仿真程序配置實(shí)際的 Smartphone 設(shè)備。仿真程序配備有開放式安全策略,這使得您能夠開發(fā)任何類型的應(yīng)用程序。由于運(yùn)營(yíng)商選擇他們自己的安全策略,因此只有在您作為開發(fā)人員面對(duì)設(shè)備時(shí)才需要知道您使用哪一種證書進(jìn)行簽名。
Smartphone 2003 的特定配置步驟
您可以使用兩種工具來(lái)為 Smartphone 2003 開發(fā)應(yīng)用程序。前面的步驟已經(jīng)配置好設(shè)備,這樣 eMbedded Visual C++ 4.0 就可以將應(yīng)用程序部署到設(shè)備和仿真程序并進(jìn)行調(diào)試。Smartphone 2003 SDK 附帶有特權(quán)和非特權(quán)開發(fā)證書。這些證書已經(jīng)加載到了仿真程序特權(quán)和非特權(quán)證書存儲(chǔ)區(qū)中。Visual Studio .NET 2003 使用非特權(quán)證書作為默認(rèn)的證書。這部分重點(diǎn)在于配置您的設(shè)備,以便可以使用這些證書,這樣您所有的工具和仿真程序就都有一套一致的證書。
將測(cè)試證書添加到個(gè)人證書存儲(chǔ)區(qū)
首先,您必須在您的開發(fā) PC 上將 SDK 工具目錄附帶的證書添加到個(gè)人證書存儲(chǔ)區(qū)中。這些證書文件稱為 TestCert_Privileged.pfx and TestCert_UnPrivileged.pfx。為了將各個(gè)證書安裝到個(gè)人證書存儲(chǔ)區(qū)中,您需要:
-
在 Explorer 中雙擊 .pfx 文件。
-
單擊“Next”。
-
再次單擊“Next”。
-
再次單擊“Next”— 證書沒有密碼。
-
選擇“Automatically select cert store”,然后單擊“Next”。
-
單擊“Finish”。
將證書提供給設(shè)備
一旦您將證書添加到個(gè)人證書存儲(chǔ)區(qū),您就需要將它們添加到設(shè)備。這里您需要使用 rapiconfig 工具。Smartphone 2003 SDK 附帶有將這些證書添加到適當(dāng)設(shè)備證書存儲(chǔ)區(qū)中的配置文件。使用前面給出的指導(dǎo)打開命令提示,并切換到 SDK 工具目錄。類型:
rapiconfig /p sdktestcerts.xml <press enter>
您應(yīng)看到:
圖 7. 使用 rapiconfig 工具切換目錄
配置 eMbedded Visual C++ 4.0 項(xiàng)目
現(xiàn)在您的設(shè)備包含了 SDK 測(cè)試證書。最后一步是更新 eMbedded Visual C++ 4.0 項(xiàng)目,這樣在部署它時(shí)它使用非特權(quán)測(cè)試證書來(lái)對(duì)應(yīng)用程序進(jìn)行簽名。在 eMbedded Visual C++ 4.0 中:
-
轉(zhuǎn)到 Project,然后選擇“Settings”。
-
滾動(dòng)到最右側(cè)的選項(xiàng)卡“Security”(參見步驟 7 中的注釋)。
-
只選中頂部的復(fù)選框(對(duì)該應(yīng)用程序進(jìn)行簽名)。
-
按下上面的“Browse”按鈕。
-
選擇稱為“Smartphone 2003 Unprivileged Test Signing Authority”的證書,然后單擊“OK”。
-
取消選中“Configure device to trust signed applications”復(fù)選框。
注 我們已經(jīng)將證書提供到我們希望它們位于其中的存儲(chǔ)區(qū);因此我們不希望工具再次提供它們。通過(guò)取消選中該框,我們可以防止錯(cuò)誤的證書進(jìn)入到錯(cuò)誤的存儲(chǔ)區(qū)中。
-
單擊“OK”。
注 Security 選項(xiàng)卡僅出現(xiàn)在 Smartphone 項(xiàng)目中。確保主 IDE 中的目標(biāo)平臺(tái)設(shè)置為 Smartphone 而不是 Pocket PC。即使您創(chuàng)建的是一個(gè) Smartphone 項(xiàng)目,eMbedded Visual C++ 4.0 有時(shí)也會(huì)默認(rèn)選擇 Pocket PC,而不是 Smartphone。
配置 Visual Studio .NET 2003
Visual Studio 默認(rèn)情況下,.NET 2003 使用 Smartphone 2003 SDK 所附帶的證書。用適當(dāng)?shù)淖C書配置設(shè)備的步驟就是完成配置 Visual Studio .NET 2003 以自動(dòng)用非特權(quán)證書對(duì)應(yīng)用程序進(jìn)行簽名所需的步驟。
如果您確定您的 Visual Studio .NET 2003 應(yīng)用程序需要進(jìn)行特權(quán)簽名,您就需要使用稱為“Smartphone 2003 Privileged Test Signing Authority”的特權(quán)測(cè)試證書對(duì)應(yīng)用程序組件(.exe 與 .dll)進(jìn)行手動(dòng)簽名。您可以使用 signcode 工具來(lái)做到這一點(diǎn)。signcode 工具的使用在為部署進(jìn)行應(yīng)用程序簽名 一節(jié)中進(jìn)行介紹。
注 這使得您能夠通過(guò)從設(shè)備啟動(dòng)可執(zhí)行文件來(lái)運(yùn)行 一個(gè)需要特權(quán)信任的應(yīng)用程序。然而,如果您從開發(fā)環(huán)境運(yùn)行或調(diào)試應(yīng)用程序,它將會(huì)使用非特權(quán)證書再次對(duì)應(yīng)用程序進(jìn)行簽名。
考慮特權(quán)訪問(wèn)的開發(fā)
訪問(wèn)特權(quán)注冊(cè)表項(xiàng)
您可以打開和瀏覽特權(quán)注冊(cè)表項(xiàng)和值,但是您不能創(chuàng)建、修改,或者刪除項(xiàng)或值。所有的注冊(cè)表訪問(wèn)函數(shù)都返回一個(gè) LONG 值。當(dāng)您試圖對(duì)一個(gè)要求特權(quán)訪問(wèn)的項(xiàng)執(zhí)行創(chuàng)建、修改或刪除時(shí),返回值將為 ERROR_ACCESS_DENIED (0x05)。一定要檢查這些注冊(cè)表函數(shù)返回值并得體地失敗!
在附錄 A 中有一個(gè)特權(quán)注冊(cè)表項(xiàng)列表。
調(diào)用特權(quán) API
如果您的應(yīng)用程序中某個(gè) API 失敗,那可能是您調(diào)用了一個(gè)特權(quán) API 而沒有以特權(quán)信任模式運(yùn)行。在這種情況下,函數(shù)調(diào)用會(huì)失敗。每個(gè)函數(shù)指示它失敗的方式是不同的,一般是通過(guò)一些返回值來(lái)指示。這本身不足以指示調(diào)用失敗,因?yàn)槟枰蕴貦?quán)信任模式運(yùn)行。
如果由于您需要特權(quán)信任而懷疑某個(gè)函數(shù)調(diào)用失敗,您可以調(diào)用 GetLastError 函數(shù)。如果返回值為 0x05 (ERROR_ACCESS_DENIED),則表明為了使用該函數(shù)您可能需要以特權(quán)信任模式運(yùn)行。
參閱說(shuō)明由于需要特權(quán)簽名而引發(fā)問(wèn)題時(shí)如何進(jìn)行經(jīng)驗(yàn)測(cè)試的章節(jié)。
在附錄 B 中有一個(gè)特權(quán) API 列表。
編寫 DLL 與其他的組件
對(duì)于一個(gè)可執(zhí)行文件來(lái)說(shuō),從其他的可執(zhí)行組件(例如 DLL)加載功能是很常見的。通常,這是以運(yùn)行時(shí)或者鏈接時(shí)加載函數(shù)的形式進(jìn)行。有些標(biāo)準(zhǔn)的 Smartphone 應(yīng)用程序允許通過(guò)編寫實(shí)現(xiàn)特定功能的 DLL 來(lái)擴(kuò)展其自身,例如 ActiveSync、Inbox 和 Home Screen。
當(dāng)某個(gè) Smartphone 可執(zhí)行文件試圖加載另一個(gè)組件時(shí),系統(tǒng)要檢查可執(zhí)行文件的特權(quán)級(jí)別。如果它發(fā)現(xiàn)組件的信任級(jí)別低,它就不允許加載該組件。
幾乎所有的系統(tǒng)可執(zhí)行文件都是以特權(quán)信任模式運(yùn)行的,記住這一點(diǎn)尤為重要。
對(duì)于 Smartphone 2002,試圖將一個(gè)非特權(quán)組件加載到一個(gè)特權(quán)進(jìn)程中將會(huì)失敗而且系統(tǒng)不會(huì)給出任何提示。例如,您可能會(huì)試圖創(chuàng)建一個(gè) ActiveSync 服務(wù)提供程序。雖然您已經(jīng)正確地在桌面和設(shè)備上安裝了組件,而在桌面端,服務(wù)提供程序以 ActiveSync 選項(xiàng)的形式出現(xiàn),當(dāng)您試圖進(jìn)行同步時(shí),沒有傳輸數(shù)據(jù),因?yàn)槟慕M件從來(lái)就沒有加載到設(shè)備端。根據(jù)經(jīng)驗(yàn),任何插入到系統(tǒng)應(yīng)用程序的組件都需要用特權(quán)證書進(jìn)行簽名。
對(duì)于 Smartphone 2003,試圖將非特權(quán)組件加載到一個(gè)特權(quán)進(jìn)程中的結(jié)果取決于安全策略。如有運(yùn)營(yíng)商允許提示模式,則系統(tǒng)會(huì)提示用戶并請(qǐng)求決定是否加載組件。詢問(wèn)用戶:
This program needs a component from an unknown source that may not be trustworthy.
Do you want to load this component?
如果運(yùn)營(yíng)商不支持提示模式,則該行為與 Smartphone 2002 的一樣。
如果由于它需要特權(quán)簽名而使我的應(yīng)用程序或組件失敗,我應(yīng)如何進(jìn)行經(jīng)驗(yàn)測(cè)試?
如果您遵循了前面的配置指導(dǎo),您的開發(fā)環(huán)境應(yīng)當(dāng)配置成自動(dòng)用一個(gè)已知的非特權(quán)證書對(duì)應(yīng)用程序進(jìn)行簽名。如果您遵循了這些配置指導(dǎo)并認(rèn)為應(yīng)用程序或組件可能需要特權(quán)簽名,則您可以進(jìn)行經(jīng)驗(yàn)測(cè)試,方法是用您知道的設(shè)備特權(quán)存儲(chǔ)區(qū)中的一個(gè)特權(quán)證書來(lái)進(jìn)行簽名。假定您已經(jīng)利用前面的指導(dǎo)配置了環(huán)境,您可以通過(guò)以下步驟來(lái)幫助識(shí)別與安全有關(guān)的失敗。
eMbedded Visual C++ 3.0 與 4.0
對(duì)于 eMbedded Visual C++ 系列,您需要在項(xiàng)目設(shè)置中更改用來(lái)進(jìn)行應(yīng)用程序或組件簽名的證書。取決于您使用的是 eMbedded Visual C++ 3.0 還是 4.0£¬您需要進(jìn)行稍有點(diǎn)不同的選擇。
注 由于 Smartphone 2002 仿真程序附帶有開放式安全策略,所以您不能使用仿真程序來(lái)對(duì) Smartphone 2002 執(zhí)行這種測(cè)試。
eVC 版本
|
證書名稱
|
3.0
|
<username> 的 Smartphone 特權(quán)開發(fā)證書
|
4.0
|
Smartphone 2003 特權(quán)測(cè)試簽名頒發(fā)機(jī)構(gòu)
|
-
轉(zhuǎn)到 Project 并選擇 Settings。
-
滾動(dòng)到最右側(cè)的選項(xiàng)卡 Security(參見步驟 7 中的注釋)。
-
只選中上面的復(fù)選框(對(duì)該應(yīng)用程序進(jìn)行簽名)
-
按下上面的 Browse 按鈕。
-
從上表選擇證書。
-
取消選中“Configure device to trust signed applications”復(fù)選框。
注 我們已經(jīng)將證書提供到了我們希望它們位于其中的存儲(chǔ)區(qū);因此我們不希望工具再次提供它們。通過(guò)取消選中該框,我們可以防止錯(cuò)誤的證書進(jìn)入到錯(cuò)誤的存儲(chǔ)區(qū)中。
-
單擊“OK”。
注Security 選項(xiàng)卡僅出現(xiàn)在 Smartphone 項(xiàng)目中。確保主 IDE 中的目標(biāo)平臺(tái)設(shè)置為 Smartphone 而不是 Pocket PC。即使您創(chuàng)建的是一個(gè) Smartphone 項(xiàng)目,eMbedded Visual C++ 4.0 有時(shí)會(huì)默認(rèn)選擇 Pocket PC,而不是Smartphone。
如果您現(xiàn)在重新構(gòu)建所有的 應(yīng)用程序或組件,則會(huì)使用一個(gè)特權(quán)證書進(jìn)行簽名。如果您的應(yīng)用程序或組件現(xiàn)在像您所期望的那樣開始正常工作,應(yīng)用程序就需要進(jìn)行特權(quán)簽名。
Visual Studio .NET 2003
用 Visual Studio .NET 2003測(cè)試稍有不同。在這種情況下,您需要使用 signcode 工具來(lái)對(duì)組件進(jìn)行手動(dòng)簽名,然后嘗試部署它們。關(guān)于使用 signcode 的指導(dǎo)在本文檔的為部署進(jìn)行應(yīng)用程序簽名 一節(jié)中。您需要選擇 Smartphone 2003 特權(quán)測(cè)試簽名頒發(fā)機(jī)構(gòu) 證書來(lái)對(duì)應(yīng)用程序或組件進(jìn)行簽名。切記,Visual Studio .NET 2003 只支持 Smartphone 2003。
查詢 Smartphone 的證書存儲(chǔ)區(qū)中有哪些證書
Smartphone 2003 和 Smartphone 2002 SDK 都附帶有一個(gè)稱為 rapiconfig 的工具。rapiconfig 允許您對(duì)電話上的證書存儲(chǔ)區(qū)進(jìn)行查詢。2002 和 2003 SDK 都附帶有一個(gè)名為 querystore.xml 的示例文件。您可以使用該文檔來(lái)確切地查詢電話在其特權(quán)、非特權(quán)以及安裝存儲(chǔ)區(qū)中有哪些證書。您將學(xué)會(huì)如何做到這些,包括:
-
為特權(quán)、非特權(quán)以及安裝存儲(chǔ)區(qū)創(chuàng)建適當(dāng)?shù)?.xml 文件。
-
使用 rapiconfig 獲取電話信息。
-
識(shí)別電話是否為開發(fā)而鎖定。
創(chuàng)建查詢文件
模板 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>
您需要?jiǎng)?chuàng)建該文檔的三個(gè)名為 querystore_priv.xml、querystore_unpriv.xml 和 querystore_spc.xml 的副本。名稱并不重要;然而,在整個(gè)示例中我們將要使用這些名稱。在 SDK 工具目錄中制作 querystore.xml 的多個(gè)副本,這樣它們就可以更容易地與命令行工具 rapiconfig 一起使用。
您可以使用記事本、喜愛的文本或 XML 編輯器來(lái)編輯這些文件。
對(duì)于_
|
替換_
|
使用_
|
Querystore_unpriv.xml
|
{在此輸入證書存儲(chǔ)區(qū)的名稱}
|
非特權(quán)執(zhí)行信任 Authorities
|
Querystore_priv.xml
|
{在此輸入證書存儲(chǔ)區(qū)的名稱}
|
特權(quán)執(zhí)行信任 Authorities
|
Querystore_spc.xml
|
{在此輸入證書存儲(chǔ)區(qū)的名稱}
|
SPC
|
Using RAPIConfig
請(qǐng)參閱“配置開發(fā)環(huán)境”一節(jié),打開 SDK 工具目錄中的命令提示。rapiconfig 工具的工作方式對(duì)于 2002 和 2003 有點(diǎn)不同。2002 版輸出在屏幕上;而 2003 版輸出到一個(gè)文件。下面的指令將產(chǎn)生三個(gè) .xml 文件。每個(gè) .xml 文件都包含有某個(gè)特定存儲(chǔ)區(qū)中的證書列表。
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
您現(xiàn)在有三個(gè)文件,每個(gè)都包含有某個(gè)證書存儲(chǔ)區(qū)中的證書列表:
文件
|
證書列表_
|
priv_certs.xml
|
特權(quán)存儲(chǔ)區(qū)
|
priv_certs.xml
|
非特權(quán)存儲(chǔ)區(qū)
|
spc_certs.xml
|
安裝存儲(chǔ)區(qū)
|
如果您從 rapiconfig 獲得一條錯(cuò)誤消息,您應(yīng)當(dāng)檢查下一部分。
如果由于開發(fā)您的 Smartphone 被鎖定,將會(huì)發(fā)生什么情況?
運(yùn)營(yíng)商可以控制的電話安全的一個(gè)方面就是開發(fā)人員是否能夠從他們的開發(fā)機(jī)器連接到電話。如果運(yùn)營(yíng)商選擇了受限的策略,您將會(huì)接收到一條錯(cuò)誤消息:
Config failed (0x80070005): Access is denied
如果是這種情況,您就需要聯(lián)系運(yùn)營(yíng)商,弄清楚他們是否為開發(fā)人員制定了一個(gè)允許您根據(jù)他們的特定電話硬件進(jìn)行開發(fā)的計(jì)劃。
注 如果 .xml 文件中有錯(cuò)誤,您也會(huì)接收到一條拒絕訪問(wèn)錯(cuò)誤消息;但是錯(cuò)誤號(hào)將為 0x80042004。
為部署進(jìn)行應(yīng)用程序簽名
要對(duì)應(yīng)用程序進(jìn)行簽名,您需要獲得受一個(gè)或多個(gè)目標(biāo)電話信任的數(shù)字證書。該數(shù)字證書的信任級(jí)別必須達(dá)到運(yùn)行所需的執(zhí)行特權(quán);也就是說(shuō),如果需要特權(quán)信任執(zhí)行,則需用特權(quán)證書進(jìn)行簽名。如果只需要非特權(quán)信任執(zhí)行,則需用非特權(quán)證書進(jìn)行簽名。對(duì)于大多數(shù)應(yīng)用程序來(lái)說(shuō),非特權(quán)信任執(zhí)行足夠了。
獲得證書
Mobile2Market 在所有附帶基于 Windows Mobile 的 Smartphones 的非特權(quán)存儲(chǔ)區(qū)中都有證書。為了對(duì)應(yīng)用程序進(jìn)行簽名,以便使其在各種手機(jī)中工作,我們建議您從 Mobile2Market Participate Now 一節(jié)中的一個(gè)參與證書供應(yīng)商處購(gòu)買證書。
從這些供應(yīng)商處獲得的證書通常是不受電話信任的。您必須使用此證書來(lái)對(duì)應(yīng)用程序進(jìn)行簽名,然后將經(jīng)過(guò)簽名的應(yīng)用程序提交給(通常通過(guò) Web 接口)您的證書供應(yīng)商。然后,該證書供應(yīng)商會(huì)讓一個(gè)自動(dòng)進(jìn)程用 Smartphone 信任的證書對(duì)應(yīng)用程序進(jìn)行簽名,并為您提供一個(gè)下載該應(yīng)用程序的鏈接。完成這些后,該供應(yīng)商就可以驗(yàn)證您的身份,從而幫助維護(hù)電話信任證書的完整性。
該證書通常附帶有包含所需 PIN 代碼的物理 USB 設(shè)備。供應(yīng)商會(huì)給您發(fā)送如何裝配的指導(dǎo)。
對(duì)應(yīng)用程序和安裝程序進(jìn)行簽名
一旦您已經(jīng)完成開發(fā)并獲得證書,就可以通過(guò) 5 個(gè)簡(jiǎn)單的步驟來(lái)創(chuàng)建經(jīng)過(guò)簽名的應(yīng)用程序:
-
可以用從一個(gè) Mobile2Market 證書供應(yīng)商處購(gòu)買的證書來(lái)對(duì)應(yīng)用程序的可執(zhí)行組件(.exe 和 .dll)進(jìn)行簽名。下面是關(guān)于如何完成這些的指導(dǎo)。
-
通過(guò) Web 接口將經(jīng)過(guò)簽名的應(yīng)用程序組件提交給證書供應(yīng)商。聯(lián)系您的證書供應(yīng)商以獲得具體指導(dǎo)。受電話信任的證書簽名的一個(gè)或多個(gè)文件將返回給您。
-
將這些組件構(gòu)建到安裝包 (.cab) 文件中。
-
使用從某個(gè) Mobile2Market 證書供應(yīng)商處購(gòu)買的證書對(duì) .cab 文件進(jìn)行簽名。本文后面的部分有關(guān)于如何這樣做的指導(dǎo)。
-
通過(guò) Web 接口將經(jīng)過(guò)簽名的 .cab 文件提交給您的證書供應(yīng)商。聯(lián)系您的證書供應(yīng)商以獲得具體指導(dǎo)。經(jīng)過(guò)簽名的 .cab 文件將返回給您。
然后,可以將該 .cab 文件安裝在所有基于 Windows Mobile 的 Smartphone 上。該應(yīng)用程序無(wú)需提示即可自己運(yùn)行。
為了對(duì) .exe、.dll 或 .cab 文件進(jìn)行簽名,您需要使用 signcode.exe 工具,對(duì)于 Smartphone 2002 和 Smartphone 2003,該工具都安裝在 Tools 目錄中。這兩種工具完全相同。運(yùn)行該工具時(shí),系統(tǒng)將呈現(xiàn)一個(gè)向?qū)А?/p>
圖 8. 打開數(shù)字簽名向?qū)?/strong>
單擊 Next,系統(tǒng)將詢問(wèn)您想要對(duì)哪個(gè)文件進(jìn)行簽名。您必須為每個(gè)要簽名的組件(即為每個(gè) .exe 和 .dll 以及您最終的 .cab 文件)運(yùn)行一次該工具。可以看到我已經(jīng)從我的項(xiàng)目的 ARMRel 目錄中選擇了 Signing Demo.exe。
圖 9. 在數(shù)字簽名向?qū)е羞x擇文件
單擊 Next 后,系統(tǒng)將詢問(wèn)您是想要 Typical 設(shè)置還是 Advanced 設(shè)置;選擇 Typical。下一屏讓您選擇簽名所使用的證書。選擇 Select From Store,然后,個(gè)人證書存儲(chǔ)區(qū)中將為您呈現(xiàn)一個(gè)證書列表。您要使用的不是我們現(xiàn)在已經(jīng)用完的本地創(chuàng)建的證書,而是從供應(yīng)商處購(gòu)買的證書。
注 用 codesign 簽名不會(huì)用完包含提供程序的簽名事件。只有在通過(guò)供應(yīng)商的 Web 站點(diǎn)將本地簽名的應(yīng)用程序提交給他們時(shí),才會(huì)使用簽名事件。
圖 10. 選擇簽名證書
您應(yīng)該很容易就能夠識(shí)別您的 Mobile2Market 證書,因?yàn)?Issued By 字段和您從中購(gòu)買證書的公司名相同。例如,我選擇了 Geotrust 證書。一旦單擊了 OK,就可以單擊 Next。
下一屏將詢問(wèn)可選的描述數(shù)據(jù);您可以單擊 Next。您也不需要添加時(shí)間戳,所以可單擊時(shí)間戳屏幕上的 Next。
現(xiàn)在,您已經(jīng)成功地導(dǎo)航了該向?qū)А螕?Finish,系統(tǒng)會(huì)對(duì)您的 .exe、.dll 或 .cab 進(jìn)行簽名。現(xiàn)在,您已準(zhǔn)備好將組件提交給您的簽名供應(yīng)商。請(qǐng)參考供應(yīng)商的指導(dǎo)來(lái)完成這些,但一般情況下一定要登錄他們的 Web 站點(diǎn),通常要使用他們發(fā)送的 USB 證書來(lái)驗(yàn)證身份。一旦登錄,您就可以上載組件,并將這些組件用受 Smartphone 信任的證書進(jìn)行簽名。
對(duì)需要特權(quán)訪問(wèn)的應(yīng)用程序進(jìn)行簽名
對(duì)于某些安全策略,運(yùn)營(yíng)商擁有特權(quán)證書存儲(chǔ)區(qū)中的證書。如果確定需要特權(quán)執(zhí)行信任,那么您就需與您的運(yùn)營(yíng)商聯(lián)系,通常通過(guò)他們的開發(fā)人員計(jì)劃來(lái)確定如何用該證書對(duì)您的應(yīng)用程序進(jìn)行簽名。
注 運(yùn)營(yíng)商可以自行決定是否為您提供該項(xiàng)服務(wù)。
小結(jié)
Smartphone 應(yīng)用程序安全策略和代碼簽名開始時(shí)可能會(huì)讓人畏縮,似乎很復(fù)雜。而實(shí)際上它非常簡(jiǎn)單,通過(guò)本文,您現(xiàn)在可以了解 Smartphone 的不同證書存儲(chǔ)區(qū)、如何將證書放置在這些存儲(chǔ)區(qū)中,以及在開始部署時(shí)如何確保用正確的證書來(lái)對(duì)應(yīng)用程序進(jìn)行簽名。使用這些簡(jiǎn)單的方法,可以確保您用正確的信任級(jí)別來(lái)對(duì)應(yīng)用程序進(jìn)行簽名。
如果您有關(guān)于本文內(nèi)容的任何反饋,請(qǐng)發(fā)送郵件到 wmsecfbk@microsoft.com。
附錄 A:受保護(hù)的注冊(cè)表項(xiàng)
注冊(cè)表項(xiàng)
|
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:特權(quán) 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 調(diào)試標(biāo)志)
KernelIOControl
|
擴(kuò)展的電話應(yīng)用程序接口 (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
|
短消息服務(wù)
|
SmsSetMessageNotification
SmsClearMessageNotification
SmsReceiveAllMessagesFromSIM
SmsSetSMSC
|
連接管理器
|
ConnMgrProviderMessage
|
Critical Process Monitor (CPM)
|
CPMRegister (Reboot)
CPMShutdown
CPMStatus
CPMRegisterTest
|
無(wú)線電接口層
|
全部 RIL API
注 RIL API 所需的信任級(jí)別可通過(guò)將下列注冊(cè)表項(xiàng)的值從 2 更改為 1 而得以修改: [HKEY_LOCAL_MACHINE\Security\Policy\APIs\RILGSM] @="2"
|