在努力了解如何注册PowerShell脚本和配置文件,你在网上搜索,阅读代码签名,回顾了PowerShell的文档多个博客,甚至通过一些PowerShell的图书浏览。然而,你阅读有关代码签名的越多,弄得你。最后,在挫折中,你打开PowerShell控制台,然后输入以下命令:
set-executionpolicy无限制的
输入此命令之前,记得你在第3章,了解执行的政策是什么“的PowerShell:一个更深入了解”使用不受限制的设置会使设计用来防止恶意代码在系统上运行的重要安全层失效。代码签名是PowerShell安全的另一个重要组件,但许多人认为它太复杂,无法学习和设置执行策略不受限制的以避免使用它。为了应对在斯科特Hanselman的博客上脚本签名的条目(http://www.hanselman.com/blog),一个人评论说,“处理代码签名证书是在大部分用户,包括普通开发人员和管理员的头道。”该声明指出,应解决,因此这章专门用于代码签名的实际需要。代码签名看似复杂的表面上,但也有一些明确的指示,这个过程是很容易理解。脚本编写者,开发人员和管理员应该熟悉它作为其整体安全努力的重要组成部分。
什么是代码签名?
简而言之,代码签名是数字签名的脚本,可执行文件,DLL,等等,以建立信任为代码级的过程。授予数字签名的代码的信任是基于两个假设。一,一个有符号的一段代码确保了代码没有被自被签名改变或损坏。二,数字签名来证明代码的作者,它可以帮助你确定代码是否执行安全的身份。
这两个假设是确保代码完整性和真实性的一种方法。但是,仅凭这些假设并不能保证签名代码可以安全运行。要认为这两个假设是有效的,您需要数字签名和建立一种机制来识别数字签名的发起者的基础设施。
数字签名是基于公共密钥加密,它具有用于加密和解密算法。这些算法生成一个密钥对由私钥和公钥。私钥是保密的,这样只有所有者可以访问它,但公钥可以通过某种形式的安全交互的分配给其他实体。取决于交互的类型,一个密钥用于锁(加密)的通信中,并且另一个密钥用于解锁(解密)的通信。在数字签名,私钥用于生成签名和公共密钥是用来验证所生成的签名。该过程如下:
的含量的单向散列(文件,代码,等等)被签名是通过使用加密摘要生成。
哈希然后用私钥加密,从而在数字签名。
接下来,内容发送给收件人。
然后,接收方创建内容的另一个单向散列,并使用发送方的公钥对该散列进行解密。
最后,收件人两个散列进行比较。如果两个散列相同,数字签名是有效的,内容没有被修改。
单向散列(也称为消息摘要,指纹,或压缩函数)是一个加密算法,将数据转换为固定长度的二进制序列。术语单向来自于一个事实,这是很难从得到的序列中获得的原始数据。
要将一个实体(例如一个组织、一个人或一台计算机)与数字签名关联,需要使用数字证书。数字证书由公钥和关于密钥对所有者的标识信息组成。为了确保数字证书的完整性,还对其进行了数字签名。数字证书可以由其所有者或可信赖的第三方签署证书颁发机构(CA)。
代码与创建和发布它的实体关联的动作消除运行代码的匿名性。此外,数字签名与代码签名证书关联很像使用的品牌名称来建立信任和可靠性。有了这些信息,PowerShell脚本和配置文件的用户可以对运行脚本或加载配置文件明智的决定。这,简而言之,就是代码签名是PowerShell的安全框架的一个重要方面。
获得一个代码签名证书
有两种方法获取的代码签名证书:生成自签名证书并使用CA从有效的公共密钥基础设施(PKI)。
为您的PowerShell脚本和配置文件生成一个自签名证书更简单、更快,而且没有任何成本。但是,没有独立的第三方验证证书的真实性,因此它不具有代码签名所期望的相同级别的信任。因此,在默认情况下,没有其他实体会信任您的证书。要将您的PowerShell脚本或配置文件分发到其他机器,您的证书必须作为受信任的根CA和受信任的发布服务器添加。
虽然改变的实体信任是可能的东西,有两个问题。一,你的控制范围之外的实体可能不会选择信任你的证书,因为没有用于验证你是谁,没有独立的方法。二,如果你的自签名证书相关的私钥被泄露或无效,有没有办法来管理其他实体证书的有效性。鉴于这些问题,限制使用自签名证书到本地机器或用于测试目的的建议。
如果您计划对脚本和配置文件进行数字签名,以便它们可以在企业甚至公共领域中使用,那么应该考虑获得代码签名证书的第二种方法:从有效的PKI获得CA。一个有效的PKI可以意味着一个知名的、受信任的商业组织,例如http://www.globalsign.net,http://www.thawte.com,或http://www.verisign.com,或由你的机构拥有和运作的内部PKI。从外部PKI获取代码签名证书既快捷又容易,只要您记住一些注意事项。
首先,必须有一个证书从外部PKI的所有者购买。其次,因为你是从外部实体购买的证书,你将有很多的信任在组织的完整性。出于这些原因,从商业PKI的代码签名证书应仅限于用于登录脚本和配置文件公开发行的证书。
因此,内部PKI应该用于脚本和配置文件并不意味着大众消费。请记住,部署和管理的内部PKI需要规划,精力和金钱(硬件安全模块(HSM),安全顾问,等等可能很昂贵)。大多数组织倾向于回避远离所需的努力来建立一个PKI。取而代之的是,他们带来了CA的专案,从商业的PKI证书购买,或忽略PKI的要求。商业PKI可能无法提供的信任级别您的组织的需求,因此不推荐特设的方法,因为它减少了流氓的CA,这是有保证的围绕其完整性低级别的CA生成的证书的信任。由于没有有效的PKI基础可以使数字签名的文件内部分配困难。最后,那些无视PKI要求的组织说明使用内部PKI的另一个缺点:时间。
如果在你的组织没有PKI,获得代码签名证书可能需要较长的时间周期。公钥基础设施不兑现过夜。如果你已经确定你的脚本PKI的要求,有可能是您的组织中的其他PKI的要求。这些要求需要被识别和PKI部署之前考虑。试图独自驾车在你需要PKI部署是不是需要满足整个组织的需求基础设施服务的最佳方法。你提出的PKI要求您的组织后,您可能需要等待要提供的服务。但是,在PKI是在地方,你可以获取的代码签名证书明知基础设施完全支持您签署的PowerShell脚本和配置文件的分布。
方法一:自签名证书
创建一个自签名证书的这种方法是基于使用makecert工具,它是.NET Framework软件开发工具包(SDK)的一部分。按着这些次序:
下载从最新的Microsoft .NET Framework SDKhttp://msdn2.microsoft.com/en-us/netframework/aa731542.aspx。在撰写本文时,. net Framework SDK的当前版本是2.0。
要生成自签名证书的计算机上安装SDK。
找到makecert您的系统工具。默认位置为C:\ Program Files文件\微软的Visual Studio 8 \ SDK \ 2.0 \ BIN。
打开cmd命令提示符,并将工作目录更改为makecert实用程序的位置Cd命令。
创建使用下面的命令自签署证书:
makecert -r -pe -n "CN=CertificateCommonName" -b 01/01/2000 -e 01/01/2099 -eku 1.3.6.1.5.5.7.3.3 -ss My
你应该看到类似以下的输出:
C:\程序文件\ 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 My成功
最后,使用下面的PowerShell命令来验证证书是否已经安装:
PS C:\ > get-childitem cert:\ CurrentUser\ My -codesign目录:Microsoft.PowerShell。安全\证书:CurrentUser \我拇指指纹主题---------- -------944E910757A862B53DE3113249E12BCA9C7DD0DE CN =龟代码签名p C: \ >
方法二:CA签署的证书
这种方法是基于从微软的Windows CA获得的代码签名证书这些步骤假定一个PKI已在您的组织部署。如果没有,建议不要安装Windows证书服务,以满足您的燃眉之急。请按照以下步骤请求的代码签名证书:
请求您的PKI管理员创建并启用代码签名证书模板为您的PowerShell脚本和配置文件。
使用Internet Explorer访问证书服务Web注册站点https://CAServerName/certsrv(与你的服务器的名称替换CAServerName)。
点击请求一个证书链接。
在申请一个证书页上,单击高级证书请求链接。
在高级证书申请页面,点击创建并向此CA提交请求链接。
在证书模板部分,单击以选中您的PKI管理员创建的代码签名证书。
根据组织的证书策略输入的识别信息和证书请求的其余选项。您可以使用图4.1作为一个指导原则。
图4.1请求的代码签名证书的示例
点击提交按钮。
在打开的潜在脚本冲突对话框中(请参阅图4.2),单击是接着说。
图4.2潜在的脚本冲突消息框
接下来,如果适用,根据组织的证书策略设置私钥安全级别(请参阅图4.3),然后单击好。
图4.3创建一个新的RSA签名密钥对话框
如果组织的证书策略需要证书管理器的批准,那么请证书管理器批准您刚刚提交的证书请求。如果不需要批准,请转到步骤16。
证书申请被批准后,使用Internet Explorer在访问证书服务Web注册网站https://CAServerName/certsrv(与你的服务器的名称替换CAServerName)。
点击查看挂起的证书申请的状态链接。
在接下来的页面中,单击相应的证书请求链接。
在颁发证书页面上,单击安装此证书链接。
在打开的潜在脚本冲突对话框中(请参阅图4.4),单击是接着说。
图4.4潜在的脚本冲突消息框
最后,证书服务Web注册站点声明证书已成功安装。使用下面的PowerShell命令来验证证书安装状态:
PS C:\ > get-childitem cert:\ CurrentUser\ My -codesign目录:Microsoft.PowerShell。安全\证书:CurrentUser \我拇指指纹主题---------- -------5CBCE258711676061836BC45C1B4ACA6F6C7D09E E=Richard.Stallman@goodcode.com,C ...p C: \ >