設定 ClickOnce 信任的發行者
Brian Noyes
Microsoft MVP
2005 年 4 月
適用於:
Visual Studio 2005
總結: ClickOnce 安全性可讓您利用程式碼存取安全性所提供的執行時間安全性保護,同時仍允許透過 ClickOnce 部署應用程式時動態判斷特定應用程式的許可權。 (11 個列印頁面)
目錄
信任的發行者和 ClickOnce 應用程式簽署 101
ClickOnce 啟動時的安全性檢查
進入區域
ClickOnce 信任的發行者作用中
自動化程式
結論
關於作者
ClickOnce 安全性允許根據使用者提示或信任的發行者,自動提高 ClickOnce 部署應用程式的許可權。 當您使用 ClickOnce 部署應用程式時,應用程式所執行的作業或其嘗試存取的資源可能需要代碼存取安全性 (CAS) 許可權大於根據目前原則授與的許可權。 如果是這種情況,根據預設,用戶端電腦上的.NET Framework執行時間會提示使用者,並詢問他們是否要安裝應用程式並授與提高許可權的信任。
在系統管理員擁有每個桌面桌面的桌面和設定控制的企業環境中,通常最好避免提示使用者做出信任決策。 大部分的使用者都沒有複雜性來瞭解其信任決策的影響,而且不知道何時應該或不應該授與應用程式許可權。 ClickOnce 可讓您控制此問題,方法是允許 ClickOnce 應用程式自動提高自己的許可權,而不提示使用者—如果應用程式資訊清單已由受信任的發行者簽署。
信任的發行者和 ClickOnce 應用程式簽署 101
因此,什麼是信任的發行者? 首先,您必須一律使用發行者憑證簽署 ClickOnce 部署和應用程式資訊清單。 接下來,用來簽署 ClickOnce 應用程式的憑證必須在使用者電腦上的受信任發行者憑證存放區中設定。 最後,簽發憑證的憑證授權單位單位必須在使用者電腦上的受信任根憑證授權單位憑證存放區中設定。 我接著會回復這三個部分的各層。
當您第一次在 Visual Studio 2005 中建立Windows Forms應用程式並使用 ClickOnce 發佈時,Visual Studio 會自動為您產生發行者憑證,並在發佈應用程式時使用它來簽署您的應用程式。 這樣做時,它會產生個人憑證檔案 (.pfx 檔案) ,並以 ProjectName > _TemporaryKey.pfx 的預設檔案命名慣例 < 將它新增至 Visual Studio 專案。 Visual Studio 也會將此憑證新增至您的個人憑證存儲,並啟用將此憑證設定為用來簽署 ClickOnce 應用程式資訊清單的專案設定。 因為這一切都會自動發生,您甚至可能還不知道它正在發生。
注意 Beta 1 可讓您依照慣例,使用強式名稱金鑰檔案 (.snk 檔案來強式名稱資訊清單) 。 Beta 2 和 RTM 不再支援此功能,而且您必須使用發行者憑證簽署資訊清單,通常是可能或可能不會受到密碼保護的 .pfx 檔案。
簽署程式會使用憑證中的公開和私密金鑰,將 XML 數位簽章套用至針對 ClickOnce 應用程式產生的部署和應用程式 XML 資訊清單檔。 此數位簽章方法可確保您知道誰根據內嵌在資訊清單檔案中的公開金鑰簽署指定的 ClickOnce 應用程式部署,而且檔案在簽署後未遭到竄改或其內容變更。 這可防止惡意物件在受信任的授權單位發佈之後,將非預期的設定或檔案新增至 ClickOnce 應用程式。
發行者憑證有兩種:由 Verisign 自行產生或協力廠商驗證的 (,例如) 。 憑證是由憑證授權單位單位所簽發,其本身具有憑證,可將其識別為憑證授權單位單位。 自我產生的憑證是您為了開發而建立的憑證,基本上會成為憑證所代表的憑證授權單位單位和發行者。 若要用於生產用途,您應該使用協力廠商所產生的憑證,例如 Verisign 的外部公司或企業環境中的網域系統管理員等內部授權單位。
若要視為信任的發行者,發行者憑證必須安裝在使用者電腦上的受信任發行者憑證存放區中,發行者憑證的發行授權單位必須有自己的憑證安裝在信任的根憑證授權單位憑證存放區中。 您可以使用 Windows 中的 certmgr.exe憑證管理主控台,在電腦上的存放區中管理及安裝憑證,也可以使用 Visual Studio 2005 加以安裝。 我們將在本文稍後逐步引導您完成使用 Visual Studio 的程式。
ClickOnce 啟動時的安全性檢查
第一次在使用者的桌面上啟動 ClickOnce 應用程式時,.NET Framework執行時間會先檢查,以確保應用程式資訊清單因為使用任何發行者憑證進行簽署而未遭到竄改。 如果他們通過該檢查,執行時間就會查看受信任的根憑證授權單位存放區,並查看發行者憑證的簽發者憑證是否已安裝在該存放區中。 然後,它會查看憑證上的發行者是誰,並查看其憑證是否位於信任的發行者存放區中。 如果這兩件事成立,則預設不會提示使用者,而且應用程式將會被授與應用程式資訊清單檔案中指定的任何許可權。 此應用程式的應用程式信任將會新增至使用者的.NET Framework安全性原則,然後應用程式只會啟動並執行,如果應用程式資訊清單中已正確指定許可權,則使用者永遠不會看到提示或安全性例外狀況。
如果憑證的簽發者和憑證所代表的發行者在用戶端電腦上都是未知的, (根據儲存區中安裝的憑證) ,則會提示使用者顯示圖 1 所示的對話方塊,而且他們可以決定是否允許應用程式取得所需的許可權。 視應用程式從哪個區域啟動而定。 如果他們按一下底部的 [ 更多資訊... ] 連結,則會取得圖 2 中顯示的對話方塊,這可讓使用者更詳細地瞭解他們按一下 [ 安裝 ] 按鈕時所要發生的狀況,但一般而言,可能只是要小心,就像大部分的安全性對話方塊一樣,因為它提供非常少有關實際運作的資訊。
圖 1. 不受信任的發行者和憑證授權單位單位使用者提示
圖 2. [詳細資訊] 對話方塊
如果用來簽署應用程式資訊清單的憑證是由受信任的根憑證授權單位所產生,但特定發行者憑證不在受信任的發行者存放區中,則使用者仍會提示,但提示的提示會比發行者憑證的簽發者未知時稍微容易, (請參閱圖 3) 。 較易記的提示會指出發行者組織,因為使用 Authenticode 憑證技術和受信任的根目錄,您至少可以信任發佈組織是他們根據憑證的簽發者所說。 如果您信任發行授權單位,則您可以信任發行者不代表他們不是某人。
圖 3. 信任的憑證授權單位單位使用者提示
為指定的應用程式建立應用程式信任之後,可能是因為根據信任的發行者憑證自動設定,或根據提示的使用者,並允許應用程式安裝,除非要求的安全性許可權變更,否則後續版本的相同應用程式就不需要再次提示。
進入區域
CAS 中有五個內建的安全性區域用於原始信任決策:MyComputer、LocalIntranet、Internet、TrustedSites 和 UntrustedSites。 這些相同的區域可用來判斷應針對提高 ClickOnce 應用程式許可權的使用者允許何種提示。 每個區域都會對應到 ClickOnce 應用程式啟動的來源內容,此內容取決於用於 ClickOnce 應用程式部署資訊清單 (.application 檔案的完整路徑位址) 。
表 1 會根據部署資訊清單所使用的位址,顯示一些啟動區域的範例。 基本上,如果位址是非網路磁片磁碟機的本機檔案路徑,應用程式將會在 MyComputer 區域中啟動。 如果位址使用網路通訊協定 (HTTP 或 UNC 檔案共用) ,且位址的伺服器部分是單一電腦名稱稱,則會評估為來自 LocalIntranet 區域。 如果位址的伺服器名稱部分包含點,則會評估為來自網際網路區域。 TrustedSites 和 UntrustedSites 取決於設定為 Internet Explorer 受信任網站和受限制網站安全性設定一部分的個別位址。
表 1. ClickOnce 啟動區域範例
啟動位址 | 啟動區域 |
---|---|
http://deploymentserver/MyClickOnceApp/MyClickOnceApp.application | LocalIntranet |
\\deploymentserver\MyClickOnceApp\MyClickOnceApp.application | LocalIntranet |
http://some.dotted.servername/Apps/MyClickOnceApp.application | 網際網路 |
\\127.0.0.1\sharefolder\MyClickOnceApp.application | 網際網路 |
C:\inetpub\wwwroot\MyClickOnceApp\MyClickOnceApp.application | MyComputer |
根據預設,如果未由受信任的發行者簽署,MyComputer、LocalIntranet 和 TrustedSites 會設定為允許使用者提高 ClickOnce 應用程式的安全性許可權。 網際網路區域預設值是,如果應用程式資訊清單是由受信任的根授權單位所簽發的發行者憑證簽署,則該應用程式可以視需要提示使用者取得提高的許可權 (,亦即,發行者憑證也不會安裝在信任的發行者存放區) 。 如果 Interne 啟動的應用程式未使用受信任的根授權單位所簽發的憑證簽署,則不允許執行應用程式。 UntrustedSites 區域預設值是,如果應用程式不是由受信任的發行者憑證所簽發的受信任發行者憑證簽署,則應用程式將無法執行 (,換句話說,不允許使用者提示) 。
您可以藉由設定 ClickOnce 將檢查的隱藏登錄機碼設定為判斷使用者提示原則,來修改企業所需的這些設定。 上述每個行為都對應至您可以透過此登錄機碼為每個區域設定的值。
登錄機碼 \HKLM\Software\Microsoft\。NETFramework\Security\TrustManager\PromptingLevel 是可讓您自訂提示行為的方法。 在安裝 .NET Framework 2.0 之後,預設不會顯示此機碼,因此如果您想要自訂這些設定,則必須手動建立它。
在該登錄機碼下,您可以新增任何 5 個字串值,名為 MyComputer、LocalIntranet、Internet、TrustedSites 和 UntrustedSites。 這些對應至各自的區域。 作為這些值,您可以設定三個字串的其中一個:Enabled、Disabled 或 AuthenticodeRequired。 Enabled 是 MyComputer、LocalIntranet 和 TrustedSites 區域的預設值。 網際網路預設值為 AuthenticodeRequired,而 UntrustedSites 預設值為 Disabled。 表 2 顯示您可以為每個區域及其效果設定的值。 圖 4 顯示設定為其預設行為的登錄機碼值,但請記住,此機碼預設不存在,因此您通常只會在將它們設定為與預設值不同的值時加以建立。
表 2. PromptingLevel 登錄機碼值啟動效果
值 | 不受信任的根授權單位 | 由受信任的根授權單位簽發的憑證 | 受信任的根授權單位和受信任的發行者憑證 |
---|---|---|---|
啟用 | 不頻繁的使用者提示 | 易記的使用者提示 | 沒有提示;授與的許可權和應用程式啟動 |
AuthenticodeRequired | 應用程式已停用 | 易記的使用者提示 | 沒有提示;授與的許可權和應用程式啟動 |
已停用 | 應用程式已停用 | 應用程式已停用 | 沒有提示;授與的許可權和應用程式啟動 |
圖 4. 使用者提示登錄機碼值
ClickOnce 信任的發行者作用中
若要測試這一點,您必須在開發電腦上設定憑證。 第一個步驟是讓憑證用來簽署 ClickOnce 應用程式,並在開發或測試電腦上的所需憑證存放區中設定該憑證。 如先前所述,除非您先設定憑證來簽署 ClickOnce 資訊清單,否則 Visual Studio 會為每個 ClickOnce 專案產生新的憑證。 建議您產生新的測試憑證,並將它儲存到已知位置,然後使用該憑證簽署所有開發 ClickOnce 專案,如此您就不需要使用大量測試憑證來卸載憑證存放區。 自動產生的憑證未受到密碼保護,強烈建議您只使用受密碼保護的憑證檔案。
若要在受密碼保護的 Visual Studio 2005 中產生新的憑證檔案,請移至專案屬性視窗 (按兩下 方案總管 中的 [屬性] 節點,或以滑鼠右鍵按一下專案節點,然後從操作功能表選取 [屬性]) 。 選取 [ 簽署] 索引標籤,核取 [ 簽署 ClickOnce 資訊清單 ] 核取方塊,然後按一下 [ 建立測試憑證...] 按鈕, (請參閱圖 5) 。 系統會提示您輸入密碼,並將預設名稱的新 pfx 檔案新增至您的專案。 此憑證也會設定為用來簽署資訊清單的憑證,並將它安裝在 Windows 的個人憑證存儲中。 接著,您可以重新命名檔案、將其複製到可重複使用的位置,然後在 [簽署] 索引標籤中按 [從檔案選取...] 按鈕,將該憑證設定為任何應用程式的憑證。
圖 5. 簽署專案屬性
一旦您擁有憑證,並識別在簽署專案屬性中用來簽署 ClickOnce 資訊清單的憑證之後,您就可以從 Visual Studio 發佈您的應用程式,並使用該憑證簽署資訊清單。 如果您發生「實際」發行者憑證 (,也就是 Verisign 憑證,或開發組織使用由某些其他受根信任授權單位簽署的憑證) ,則可以改用檔案中的憑證,如上所述,或是使用簽署專案屬性中的 [ 選取來源存放區...] 按鈕指向您個人存放區中的憑證。
若要查看如何使用信任的發行者部署來避免使用者提示,您必須在將應用程式啟動時使用 ClickOnce 的電腦上設定發行者憑證,這通常是您的開發機器以進行第一次試用和開發用途。 如果您自行產生憑證,如上述 (或使用 Visual Studio) 隨附的makecert.exe命令列公用程式,您必須將該憑證新增至受信任的根憑證授權單位存放區。 這是因為您不只是發行者,也是憑證的簽發者。 您接著也會想要將相同的憑證安裝到信任的發行者存放區,這是允許應用程式啟動而不提示的最後一個步驟。
若要讓這一切具體化,讓我們逐步解說數位的範例。 在 Visual Studio 2005 中啟動新的 Windows 應用程式專案,並將其命名為 ClickOnceTrustedPub。 建立專案之後,按兩下專案節點下方案總管樹狀結構中的 [屬性] 節點,然後選取 [簽署]索引標籤,以移至專案屬性。
接下來,選取方塊以 簽署 ClickOnce 資訊清單。 按 [ 建立測試憑證...] 按鈕,然後輸入憑證的密碼。 將建立並新增至專案的檔案將會命名為 ClickOnceTrustedPub_TemporaryKey.pfx。 將它重新命名為 方案總管 中的 devcert.pfx。 這也是將檔案複製到您電腦上的一些常見開發資料夾的好時機,讓您可以針對後續專案重複使用檔案,而不需要保留重新產生和設定憑證。 建立憑證檔案時,Visual Studio 也會將其安裝在您個人憑證存儲中。
若要將此憑證新增至信任的根憑證授權單位和受信任的發行者存放區,請按一下 [簽署專案屬性] 索引標籤中的 [ 更多詳細資料 ] 按鈕。這會顯示憑證資訊對話方塊, (請參閱圖 6) 。 按一下 [一般] 索引標籤底部的 [安裝憑證...]按鈕,您會看到 [憑證匯入精靈]。
圖 6. [憑證資訊] 對話方塊
在精靈的第二個步驟中,選取選項按鈕以將所有 憑證放在下列存放區中,然後按 [ 流覽 ] 按鈕 (請參閱圖 7) 。 這會開啟一個對話方塊,您可以在其中從憑證存放區清單中選取 , (請參閱圖 8) 。
圖 7. 證書精靈存放區選取專案
圖 8. 憑證存放區選取對話方塊
第一次完成此程式時,請選取 [受信任的根憑證授權單位 ] 存放區,按 [ 下一步],然後在精靈中 完成 。 系統會提示您輸入詳細資訊安全性警告對話方塊,說明安裝根憑證的危害。 繼續按一下 [ 是 ],或您將無法試用 ClickOnce 的信任發行者功能,但請確定您瞭解其描述的風險。 如果其他人取得您的憑證、使用它簽署應用程式,然後在您的電腦上啟動它,Windows 會將該應用程式視為已由受信任的授權單位驗證的公司發佈。
重複從 [ 更多詳細資料 ] 按鈕開始所述的程式,但這次會將相同的憑證安裝到信任的發行者存放區。
完成此動作之後,您就可以使用 ClickOnce 發佈應用程式。 若要這樣做,請從 Visual Studio 的 [建置] 功能表中選取 [發佈< ProjectName > ],然後按一下精靈中隨即快顯的 [完成]。 這會建置您的應用程式、使用預設 ClickOnce 發佈設定加以發佈,並為您提供網頁,您可以按一下網頁上的 [ 安裝 ] 按鈕,以用戶端身分測試安裝。 如果您按一下該按鈕,應用程式應該會在桌面下載並執行,而不需要任何形式的提示。 ClickOnce 應用程式所要求的預設許可權不受限制 (完全信任) ,而呈現的預設 [安裝 ] 按鈕連結會使用 LocalIntranet 區域 URL。 因此,如果您在未設定信任的發行者憑證的情況下重複此相同程式,系統就會提示您輸入圖 1 所示的對話方塊。
自動化程式
在有許多使用者機器要維護的作業環境中,您不會讓每部電腦上都能使用 Visual Studio 來設定發行者憑證,因此您必須使用 Windows 中包含的憑證管理主控台 (certmgr.exe) 。 如果您剛從命令列執行certmgr.exe沒有引數,則會出現 Microsoft Management Console (MMC) 視窗,可讓您從本機電腦上的任何存放區新增或移除憑證。 但即使如此,您可能不想要觸碰每部電腦來設定憑證。 程式也可以使用certmgr.exe搭配一些命令列參數來自動化。
您必須先使用 [ 匯出 ] 按鈕,將憑證的公用部分匯出至憑證檔案 (.cer) :
圖 9. Certmgr.exe匯出憑證
完成後,您可以將該憑證檔案複製到目的電腦,並在命令列上執行certmgr.exe。 您必須將檔案名與儲存區一起傳遞為具有適當參數的命令列參數,並將憑證安裝在機器上:
certmgr –add alice.cer –s Root
certmgr –add alice.cer –s TrustedPublisher
這全都可以透過 Visual Studio 安裝程式和部署專案來編寫腳本或新增至自訂安裝程式, (或某種其他類型的安裝程式) ,而產生的 Windows Installer 套件 (.msi 檔案) 可以新增至 ClickOnce 應用程式的啟動載入器。 如需啟動載入器的詳細資訊,請參閱 Sean Draine 的文章 :使用 Visual Studio 2005 Bootstrapper 在 MSDN Magazine 的 2004 年 10 月問題中Kick-Start您的安裝 。
結論
ClickOnce 安全性可讓您利用程式碼存取安全性所提供的執行時間安全性保護,同時仍允許透過 ClickOnce 部署應用程式時動態判斷特定應用程式的許可權。 不過,這種彈性是一種價格,您必須決定是否允許使用者負責透過提示提高應用程式許可權,以及是否要根據發行者憑證的來源來提示。 ClickOnce 的預設行為是最容易瞭解的行為。 應用程式將會自動提高其許可權,因為它是從信任的發行者部署,還是會提示使用者決定是否信任發行者。 在更受控制的環境中,您可能想要限制使用者提示,本文已拼字說明如何使用 PromptingLevel 登錄機碼來執行這項操作,以及在使用者的電腦上設定發行者和受信任的跟授權單位憑證。 瞭解各種值的效果,以及它們如何以不同的憑證存放區組態運作,對於適當運用 ClickOnce 的安全性保護很重要。
關於作者
Brian Noyes 是 Microsoft MVP 和知名的演講者、訓練人員、作者和顧問,與 IDesign, Inc. (www.idesign.net) 。 他于 TechEd US 和馬來西亞、Visual Studio Connections、VSLive!、DevEssentials 和其他會議演講,而且是 INETA 演講者局上排名最高的演講者之一。 他已針對 MSDN Magazine、Visual Studio Magazine、asp.netPRO、Server Side .NET、CoDe Magazine、.NET Developer 的日誌和其他發行集,發佈許多.NET Framework開發文章。 他的最新書籍:Windows Forms 2.0 中的資料系結,這是Addison-Wesley .NET 開發系列一部分,將于 2005 年秋季達到擱置。 Brian 開始進行程式設計,以在飛機中飛出 F-14 Tomcats 時,開始設計自己的大腦,並套用他的技能與興趣來設計飛機和飛行器模擬、原型,以及支援應用程式,同時鼓勵他參加 Top Gun 和美式測試試驗學校的鬆散活動。