浅谈代码签名证书

Claire| 2018-02-27 来源: SSL 评论数( 0 )

本文介绍代码签名证书和它们的诸多好处。

现在,几乎所有东西都是一台电脑。我们所使用的主要的交通方式?汽车,公交车,火车……它们都是电脑。我们用来交流的工具?手机和笔记本电脑……这些绝对是电脑。甚至现在我们的家、电冰箱和电视机都是一电脑。

所有这些电脑的边框、干净的图形用户界面(GUI)和人机形状背后是一段段代码。代码是所有电脑的基础,控制着它做什么和如何做。而对于现代的计算机来说,代码不再是静态的。它不断被更新,有时,你甚至都不知道它更新了。

控制着你的手机、汽车或电炉的代码可能随时会更新,而你根本不知道这一点,你可能认为这十分奇怪。到底是谁编写了那些代码?你知道吗?你的朋友知道吗?

你的计算机知道吗?

这是一个十分关键的问题。我们依赖的设备运行代码时……它们知道那些代码来自哪里吗?它们知道它是正确的代码吗?它是安全的代码吗?

代码签名证书是一个解决方案,能知道你是否拥有正确的代码。通过使用一些不可思议的数学运算,代码签名能够在代码中附加一个标识,从而让我们知道是谁授权了它,并保证它没有被篡改。我们将在本文介绍代码签名证书,并简单地说明一下它们的工作方式,以及为什么你应当开始使用代码签名证书,以及如何使用它。

存在的问题

你是一个在全网发布软件的软件开发商,你的用户遍布全世界,并小有成就。你是否曾想知道你的用户获取的代码就是你发布的?

如果你发布的是未经签名的代码,这一点可能很难知道。那些“经下载器驱动”的网站中的一个可能会获取你的软件的一个副本,然后与一些广告软件捆绑在一起,开始发布它。可能有人将你的软件免费上传一个盗版网站,但是在这个过程中放置了一些恶意软件。如果你的软件十分受欢迎,恶意软件发布者就很有可能制作一个直接的鱼饵和开关,并将恶意软件隐藏在你的文件名下。

你的用户可能想要知道同样的事情。这个代码合法吗?我应当信任它吗?

有一些真正的风险和攻击媒介。从历史上来说,把危险代码伪装成用户想要运行的一些安全的东西一直就是恶意软件的主要发布方式。成千上万的人都在寻找 Photoshop、微软办公软件和阅读软件,恶意软件发布者知道这一点。就我个人而言,我为在网上运行了一些不明来源的软件而深感愧疚;每个人都至少认识这样一个人,他在运行了一些“免费”软件后自身受到了感染。

甚至一些发布知名软件的来源也一直是恶意应用程序的来源。去年,How To Geek测试了十个在CNet’s Download.com网站上下载得最多的程序,最后发现,在这些程序上出现了大量不想要和令人讨厌的东西。

Sourceforge.com一度是许多开源应用程序的官方存储库,但是现在它开始在没有经过原著者同意的情况下,在发布合法应用程序的同时,也发布恶意和多余软件了。

因此,代码不仅有被模仿的风险,而且还有被篡改和修改的风险。

代码所宣称的和它本来的面目之间存在差距,我们可以如何缩小这个差距?

通过将代码与一个身份联系在一起,代码签名证书试图解决这个问题。当你在运行经过签名的代码时,你将能够很清楚地看到是谁授权了它。那可能是一个十分重要的信息。因为如果你信任那个发布者,你在运行程序时就会感到十分自信。

代码签名是做什么的?

代码签名证书不会对任何代码进行签名——它们不会对一个PHP文件或IF声明进行签名。代买签名证书是对可执行文件和脚本进行签名。你知道这些文件:.exe,.app,.msi,.cab,.dll,.jar(还有其他许多格式的文件)。通过对这些文件进行签名,它们能够提供加密保护,防止篡改的发生,并且还能识别软件作者的身份。

签名到底意味着什么?如果你熟悉公有密钥(SSL证书也会使用它),那么你将能够理解代码签名是如何提供可靠的身份的。如果你不熟悉,你可以快速浏览一下以下内容:

1. 所有代码签名证书都有一个与之相关的独特的私有密钥,只有代码签名证书的所有者才持有。当对代码进行签名时,那个独特的私有密钥就会用来在可执行的脚本上附加一个数字签名。

