• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 2, 文章 - 73, 評(píng)論 - 60, 引用 - 0
            數(shù)據(jù)加載中……

            Smartphone 應(yīng)用程序安全與代碼簽名模型開發(fā)人員實(shí)用指南

            Smartphone 應(yīng)用程序安全與代碼簽名模型開發(fā)人員實(shí)用指南
            發(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)用程序安全背景 應(yīng)用程序安全背景
            代碼簽名實(shí)踐 代碼簽名實(shí)踐
            小結(jié) 小結(jié)
            附錄 A:受保護(hù)的注冊(cè)表項(xiàng) 附錄 A:受保護(hù)的注冊(cè)表項(xiàng)
            附錄 B:特權(quán) API 列表 附錄 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

            按照下面這些步驟打開命令提示,并將目錄切換到工具目錄:

            1. 單擊 Start 菜單,然后單擊 Run(或者按下 Windows 徽標(biāo)鍵和 R)。Run 對(duì)話框打開。

            2. 在編輯字段中鍵入 cmd,然后按下 ENTER 鍵。命令窗口打開。

            1. 打開命令窗口
            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ò)誤:

            無(wú)標(biāo)題

            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ù)。

            無(wú)標(biāo)題

            5. 使用一個(gè)參數(shù)

            當(dāng)您使用不帶 /create 開關(guān)的 /device 時(shí),實(shí)用工具會(huì)要求您選擇一種證書。

            無(wú)標(biāo)題

            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ū)中,您需要:

            1. 在 Explorer 中雙擊 .pfx 文件。

            2. 單擊“Next”。

            3. 再次單擊“Next”。

            4. 再次單擊“Next”— 證書沒有密碼。

            5. 選擇“Automatically select cert store”,然后單擊“Next”。

            6. 單擊“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 中:

            1. 轉(zhuǎn)到 Project,然后選擇“Settings”。

            2. 滾動(dòng)到最右側(cè)的選項(xiàng)卡“Security”(參見步驟 7 中的注釋)。

            3. 只選中頂部的復(fù)選框(對(duì)該應(yīng)用程序進(jìn)行簽名)。

            4. 按下上面的“Browse”按鈕。

            5. 選擇稱為“Smartphone 2003 Unprivileged Test Signing Authority”的證書,然后單擊“OK”。

            6. 取消選中“Configure device to trust signed applications”復(fù)選框。

              我們已經(jīng)將證書提供到我們希望它們位于其中的存儲(chǔ)區(qū);因此我們不希望工具再次提供它們。通過(guò)取消選中該框,我們可以防止錯(cuò)誤的證書進(jìn)入到錯(cuò)誤的存儲(chǔ)區(qū)中。

            7. 單擊“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)

            1. 轉(zhuǎn)到 Project 并選擇 Settings。

            2. 滾動(dòng)到最右側(cè)的選項(xiàng)卡 Security(參見步驟 7 中的注釋)。

            3. 只選中上面的復(fù)選框(對(duì)該應(yīng)用程序進(jìn)行簽名)

            4. 按下上面的 Browse 按鈕。

            5. 從上表選擇證書。

            6. 取消選中“Configure device to trust signed applications”復(fù)選框。

              我們已經(jīng)將證書提供到了我們希望它們位于其中的存儲(chǔ)區(qū);因此我們不希望工具再次提供它們。通過(guò)取消選中該框,我們可以防止錯(cuò)誤的證書進(jìn)入到錯(cuò)誤的存儲(chǔ)區(qū)中。

            7. 單擊“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ì)如何做到這些,包括:

            1. 為特權(quán)、非特權(quán)以及安裝存儲(chǔ)區(qū)創(chuàng)建適當(dāng)?shù)?.xml 文件。

            2. 使用 rapiconfig 獲取電話信息。

            3. 識(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)用程序:

            1. 可以用從一個(gè) Mobile2Market 證書供應(yīng)商處購(gòu)買的證書來(lái)對(duì)應(yīng)用程序的可執(zhí)行組件(.exe 和 .dll)進(jìn)行簽名。下面是關(guān)于如何完成這些的指導(dǎo)。

            2. 通過(guò) Web 接口將經(jīng)過(guò)簽名的應(yīng)用程序組件提交給證書供應(yīng)商。聯(lián)系您的證書供應(yīng)商以獲得具體指導(dǎo)。受電話信任的證書簽名的一個(gè)或多個(gè)文件將返回給您。

            3. 將這些組件構(gòu)建到安裝包 (.cab) 文件中。

            4. 使用從某個(gè) Mobile2Market 證書供應(yīng)商處購(gòu)買的證書對(duì) .cab 文件進(jìn)行簽名。本文后面的部分有關(guān)于如何這樣做的指導(dǎo)。

            5. 通過(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"

            posted on 2007-12-17 11:14 郭天文 閱讀(388) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Windows Mobile

            久久精品视屏| 亚洲AV无码1区2区久久| 国产精品久久久天天影视香蕉| 丁香五月网久久综合| 国产伊人久久| 久久免费的精品国产V∧ | 亚洲欧洲久久久精品| 国产亚洲精品久久久久秋霞| 国产精品毛片久久久久久久| 免费精品久久久久久中文字幕| 色综合久久中文字幕无码| 国内精品久久九九国产精品| 一本久久a久久精品综合香蕉| 久久精品9988| 久久久久亚洲Av无码专| 久久久受www免费人成| 久久99国产精品尤物| 亚洲精品无码久久毛片| 国产成人精品久久综合 | 久久久精品久久久久影院| 久久er热视频在这里精品| 久久99久国产麻精品66| 手机看片久久高清国产日韩 | 中文精品久久久久国产网址| 99精品国产99久久久久久97| 久久免费99精品国产自在现线 | 久久精品国产欧美日韩| 亚洲国产精品久久久久婷婷老年 | 一级做a爰片久久毛片毛片| 亚洲国产精品人久久| 精品少妇人妻av无码久久| av色综合久久天堂av色综合在| 热RE99久久精品国产66热| 久久99精品久久久久久水蜜桃| 亚洲国产成人久久综合一| 国产精品伦理久久久久久| 国产精品99久久久久久www| 国产精品免费久久久久电影网| 国产精品久久久天天影视香蕉 | 久久99精品久久久久久不卡| 国产精品久久久久久久久久免费|