签署.NET程序集的最佳做法?

签署.NET程序集的最佳做法?

Best practices for signing .NET assemblies?

我有一个包含五个项目的解决方案,每个项目都可以编译为单独的程序集。 现在,我正在对它们进行代码签名,但是我敢肯定我做错了。 这里的最佳做法是什么?

  • 用不同的密钥签名。 确保密码不同
  • 用不同的密钥签名。 如果需要,请使用相同的密码
  • 用相同的密钥签名
  • 完全不一样

基本上,我不太确定对他们执行的"签名"操作或此处的最佳做法,因此,更笼统的讨论会很好。 我只知道FxCop对我大吼,很容易通过单击"签名此程序集"复选框并使用Visual Studio(2008)生成.pfx文件来修复。


如果您的唯一目标是制止FxCop对您大吼大叫,那么您已经找到了最佳实践。

对程序集进行签名的最佳实践完全取决于您的目标和需求。我们将需要更多信息,例如您的预期部署:

  • 供个人使用
  • 用于公司网络PC上的客户端应用程序
  • 在Web服务器上运行
  • 在SQL Server中运行
  • 通过互联网下载
  • 收缩包装以CD形式出售
  • 直接上传到控制论的大脑
  • 等等。

通常,您使用代码签名来验证程序集是否来自特定的受信任来源并且尚未进行修改。因此,每个具有相同密钥的都可以。现在,如何确定这种信任和身份又是另一回事了。

更新:如果通过证书颁发机构获得了软件签名证书,则在通过Web进行部署时这对最终用户有何好处。然后,当他们下载程序集时,他们可以验证它们是否来自Domenic的Software Emporium,并且在此过程中没有被修改或损坏。下载后,您还需要对安装程序进行签名。这样可以避免某些浏览器显示已从未知来源获取警告的警告。

注意,您需要支付软件签名证书的费用。您得到的是证书颁发机构成为受信任的第三方,它可以验证您的身份。之所以能够成功,是因为信任网络可以追溯到其操作系统中安装的根证书的方式。有一些证书颁发机构可供选择,但是您将要确保目标操作系统上的根证书支持它们。


有符号和无符号程序集之间最明显的区别是在ClickOnce应用程序中。如果您不签名,则用户在首次运行您的应用程序时会收到一个可怕的"未知发布者"警告对话框。如果您已使用来自可信机构的证书对其进行了签名,那么他们将看到一个不太可怕的对话框。据我所知,使用自己生成的证书签名不会影响"未知发行者"警告。 Comodo的Instant SSL提供了对话框示例。

有一些微妙的差异。您必须先对程序集进行签名,然后才能将其安装在全局程序集缓存(GAC)中,并可以由多个应用程序共享该程序集。签名是代码访问安全性(CAS)不可或缺的一部分,但是我还没有找到可以使CAS正常工作的人。我很确定GAC和CAS都可以与您自己生成的证书一起正常工作。


由于您的PFX文件包含私钥,因此请务必对其保密。

如果该密钥可供其他人使用,则任何人都可以签名伪装成您的程序集或程序。

要将您的名称与程序集相关联(在Windows看来),您需要获取由受信任的机构签署的数字证书(PFX文件中包含您的姓名的部分)。

实际上,您将获得一个新证书,但具有相同的信息。

您必须(可能每年)支付此证书的费用,但是证书颁发机构将有效地证明您的存在(在将其传真或驾驶执照副本以及家庭帐单传真给他们之后)。


这很有帮助,因为可执行文件需要一个重命名的程序集。它阻止任何人恶意替换另一个组件中的组件。用户也可以基于强名称授予程序集CAS权限。

我认为您不应该分发.pfx文件,您可以安全地退出程序集。


签名用于唯一标识程序集。有关更多详细信息,请参见如何:对程序集进行签名(Visual Studio)。

根据最佳实践,只要程序集具有不同的名称,就可以使用相同的键。


推荐阅读

    linux命令创建项目组?

    linux命令创建项目组?,管理,密码,项目,命令,系统,位置,文件,用户组,用户,文

    复制项目的linux命令?

    复制项目的linux命令?,系统,项目,文件,命令,目录,源文件,语法,选项,目标,功

    linux命令行更新密码?

    linux命令行更新密码?,密码,系统,名称,软件,信息,环境,命令,使用者,权限,用

    删除密码命令linux?

    删除密码命令linux?,密码,系统,管理,电脑,软件,百度,信息,名称,名字,命令,lin

    linux串口命令行密码?

    linux串口命令行密码?,密码,系统,状态,信息,标的,地址,用户名,终端,用户,命

    linux命令项目部署?

    linux命令项目部署?,项目,服务,环境,软件,系统,代理,管理,统一,做好,业务,怎

    linux密钥设置命令?

    linux密钥设置命令?,密码,服务,数据,认证,环境,官网,系统,概念,通信,管理,如

    linux部署项目的命令?

    linux部署项目的命令?,项目,系统,设备,环境,工作,基础,传播,信息,标准,代码,L

    linux项目常用命令?

    linux项目常用命令?,工作,地址,系统,信息,管理,项目,命令,目录,标准,网络,lin

    linux项目更新命令?

    linux项目更新命令?,系统,信息,网络,地址,网站,通信,管理,时间,项目,命令,lin

    启动项目命令linux?

    启动项目命令linux?,工作,经理,产品,技术,地址,数字,系统,项目,命令,信息,怎

    linux中修改密码命令?

    linux中修改密码命令?,密码,系统,服务,名称,软件,信息,时间,状态,命令,用户,l

    linux编译项目的命令?

    linux编译项目的命令?,系统,工作,地址,软件,工具,信息,代码,项目,命令,环境,l

    linux生产密钥对命令?

    linux生产密钥对命令?,服务,密码,工具,认证,环境,位置,生产,密钥,下来,系统,

    linux锁定密码命令?

    linux锁定密码命令?,密码,系统,管理,信息,策略,状态,名称,软件,位置,环境,如

    linux看登录密码命令?

    linux看登录密码命令?,密码,系统,信息,地址,命令,用户,位置,设计,电脑,用户

    linux密码管理命令?

    linux密码管理命令?,密码,系统,管理,软件,工具,地址,服务,名称,信息,命令,Lin

    项目linux常用命令?

    项目linux常用命令?,工作,地址,系统,管理,设备,信息,项目,命令,目录,标准,lin

    linux命令界面密码存?

    linux命令界面密码存?,密码,系统,信息,地址,代码,管理,命令,用户,用户名,终

    linux命令查看密码?

    linux命令查看密码?,密码,系统,信息,用户名,命令,用户,终端,用户信息,用户