2. 对于其为之进行签名的可执行文档,私有密钥将为它产生一个独特的签名。这是因为密钥为那个可执行文档签署了一个“散列”。散列是一个用来从任何一个给定字符串数据中获取独特数值的数学工具,在这个例子中,是一个文件。这就是防止其他人为一个可执行文档进行有效签名的东西,并把它应用于他们自己的合法软件。当一个计算机检查签名时,它就能分辨出签名不是针对同一个代码的,因为散列值不一样。注意:签名和加密是不同的概念。两者都十分重要,并且广泛用于网络安全,通常将它们合在一起使用。但是,加密是另一个加密流程,涉及到修改数据,因此除了目标接收者,其他人是不能阅读的。请注意代码签名证书不会加密你的文件/数据。

3. 当终端用户运行可执行文档时,他们所使用的平台(Windows, iOS, Java等等)就会审查签名并将审查结果展示给用户。这使得用户能够知道软件的来源,并允许它们做出明智决策是否运行它。

记住,代码签名证书能够提供身份。在一天结束的时候,当你运行一个可执行文档或脚本时,你必须做出决策,是否信任那个身份/作者(一个人或一个组织)。代码签名不会自动保证程序正常工作,或者它不是恶意的(一些人可能会选择对恶意软件进行签名,以期望欺骗他人,让他们认为一个知名作者就自动意味着安全)。只有当软件是签发者所发布的时,代码签名才能保证是它本来的样子。

代码签名是如何允许安全发布的?

当你需要正式发布一个物理文档时,你会对它进行签名。你的签名对你来说是唯一的,它向外宣称你已经背书、同意或授权了一个物理工作。在数字王国里,我们拥有代码签名;使用数字签名,如一个传统的物理签名,便能够断定身份信息。

数字签名是通过使用密码来强制执行的。这就意味着阅读签名的计算机能够证明它们是否是合法的,或者它们是否是伪造的。计算机不会阅读签名并说:“这个代码表示它是Craig所签发的,因此它肯定是真的。”计算机的工作是检查这个签名,从而证明Craig签发了它。

在这个过程中,代码签名证书也确保真实性和完整性。让我们进一步讨论一下这两个方面吧,因为它们都是及其重要的:

真实性:这告诉用户(和计算机)软件来自哪里。这说的是“谁”。真实性把你的身份与你用之对你的软件进行签名的公有/私有密钥绑在了一起。因为没有人拥有你的密钥,没有一个人能够对一个自称来自于你的软件进行签名。

完整性:表明代码未被篡改。数字签名不仅告诉设备谁签发了软件,而且还告诉它们签发了什么。这允许计算机掌握代码自签发以来,是否有被更改过。这能够防止依赖修改合法的可执行文件的攻击,也能警告用户将在下载过程中出现的恶意文件进行归档。

代码签名能够防止大量攻击,而这些攻击依赖于未经授权的/被恶意修改的代码、欺骗性的软件和为特定目的构建的软件。

还有第二种类型的代码签名证书,称为“EV代码签名”,它用于最高敏感程度的应用程序。这些证书在密钥存储和签名方面有着特殊的要求,并且通常是存储在一个安全的闪存盘上的。尽管大多数人可能不需要使用EV代码签名证书,但是我想要简单提及一下它。

时间戳

尽管时间戳是一个可选选项,但是我想要快速阐释一下它,因为它是代码签名十分重要的一部分。

代码签名证书有一定的有效期(就像SSL证书)。在这个日期范围内,代码签名证书被认为“有效。”代码签名证书的有效期最高为3年,通常按年出售。当你购买一个代码签名证书时,你可以决定你想要购买多少年。一旦一个特定证书的有效期结束,证书就会过期。在那个时间点,它就不再有效。

一旦一个证书过期,就不能再用来对其他新的可执行文档进行签名。在那一天,现有签名也将变得无效。除非你加上时间戳。

时间戳是附加给签名的一个额外的信息,它告诉设备你在什么时候对代码进行了签名。如同其他签名,它也通过加密确保安全。这允许设备在当签名发生在有效期内时,进行比较。如果签名是在证书有效期内完成的,那么万事大吉。这个签名将永久有效(尽管有时加密标准将发生变化,并且签名最终也将变得过时。然而,这种情况不会经常发生)。

这一点之所以如此重要是因为人们使用可执行文件的方式不同。如果你开发了一款软件并开始发布它,你可能会持续提供那个同样的文件多年。可执行文件不像web网页和HTTPS连接,仅持续一段时间。因此,同样的软件在今天有效,在明天就无效了,这是不合理的。时间戳对维护可用性是十分重要的。它也能够为你节省金钱,因为你不需要持续购买代码签名证书,除非你需要对一些新的东西进行签名。

