第4章:代码签名

地空导弹

为了学习如何签名PowerShell脚本和配置文件,您搜索了Internet,阅读了一些关于代码签名的博客,查看了PowerShell文档,甚至浏览了一些PowerShell书籍。然而,你读的代码签名越多,你就越困惑。最后,在沮丧中,您打开PowerShell控制台并输入以下命令:

Set-ExecutionPolicy不受限制

在输入此命令之前,请记住在第3章“PowerShell:更深入的了解”中学习的执行策略知识。使用不受限制的设置否定了一个重要的安全层,旨在防止恶意代码在系统上运行。代码签名是PowerShell安全的另一个基本组成部分,但许多人认为学习并设定执行政策太复杂不受限制的为了避免使用它。回应Scott Hanselman的博客上关于剧本签名的一篇文章(http://www.hanselman.com/blog.),有人评论说:“处理代码签名证书已经超出了大多数用户的能力,包括普通的开发人员和管理员。”该语句表明了需要解决的实际需求——因此本章专门讨论代码签名。代码签名表面上看起来很复杂,但有了一些明确的说明,这个过程就很容易理解了。脚本编写人员、开发人员和管理员应该熟悉它,将其作为整体安全工作的重要组成部分。

什么是代码签名?

简而言之,代码签名是对脚本、可执行文件、dll等进行数字签名的过程,以建立对代码的信任级别。授予数字签名代码的信任基于两个假设。第一,有签名的代码段确保代码自签名以来没有被更改或损坏。第二,数字签名用于证明代码作者的身份,这有助于确定代码是否可以安全执行。

这两个假设是一种确保代码的完整性和真实性的一种方法。但是,单独的这些假设无法保证签名代码是安全的。对于这两个要被视为有效的假设,您需要数字签名和建立用于识别数字签名发起者的机制的基础架构。

数字签名基于公钥密码学,公钥密码学具有用于加密和解密的算法。这些算法生成一个由私钥和公钥组成的密钥对。私钥是保密的,因此只有所有者才能访问它,但公钥可以通过某种形式的安全交互分发给其他实体。根据交互的类型,一个密钥用于锁定(加密)通信,另一个密钥用于解锁(解密)通信。在数字签名中,私钥用于生成签名,公钥用于验证生成的签名。流程如下:

  1. 使用加密摘要生成被签名的内容(文档、代码等)的单向散列。

  2. 然后用私钥对哈希进行加密,从而产生数字签名。

  3. 接下来,将内容传输给收件人。

  4. 然后,收件人将通过使用发件人的公钥创建内容的另一种单向哈希,并通过使用发件人的公钥来解密哈希。

  5. 最后,接收方比较两个哈希值。如果两个哈希值相同,则数字签名是有效的,内容没有被修改。

单向哈希(也称为消息摘要、指纹或压缩函数)是一种将数据转换为固定长度的二进制序列的加密算法。“单向”一词来源于这样一个事实:很难从结果序列中推导出原始数据。

要将实体(例如组织,人或计算机)与数字签名相关联,使用数字证书。数字证书包括公钥和识别有关密钥对所有者的信息。为确保数字证书的完整性,它也是数字签名的。数字证书可以由其所有者或可信赖的第三方签署证书颁发机构(CA)

将代码与创建并发布代码的实体相关联的行为消除了运行代码的匿名性。此外,将数字签名与代码签名证书相关联非常类似于使用品牌名称来建立信任和可靠性。有了这些信息,PowerShell脚本和配置文件的用户就可以对运行脚本或加载配置文件做出明智的决定。简而言之,这就是为什么代码签名是PowerShell安全框架的一个重要方面。

获取代码签名证书

有两种方法可以获得代码签名证书:生成自签名证书和从有效的公钥基础设施(PKI)使用CA。

生成用于签署PowerShell脚本和配置文件的自签名证书更简单,更快,并且具有不花费任何成本的优势。但是,没有独立的第三方验证了证书的真实性,因此它没有代码签名的相同程度的信任程度。因此,默认情况下,没有其他实体会相信您的证书。要将PowerShell脚本或配置文件分发到其他计算机,必须将您的证书添加为可信root ca和可信发布者。

虽然改变实体信任是可能的,但有两个问题。第一,您的控制范围之外的实体可能不会选择信任您的证书,因为没有独立的方法来验证您是谁。第二,如果与自签名证书相关联的私钥被泄露或无效,则无法在其他实体上管理您的证书的有效性。鉴于这些问题,建议将自签名证书的使用限制在本地机器或用于测试目的。

如果您计划数字地签名脚本和配置文件,以便可以在企业甚至公共领域中使用它们,您应该考虑获得代码签名证书的第二种方法:来自有效PKI的CA。有效的PKI可能意味着一个众所周知的和信任的商业组织,例如http://www.globalsign.net.http://www.thawte.com., 要么http://www.verisign.com或由您的组织拥有和运营的内部PKI。只要您记住一些警告,就可以快速且简单地获取外部PKI的代码证书。

首先,必须从外部PKI的所有者那里购买证书。其次,因为您是从外部实体购买证书,所以您非常信任组织的完整性。出于这些原因,来自商业pki的代码签名证书应该仅限于用于签名用于公开分发的脚本和配置文件的证书。

因此,内部PKI应该用于脚本和配置文件,而不是用于公共消费。请记住,部署和管理内部PKI需要计划、努力和资金(硬件安全模块(hms)、安全顾问等等可能很昂贵)。大多数组织倾向于回避建立PKI所需的努力。相反,他们提供临时的ca,从商业PKI购买证书,或者忽略PKI需求。商业PKI可能不会提供您的组织需要的信任级别,而且不推荐使用临时方法,因为它会降低流氓ca生成的证书的信任程度,这些ca是对其完整性的保证级别较低的ca。没有有效的PKI基础设施会使数字签名文件的内部分发变得困难。最后,忽略PKI需求的组织说明了使用内部PKI的另一个缺点:时间。

如果您的组织中没有PKI,那么获取代码签名证书可能需要很长一段时间。pki不是一夜之间实现的。如果您已经确定了脚本的PKI需求,那么您的组织中可能还有其他的PKI需求。在部署PKI之前,需要识别和考虑这些需求。对于需要满足整个组织需求的基础设施服务来说,仅仅围绕您的需求驱动PKI部署并不是最好的方法。在向您的组织提出PKI需求之后,您可能必须等待服务的提供。但是,在PKI就绪之后,您可以获得代码签名证书,因为您知道基础设施完全支持分发已签名的PowerShell脚本和配置文件。

方法一:自签名证书

这种创建自签名证书的方法基于makecert实用程序,该实用程序是. net Framework软件开发工具包(SDK)的一部分。遵循以下步骤:

  1. 下载最新的Microsoft .NET Framework SDKhttp://msdn2.microsoft.com/en-us/netframework/aa731542.aspx。在本写作时,当前.NET Framework SDK版本为2.0。

  2. 在您想要生成自签名证书的机器上安装SDK。

  3. 定位MAKECERT.您的系统上的实用程序。默认位置是C: Program Files\ Microsoft Visual Studio 8\ SDK\ v2.0\ Bin。

  4. 打开CMD命令提示符并将工作目录更改为MAKECERT实用程序的位置使用光盘命令。

  5. 使用以下命令创建自签名证书:

    makecert -r -pe-n-n“cn = certificateCommonname”-b 01/01/2000 -e 01/01/2099 -eku 1.3.6.1.5.5.7.3.3 -ss我的

    你应该看到类似如下的输出:

    C:\ Program Files \ Microsoft Visual Studio 8 \ SDK \ v2.0 \ bin> makecert -r -pe-n“cn =龟代码签名”-b 01/01/2000 -e 01/01/2099 -eku 1.3.6.1.5.5.7.3.3 -ss我成功
  6. 最后,使用以下powershell命令验证已安装证书:

    ps c:\> get-chatiTem cert:\ currentuser \ my -codesign目录:Microsoft.powershell.security \证书:: currumuser \我的Thumb打印主题---------- -------944E910757A862B53DE3113249E12BCA9C7DD0DE CN=海龟代码签名ps c:\>

方法二:CA签名证书

此方法基于从Microsoft Windows CA获取代码签名证书。这些步骤假设您的组织中已经部署了PKI。如果没有,则不建议安装Windows证书服务来满足您当前的需要。按照以下步骤请求代码签名证书:

  1. 请求PKI管理员为PowerShell脚本和配置文件创建并启用代码签名证书模板。

  2. 使用Internet Explorer访问证书服务Web注册站点https:// caservername / certsrv(将CAServerName替换为服务器的名称)。

  3. 点击请求证书关联。

  4. 在“请求证书”页上,单击高级证书申请关联。

  5. 在“高级证书请求”页面,单击创建并向此CA提交请求关联。

  6. 在“证书模板”一节中,单击,选择PKI管理员创建的代码签名证书。

  7. 根据组织的证书策略,输入其余的标识信息和证书请求选项。您可以使用图4.1作为指导。

    图4.1

    图4.1

    请求签名证书的示例

  8. 点击提交按钮。

  9. 在打开的潜在脚本违规对话框中(参见图4.2),点击是的继续。

    图4.2

    图4.2

    潜在的脚本冲突消息框

  10. 接下来,如果适用,请根据组织的证书策略设置私钥安全级别(参见图4.3),然后单击好吧

    图4.3

    图4.3

    创建一个新的RSA签名密钥对话框

  11. 如果您的组织的证书策略需要证书经理批准,请咨询您的证书经理批准您刚提交的证书请求。如果不需要批准,请转到步骤16。

  12. 证书请求被批准后,使用Internet Explorer访问证书服务Web注册站点https:// caservername / certsrv(将CAServerName替换为服务器的名称)。

  13. 点击查看挂起的证书请求的状态关联。

  14. 在下一页中,单击适当的证书请求链接。

  15. 在证书颁发的页面上,单击安装此证书关联。

  16. 在打开的潜在脚本违规对话框中(参见图4.4),点击是的继续。

    图4.4

    图4.4

    潜在的脚本冲突消息框

  17. 最后,证书服务Web注册站点状态指出证书已成功安装。使用以下powershell命令验证证书安装状态:

    ps c:\> get-chatiTem cert:\ currentuser \ my -codesign目录:Microsoft.powershell.security \证书:: currumuser \我的Thumb打印主题---------- -------5 cbce258711676061836bc45c1b4aca6f6c7d09e E = Richard.Stallman@goodcode.com, C…ps c:\>
有关的:
12 4.
第1页,共2页
IT薪水调查:结果是