代码签名的最佳实践

代码签名和数字证书的使用是现代技术领域中信任概念的基础。

特别是代码签名,它被用来验证一个程序的开发者的身份和它的来源。像许多X.509证书一样,代码签名证书有标准和扩展验证(EV)两种形式。

通过对程序进行代码签名,开发者只是附加了他们的数字证书。代码签名证书使用公钥加密技术,这与其他类型的数字证书使用的技术相同。这种方法可以在许多类型的平台的操作系统中使用,从移动到桌面。你可以发现它们用于微软的Windows,苹果的Mac OS X,Linux,甚至是iOS和Android。它们甚至可以在物联网设备中找到。将这些证书嵌入到程序的源代码中是任何软件开发中安全和信任的一个重要方面。

如何实施代码签名

要实现这一点,需要一个独特的私钥--一个经过适当散列的私钥,这样加密/解密握手就不容易被击败。在公钥密码学中,公钥和私钥的组合是这个过程的核心,允许在没有访问的情况下进行通信。

在使用公钥基础设施(PKI)生成新的密钥对后,公钥被发送到一个证书颁发机构(CA),该机构验证开发者的身份并将自己的公钥贴在代码签名证书上。该证书和代码被送回给申请该证书的原始开发者。

现在,开发者已经拥有了代码签名证书和加密密钥对,他们必须在加密和签名之前对软件的代码进行散列。散列是一个程序,其中一个散列函数被用来将代码转换成一个任意的固定值。散列的输出,称为摘要,然后使用私钥进行加密。接下来,开发人员将这个摘要与代码签名证书和散列函数结合起来,创建一个叫做签名块的东西,它基本上是将上述所有项目结合成一段代码,可以方便地插入到软件中。

保护的重要性

代码签名的最大问题是保护与证书相关的私人代码签名密钥。如果一个密钥被破坏,证书就会失去信任和价值,危及你所签署的软件。

许多组织使用安全库和硬件安全模块(HSM)来保护自己,以提高其私钥的安全程度。其他组织则使用证书管理器,使所有代码签名证书的生命周期管理自动化和安全化。其中一个例子是Sectigo证书管理器。使用证书管理器对促进私钥和其他加密资产的完整性有很大帮助。

代码签名能防止什么?

简单地说,代码签名可以防止恶意软件和其他恶意代码在良性文件或Windows更新等事件的伪装下被引入最终用户的系统。它通过允许用户验证正在下载的文件确实来自发起人而不是恶意行为者来实现这一目的。这加强了系统内的信任概念,使开发人员能够向下载软件的最终用户保证来源是可以信任的,是安全的。

EV代码签名证书提供了额外的安全保证。它们要求密钥存储在符合FIPS140-2或以上标准的高保障硬件中。有一些USB令牌可以满足这一要求,并通过PIN码增加另一层保护。另外,你也可以把钥匙储存在你的组织的硬件安全模块(HSM)中。

佐治亚理工学院网络取证创新实验室的研究表明,签发和使用扩展验证(EV)TLS/SSL证书可使99.99%的可能性免受网络钓鱼攻击和滥用。

扫描二维码关注公众号,回复: 15686340 查看本文章

保护密钥的简单方法

有许多方法可以保护代码签名密钥,包括:

分离你的测试和发布签名密钥

测试环境是混乱和繁忙的,但是,由于它们是内部的,测试签名钥匙通常不需要像你的发布签名钥匙那样被深度保护。事实上,许多组织在测试环境中使用自签名的证书或不被信任的证书机构,就是这个原因。分离测试和发布签名钥匙可以防止开发人员在开发阶段使用一个代码签名钥匙,然后用它发布软件。然而,使用单独的测试和发布密钥需要将任何测试安装包清楚地标示出来,以避免它被推送给客户。

认真对待吊销工作

撤销证书是跟踪代码签名钥匙的最重要部分之一。如果在代码签署过程中发现了漏洞,或者私钥被暴露,则需要撤销与之相关的密钥和证书,并重新颁发,以适当确保系统的信任。

时间是你的朋友