大多数主要的CA都提供时间戳,如赛门铁克Comodo和DigiCert。但是确保你在购买证书前检查它是否支持这一功能。

一个多平台解决方案

代码签名证书几乎可以在任何一个平台上使用。如果你正在Windows、OS X、iOS、Android、Java、Linux、Adobe AIR,或者其他主要平台上进行研发,你可以使用代码签名证书,并且也鼓励你使用它。

越来越多的平台正强制要求进行签名。为了在iOS,Android或OS X的官方app商店上发布软件,你必须对你的代码进行签名。软件的功能层级越低,签名也就越重要,也就更有可能要求强制签名。比如,所有Window驱动程序都必须进行签名。甚至微软Office宏和Firefox扩展都要求签名。

即使当签名不是强制性的时候,我们也总是鼓励进行这一步骤。因为它能够提供一个更好的用户体验。没有人想要看到出现警告信息,说发行商“未知”或“不可靠”。安全好处是真实存在的。考虑到运行可执行代码的风险,你不会想要遭到任何攻击,即使你不认为你可能成为一个攻击媒介。

申请流程

采用和使用代码签名证书可以分为以下5大步骤:

1. 购买证书——选择一家CA机构,并确定时间长度(证书的有效年限)。通常,系统会让你选择一个你将要在其上进行签名的平台,但是大多数情况下,如果你花费一点时间,转换一下文件,你的代码签名证书就可以在多个平台上使用。

2. 确定身份——到目前为止,我们已经谈了很多关于身份的问题,但是并没有阐释代码签名证书是如何知道你是谁的。在验证过程中,CA机构会在颁发证书前确认你所声称的身份。如果你是作为一个个人或一家公司来申请证书,这一流程会有所不同。每一个CA机构确认身份的方式都有所不同,但是对他们来说,大部分是进行一系列依赖政府官方文档的标准程序。如果你是作为一个个人来进行申请,这意味着需要提供由公证人证实的政府ID。对于一家公司来说,你需要提供公司合法性的证明。然后CA将通过其他渠道(比如,在你的州/国家直接搜索你的企业记录)确认这些文档,从而确保它们是合法的。尽管验证流程依赖于你的准确信息,但是这大概需要5天的时间。我们曾经遇到过一些客户,因为错误的信息或通讯延迟,他们完成这一流程所花费的时间变得更长。

3. 安装代码签名证书——根据你将使用的平台的不同,以下两步可能是完全分开的,或合成一步。在一些平台上,签名工具能够同时安装和签名事宜。在其他一些案例中,你需要在开始使用证书前,很明确地将代码签名证书导入到一个“可靠的商店”中。

4. 对应用程序进行签名——这就是奇迹产生的地方!对你的应用程序进行签名就是添加数字签名。每个平台处理这个问题的方法都略有不同。你可以通过检查你的研发环境的文档或平台来查看你是如何进行签名的。对于许多平台来说,可以使用一些专门的工具来达到这一目的。

5. 发布应用程序——你的软件已经准备好发送给你的用户了。当他们运行软件时,系统会向他们展示你的身份,从而使他们相信你提供给他们的软件是合法的。你可以通过互联网、CD、闪存盘或其他你所选择的方式来发布你的软件。

结论

代码签名证书能够对可执行文件(从.exe到.app的一切文件)进行签名。购买和申请证书后,你应该会等大约一周的时间,之后,验证流程通过,你就会收到你的证书。

如果你将开发或发布软件,那么你应当对你的代码进行签名。现在,代码签名在一半主要的平台上都是强制性的,并且受到大力推崇。对你的代码进行签名将确保用户体验最大化,并防止出现这些讨厌的“不可信的发行商”警告。更重要的是,数字签名的加密保护将防止对你的代码进行篡改。

为你的代码加上时间戳是十分重要的。在大多数开发环境中,你必须单独设置它,因此你应当另外花费些时间来做这一件事。这将确保你的签名代码长期可用。

最后,记住一点,当你开发和发布软件时,你就进入到了一个包含用户、设备、软件和不法分子的大型生态系统。该生态系统中最薄弱的地方总是会遭到攻击,因此对安全的期望和要求将不断提高。因此,赶快做好准备,开始对你的代码进行签名吧。你的用户将衷心地感激你,并且当你挫败了一个攻击时,你将会感到无比轻松。

 

聚焦云计算,扫描二维码,关注HostUCan云计算

有好的文章希望站长之间帮助分享推广,猛戳这里我要投稿

您需要登录后才可以评论登录|注冊

暂无评论