什么是代码签名?如何获取代码签名证书? - Entrust
代码签名是使用签名工具和数字证书对可执行文件和脚本进行数字签名的过程。此过程以一种名为公钥基础架构 (PKI) 的技术为基础。
对代码进行签名需要专用的签名工具,例如微软的 SignTool、Java 的 Jarsigner 甚至 OpenSSL,具体取决于要签名的文件类型。签名本身是一种加密操作,它将文件的内容与数字证书相绑定。
代码签名可保护公司、合作伙伴和最终用户在下载可执行的程序文件时免遭软件篡改,尤其是那些来自互联网等不安全渠道的文件。 作为代码签名解决方案提供商,Entrust 可以帮助您实施高效、高度安全的代码签名解决方案,保护您的业务和客户免受伪造或修改应用程序的攻击。
执行代码电子签名的目的为何?
对代码进行数字签名有两个主要原因:
- 要向用户提供发布签名文件的组织的身份
- 要提供一种方法来验证文件的完整性,即自签名以来,文件没有被损坏或被恶意更改
什么是代码签名证书?
代码签名证书由软件开发人员使用,以对应用程序、驱动程序、可执行文件和软件程序进行电子签名。 这有助于为最终用户验证代码未被第三方入侵或黑客攻击。 为了将公钥与其关联用户(私钥的所有者)绑定,公钥基础设施 (PKI) 使用数字证书。
代码签名最佳实践
代码签名证书最佳实践包括:
- 控制对私钥的访问
- 利用 FIPS-140-2 3 级硬件安全模块 (HSM) 保护私钥
- 时间戳代码
- 了解测试签名和发布签名间的区别
- 对要签署的代码进行身份验证
- 将风险分配至多个证书
- 撤销已遭泄露的证书
Entrust 提供全方位的代码签名证书以及全面的管理方法,包括 TLS/SSL 证书、安全电子邮件证书、文档签名证书以及移动设备证书。
代码签名是工作原理是?
若要实施代码签名,软件发布者需要生成私有公钥对,并将公钥提交给证书颁发机构,同时还需要签发代码签名证书的请求。 证书颁发机构验证软件发布者的身份,并对发布者的电子签名证书请求进行身份验证。 成功完成此审查和密钥验证流程后,证书颁发机构将发布者的身份与公钥捆绑在一起,并对此捆绑包签名。 代码签名证书就会创建完成。
阅读本白皮书,深入了解如何实施代码签名。
电子签名的方法
各种应用平台支持代码签名,并提供不同的工具进行签名。 以下是更常见的代码签名类型列表:
- Adobe AIR
- Apple Mac OS X Developer Library
- Firefox XPI
- Java
- 微软
最终用户步骤
用户应采取五个简单的步骤来确定软件是否可信:
- 查看您是否计划安装该软件。
- 查看文件名,确定其是否为您要计划安装的软件。 在上个示例中,用户正在安装 Adobe Reader 10,名称似乎表明了这一点。
- 查看发布者名称,检查其是否与您认为的软件编写者名称相符。 这可能很困难,因为软件下载站点可能与发布者的站点不同。
- 查看代码签名证书,检查证书中是否包含发布者的名称。
- 查看证书是否由公用受信证书颁发机构颁发。
代码签名功能
组织验证 (OV) 证书显示证书上的组织和所在位置。 此证书不支持 Windows 内核模式签名。 扩展验证 (EV) 证书除了显示组织和所在位置外,还会显示司法管辖区和组织类型。 EV 证书还支持 Vista、Windows 7、Windows 8、Windows 8.1 和 Windows 10 的 Windows 内核模式签名。 选择适合贵组织需求的代码签名证书解决方案非常复杂,但 Entrust 可以为您提供相关帮助。
代码签名解决方案
Entrust 的代码签名解决方案组合将防篡改的 nShield 硬件安全模块 (HSM) 与 Entrust 专业服务的代码签名网关解决方案结合在一起。 代码签名网关管理授权工作流、接受请求、通过电子邮件通知批准者、管理超时、确认批准、记录活动并将已签名的代码传送至暂存区。 该解决方案利用 Entrust nShield HSM 和信任根,保护经 FIPS 140-2 认证的 HSM 中的所有签名密钥。 如此能够防止可能丢失宝贵的签名密钥,即代码真实性和完整性的密钥。 这使客户能够签署自己的软件代码。 功能包括:
- Microsoft Smartscreen 筛选工具
- 第三方集成
- 无限集成
- 时间戳
- 识别的发布者状态
- 减少警告框
Entrust 代码签名解决方案以我们在代码签名最佳实践和应尽谨慎标准方面积累的丰富专业知识为基础。
代码签名如何提供发布签名文件的组织的身份?
数字签名在文件和数字证书之间建立加密联系,而数字证书代表组织。您可以将证书视为数字化的橡皮图章,它包含有关组织的详细信息,例如其依法登记的名称、电子邮件地址、实际地址和国家/地区。因此,签名代码相当于在代码上加盖数字图章,将显示组织的详细信息。
每次打开已签名的文件时,都可以检查代码签名的详细信息。在大多数情况下,这由操作系统自动完成,向您显示用于签名的证书中所包含的组织的名称。
代码签名如何提供验证文件完整性的方法?
每个代码签名都是根据文件的内容创建的。在不涉及太多技术细节的前提下,签名工具将计算出要签名的文件的精简版本(我们称之为哈希值),然后使用所提供的数字证书对该精简版本进行签名。 然后,此签名的哈希值将嵌入到文件中,专用于托管数字签名。
一旦您开始分发签名的文件,操作系统和相关应用程序就会检测到签名的存在。他们将自动计算文件的哈希值(计算中不包括签名的哈希值),并将其与文件中嵌入的签名哈希值进行比较。如果两者相同,则验证通过。如果计算出的哈希值与签名的哈希值不同,则会失败。验证失败意味着在执行签名后(出于错误或恶意意图)修改了文件的内容。
这种机制的可靠性取决于用于计算哈希值的算法的强度——哈希值越长越好。当前使用的标准之一是 SHA-256,这是一种生成 256 位哈希值的算法。
代码签名验证有何益处?
对代码进行数字签名有几个优势:
- 您可以提高用户对软件的信心。签名代码证明该文件不仅属于预期的组织,而且还保证它没有被篡改(例如注入恶意软件)。
- 您可提高您作为软件开发人员的声誉。您发布的签名软件越多,您的声誉就越高。例如,Microsoft 代码对其软件进行签名,以确保其客户下载正确的文件。签名的软件对防病毒和恶意软件检测器也很有帮助。如果您对软件进行签名,他们将能够标记您的软件的可疑的、未签名的版本。
- 您可以避免来自操作系统的警告和阻止。他们确实希望所有软件发行商都能签署其可执行文件。如果您发布了未签名的软件并且用户启动了该软件,则他们很有可能看到来自操作系统的警告消息。MacOS 以拒绝启动未签名的文件而闻名,迫使用户绕过安全措施继续安装。
在微软 Windows 10 上安装未签名软件的警告消息。
在 macOS 上安装未签名软件的阻止消息。
对于使用固件的 IoT 设备,确保安全更新的最佳方法之一是构建固件,要求仅接受使用内部(私有)代码签名证书签名的更新文件。
公共代码签名和私有代码签名有什么区别?
代码签名证书由证书发行机构 (CA) 发行,它们是证书发行引擎。大多数组织拥有一个或多个“私有”(内部)CA,并且可以发行各种数字证书,包括代码签名证书。但是,使用这些证书生成的签名只在组织内部环境中受信任。
虽然这对涉及内部应用程序和 IoT 的许多用例来说是完美之选,但是当您计划将代码分发到您所在的环境之外时,使用私有 CA 便行不通了,因为您的 CA 无法被识别。
由公开可信的 CA(例如 Entrust)发行的代码签名证书将生成全球所有主要操作系统和应用程序都能识别和信任的签名。诸如 Entrust 之类的公共 CA 组织(也简称为公共 CA)遵循严格的证书发行标准,必须经过定期审核,并且必须申请以获得所有主要操作系统或应用程序提供商(如微软、苹果、谷歌或 Mozilla)的信任。
当遇到签名代码时,操作系统和应用程序会检查用于签名的证书的发行 CA。如果发行证书的 CA 不在其“信任列表”(也称为根存储区)中,则该签名将不受信任,并且验证将失败。因此,在将软件发布到互联网上时,获取公开可信的代码签名证书至关重要。
OV 代码签名和 EV 代码签名有什么区别?
尽管组织可以随意在其私有代码签名证书中写入他们需要的任何详细信息,但公共证书只能包含在发行证书之前已经过公共 CA 详查的信息。
公共 CA 可以发行两类公开可信的代码签名证书:OV 和 EV。这些类别与公共 CA 在发行证书之前对贵组织执行的验证级别,以及证书(特别是其私有密钥)的存储要求相符。
- OV(机构验证): 这是 CA 执行的组织标准验证方法。 它涉及公司检查(公司是否存在, 信誉是否良好, 位于何处)并对代表该组织申请证书的人员进行核实(他们是否确实是该组织的雇员)。
- EV(扩展验证):顾名思义,这是一个扩展的验证过程,需要进一步验证组织详细信息以及证书申请者。CA 将需要更多信息和更多文件,并在发行证书之前与组织和申请人进行一次或多次通话。EV 代码签名证书必须使用安全存储,这意味着您将需要用安全 USB 令牌或硬件安全模块 (HSM) 来存储证书及其私有秘钥。
Entrust 可以 为所有代码签名指令提供 USB 令牌或 nShield HSM,无论是 OV 证书还是 EV 证书。
如何将时间戳与代码签名证书搭配使用?
在代码签名情景中,加盖时间戳是指将数字时间戳(包括确切的日期和时间)应用于代码签名的过程。
加盖时间戳是代码签名中至关重要但经常被遗忘的步骤。签名确实有失效日期,该日期与用于签名的代码签名证书的失效日期相符。签名失效将导致启动已签名的代码后无法通过验证,从而收到警告消息,甚至导致代码无法运行。
如果需要,私有证书的生命周期可能很长(10 年以上)。这往往足够使用,因为在经过如此漫长的时间后签名代码可能已不再使用。但是,目前公共代码签名证书最长的有效期为三年,而且您的代码很有可能在此期限结束时仍然可用。为代码签名加盖时间戳将使其有效期延长 9-10 年(具体取决于所使用的时间戳证书的有效期)。在当前时间戳即将到期时,您可以重新应用新的时间戳,以进一步延长代码签名的有效期,并避免受到警告/阻止。
如果代码签名证书遭到破坏,需要 撤销代码签名证书,时间戳也十分有帮助。撤销可以追溯到您认为证书已损坏的日期和时间。如果您的所有签名都已加盖时间戳,则只有在撤销日期之前生成的签名才会仍然有效。证书过期或撤销后,任何没有时间戳的代码签名都将失效。
可以使用来自内部 CA 的私有时间戳证书来加盖时间戳。但是,对于需要在外部共享的代码,您必须使用公共时间戳加盖服务,该服务将得到所有主要操作系统和应用程序的识别和信任。大多数公共 CA(包括 Entrust)都提供公共时间戳加盖服务,可通过专用 URL 获得。