代码签名证书就像其他数字证书一样会过期。这并不意味着用该证书签署的信息是无效的,但它确实意味着当系统检查代码签名进行比较时,它将识别出它已经过期,并给终端用户一个错误信息。只要时间戳过期,就会出现这些警报,可以绕过这些警报,但它们会损害客户的声誉和对品牌的信任。这些过期的日期强制执行持续更新证书的纪律,确保发布的代码中的证书使用最新的加密方法进行散列,并且没有通过密码学漏洞而被破坏。

代码签名的最佳实践

代码签名并不能使软件完全不受误用、篡改或恶意的影响。在处理私钥的过程中,存在着很大的人为因素。代码签署应该是安全和开发团队之间的合作责任,以实现共同的目标,并在不中断的情况下保护密钥。

遵循一些行业标准的最佳实践可以促进这种方法尽可能的有效。以下是Sectigo推荐大家采用的代码签署的十大最佳实践。

1. 用代码签名证书保护您的代码

最重要的建议是尽可能地使用代码签名证书。这些证书向最终用户验证代码的来源和真实性,并增加客户对其个人安全的信心。通过正确地签署您的代码,您可以为您的应用程序或程序注入由受信任的公共证书机构管理的信任。为了增加安全性,您可以使用EV代码签名证书。

2. 避免养成坏习惯

正确使用系统内的证书是至关重要的,但如果不强制执行行为习惯以正确维护和使用它们,那么你所采用的任何其他做法都将是徒劳的。建立一种理解数字证书的使用和重要性的文化,只能从整体上改善你的组织。

3. 尽量减少对私钥的访问

任何优秀的IT专家都会尽可能地采取访问控制措施;这包括限制对私钥和基础根证书的访问。你应该只允许极少数人访问你的组织的私钥,而且这些人应该有明确的理由需要访问。在你的组织内建立一个基于角色的访问(rbac)政策将有助于限制可能的暴露。

4. 用加密硬件保护私钥

使用加密硬件可以让你用最新的加密算法来保护你的私钥。这种类型的硬件至少应该是经过FIPS 140二级认证的产品。像硬件安全模块(HSM)这样的产品将保护你的私钥不落入恶意者的手中。

5. 给代码加时间戳

对你的代码进行时间标记,可以让你了解代码的编写时间与它所使用的证书相比。这使得一旦证书过期或被撤销,它可以被重新确认为合法。这是一个需要了解的重要关系,因为随着技术和加密威胁的发展,目前的保护措施可能会被削弱或彻底破坏。

6. 测试签署和发布签署的区别

如上所述,区分和理解测试签署和释放签署钥匙/证书之间的区别是很重要的。测试签名证书和钥匙所需的安全性较低,可以由一个私有的内部测试CA自行签名。它们还必须与发布的签名产品的根证书相连接,最佳做法包括为发布和预发布签名设置完全不同的代码签名基础设施。这将使你能够为你的测试环境和生产代码设置适当的访问控制。

7. 验证代码

代码签名并不特别确定代码是安全的,它只是说明谁写的。因此,在向公众真诚地发布代码之前,仍然需要对其进行充分的认证。这样做可以确保你不会意外地传播不正确的或恶意的代码,从而伤害客户和损害你的声誉。所有认证的代码签署活动都应该被记录下来,以备日后需要进行某种类型的调查或事件响应。

8. 病毒扫描代码

除了验证你的代码没有被修改之外,扫描它的病毒或其他恶意代码也很重要。恶意代码常常会被那些重复使用或从外部项目引入现有代码的开发者无意中插入。在代码发布之前,捕捉和改变错误要容易得多。

9. 限制重复使用钥匙

多次重复使用私钥进行代码签名会给你带来更大的风险。如果一把钥匙被破坏了,所有用该钥匙标记的该日期的代码签署将无效,需要用新的代码签署证书来更新。保持循环使用不同的钥匙和证书的习惯,将使你能够分散风险,并在重新颁发证书时降低努力和影响。

10. 吊销被破坏的证书

吊销是确保代码安全的最重要任务之一。证书颁发机构比任何人都更重视吊销,这就是为什么我们推荐最佳做法,如给你的代码加时间戳。

然而,开发组织有责任向你的证书颁发机构报告任何受损的代码、密钥或证书,以便他们采取适当的行动。如果出现任何可能的问题,CA将要求吊销代码签名证书。如果你对代码进行了时间标记,那么只有吊销日期在事件发生之后的代码才会受到影响。

猜你喜欢

转载自blog.csdn.net/lavin1614/article/details/131420012