配置 ClickOnce 受信任的发布服务器
布赖恩·诺耶斯
Microsoft MVP
2005 年 4 月
适用于:
Visual Studio 2005
总结: ClickOnce 安全性允许利用代码访问安全性提供的运行时安全保护,同时仍允许在通过 ClickOnce 部署应用程序时动态确定特定应用程序的权限。 ) (11 个打印页
目录
受信任的发布者和 ClickOnce 应用程序签名 101
启动时的 ClickOnce 安全检查
进入区域
ClickOnce 受信任的发布者在操作
自动执行流程
结论
关于作者
ClickOnce 安全性允许基于用户提示或受信任的发布者自动提升 ClickOnce 部署的应用程序的权限。 使用 ClickOnce 部署应用程序时,应用程序执行的操作或其尝试访问的资源可能需要代码访问安全 (CAS) 权限大于根据当前策略授予的权限。 如果是这种情况,默认情况下,客户端计算机上的.NET Framework运行时会提示用户,询问他们是否要安装应用程序并授予其提升的信任。
在管理员拥有桌面的企业环境中,可以控制每个桌面的配置,通常最好避免提示用户做出信任决策。 大多数用户没有了解其信任决策的影响,也不知道何时应或不应授予应用程序权限。 如果应用程序清单已由受信任的发布者签名,ClickOnce 允许 ClickOnce 应用程序自动提升其自己的权限,而无需用户提示,则 ClickOnce 可让你控制此问题。
受信任的发布者和 ClickOnce 应用程序签名 101
那么,什么是受信任的发布者呢? 首先,必须始终使用发布者证书对 ClickOnce 部署和应用程序清单进行签名。 接下来,必须在用户计算机上的受信任发布者证书存储中配置用于对 ClickOnce 应用程序进行签名的证书。 最后,颁发证书的证书颁发机构必须在用户计算机上的“受信任的根证书颁发机构”证书存储中配置。 我会依次剥开这三个部分的层。
首次在 Visual Studio 2005 中创建Windows 窗体应用程序并使用 ClickOnce 发布应用程序时,Visual Studio 将自动生成发布者证书,并在发布应用程序时使用它对应用程序进行签名。 执行此操作时,它会生成个人证书文件 (.pfx 文件) ,并使用默认文件命名约定 <ProjectName>_TemporaryKey.pfx 将其添加到 Visual Studio 项目中。 Visual Studio 还会将此证书添加到个人证书存储,并启用将此证书设置为用于对 ClickOnce 应用程序清单进行签名的项目设置。 由于这一切自动发生,因此你甚至可能不知道它正在发生。
注意 Beta 1 允许你根据约定) 使用强名称密钥文件 (.snk 文件对清单进行强名称命名。 Beta 2 和 RTM 不再支持此功能,必须使用发布者证书(通常是可能受密码保护的 .pfx 文件)对清单进行签名。
签名过程使用证书中的公钥和私钥将 XML 数字签名应用于为 ClickOnce 应用程序生成的部署和应用程序 XML 清单文件。 此数字签名方法可确保知道谁根据清单文件中嵌入的公钥对给定的 ClickOnce 应用程序部署进行了签名,并且文件自签名以来未被篡改或其内容发生任何更改。 这可以防止恶意方在受信任的机构发布 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 区域。 如果地址的服务器名称部分包含点,则将其计算为来自 Internet 区域。 TrustedSites 和 UntrustedSites 依赖于作为 Internet Explorer 受信任站点和受限站点安全设置一部分配置的单个地址。
表 1. ClickOnce 启动区域示例
启动地址 | 启动区域 |
---|---|
http://deploymentserver/MyClickOnceApp/MyClickOnceApp.application | LocalIntranet |
\\deploymentserver\MyClickOnceApp\MyClickOnceApp.application | LocalIntranet |
http://some.dotted.servername/Apps/MyClickOnceApp.application | Internet |
\\127.0.0.1\sharefolder\MyClickOnceApp.application | Internet |
C:\inetpub\wwwroot\MyClickOnceApp\MyClickOnceApp.application | MyComputer |
默认情况下,MyComputer、LocalIntranet 和 TrustedSites 配置为允许用户提示提升 ClickOnce 应用程序的安全特权(如果该应用程序未由受信任的发布者签名)。 Internet 区域默认值为,如果应用程序清单由受信任的根颁发机构颁发的发布者证书签名,则该应用程序可以根据需要提示用户提供提升的权限 (即,发布者证书也不会安装在受信任的发布者存储) 中。 如果 Interne 启动的应用程序未使用受信任的根颁发机构颁发的证书进行签名,则不允许运行该应用程序。 UntrustedSites 区域默认值为,如果应用程序未由受信任的根颁发机构颁发的受信任发布者证书签名,则不允许应用程序 (运行,也就是说,不允许) 用户提示。
如果需要,可以通过配置一个模糊的注册表项来修改这些设置,ClickOnce 将检查该注册表项以确定用户提示策略。 上述每个行为对应于可以通过此注册表项为每个区域设置的值。
注册表项 \HKLM\Software\Microsoft\。NETFramework\Security\TrustManager\PromptingLevel 可用于自定义提示行为。 默认情况下,.NET Framework 2.0 安装后,此密钥不存在,因此如果要自定义这些设置,则必须手动创建它。
在该注册表项下,可以添加 5 个字符串值中的任何一个,这些值名为 MyComputer、LocalIntranet、Internet、TrustedSites 和 UntrustedSites。 这些区域对应于各自的区域。 作为这些字符串的值,可以设置三个字符串之一:Enabled、Disabled 或 AuthenticodeRequired。 “启用”是 MyComputer、LocalIntranet 和 TrustedSites 区域的默认值。 Internet 默认值为 AuthenticodeRequired,UntrustedSites 默认值为 Disabled。 表 2 显示了可以为每个区域设置的值及其效果。 图 4 显示了将注册表项值设置为其默认行为,但请记住,默认情况下,此注册表项不存在,因此通常仅当要将注册表项的值设置为与默认值不同的值时,才会创建它。
表 2. PromptingLevel 注册表项值启动效果
值 | 不受信任的根颁发机构 | 受信任的根颁发机构颁发的证书 | 受信任的根颁发机构和受信任的发布者证书 |
---|---|---|---|
已启用 | 不友好的用户提示 | 友好的用户提示 | 无提示;授予的权限和应用启动 |
AuthenticodeRequired | 应用程序已禁用 | 友好的用户提示 | 无提示;授予的权限和应用启动 |
已禁用 | 应用程序已禁用 | 应用程序已禁用 | 无提示;授予的权限和应用启动 |
图 4。 用户提示注册表项值
ClickOnce 受信任的发布者在操作
若要对此进行测试,需要在开发计算机上配置证书。 第一步是拥有用于对 ClickOnce 应用进行签名的证书,并在开发或测试计算机上的所需证书存储中配置该证书。 如前所述,Visual Studio 将为每个 ClickOnce 项目生成一个新证书,除非在首次发布应用程序之前配置用于对 ClickOnce 清单进行签名的证书。 建议生成一个新的测试证书,将其保存到已知位置,然后使用该证书对所有开发 ClickOnce 项目进行签名,这样就不必在证书存储中乱扔一堆测试证书。 自动生成的证书不受密码保护,强烈建议仅使用受密码保护的证书文件。
若要在 Visual Studio 2005 中生成受密码保护的新证书文件,请转到项目属性窗口 (双击 解决方案资源管理器 中的“属性”节点,或右键单击项目节点,然后从上下文菜单中选择“属性”) 。 选择“签名”选项卡,检查“对 ClickOnce 清单检查签名”框,然后单击“创建测试证书...”按钮 (请参阅图 5) 。 系统将提示你输入密码,并将一个具有默认名称的新 pfx 文件添加到项目中。 此证书还将设置为用于对清单进行签名的证书,并将安装在 Windows 的个人证书存储中。 然后,可以重命名文件,将其复制到可重用的位置,然后按“签名”选项卡中的“从文件选择...”按钮,将该证书配置为任何应用程序的证书。
图 5。 对项目属性进行签名
获得证书并识别用于签名项目属性中的 ClickOnce 清单的证书后,即可从 Visual Studio 发布应用程序,并使用该证书对清单进行签名。 如果碰巧有一个“真实”发布者证书 (即 Verisign 证书,或者你的开发组织使用由其他受信任的根颁发机构) 签名的证书,则可以改用该证书,如上文所述,或者通过使用签名项目属性中的 “从存储选择...” 按钮指向个人存储中的证书。
若要了解如何避免使用受信任的发布者部署出现用户提示,需要在使用 ClickOnce 启动应用的计算机上配置发布者证书,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 管理控制台 (MMC) 窗口,允许你从本地计算机上的任何存储区添加或删除证书。 但是,即使这样,你可能也不希望去触摸每台计算机来配置证书。 还可以使用certmgr.exe和一些命令行参数自动执行此过程。
首先需要使用“ 导出 ”按钮将证书的公共部分从 certmgr 导出到证书文件 (.cer) :
图 9. Certmgr.exe导出证书
完成此操作后,可以将该证书文件复制到目标计算机,并在命令行上运行certmgr.exe。 需要向其传递文件名以及存储区,以便将其作为命令行参数与相应的开关一起放置,并在计算机上安装证书:
certmgr –add alice.cer –s Root
certmgr –add alice.cer –s TrustedPublisher
所有这些都可以通过 Visual Studio 安装程序和部署项目 (或某种其他形式的安装程序) 编写脚本或添加到自定义安装程序,生成的 Windows Installer 包 (.msi 文件) 可以添加到 ClickOnce 应用程序的引导程序。 有关引导程序的详细信息,请参阅 2004 年 10 月版 MSDN 杂志中的使用 Visual Studio 2005 引导程序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 杂志、Visual Studio 杂志、asp.netPRO、服务器端 .NET、CoDe 杂志、.NET 开发人员杂志和其他出版物发表了许多关于.NET Framework开发的文章。 他的最新一本书《Windows 窗体 2.0 中的数据绑定》是Addison-Wesley .NET 开发系列的一部分,将于 2005 年秋季上架。 布莱恩开始编程,以刺激他的大脑,同时驾驶F-14汤姆猫在海军,应用他的技能和兴趣编程飞机和航空电子模拟,原型和支持应用,同时刺激他的肾上腺参加Top Gun和美国海军测试飞行员学校。