当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 关于签约

作者:精品下载站 日期:2024-12-14 02:18:25 浏览:15 分类:玩电脑

关于签约


简短描述

解释如何对脚本进行签名,以便它们符合 PowerShell 执行策略。

详细描述

此信息仅适用于在 Windows 上运行的 PowerShell。

受限执行策略不允许任何脚本运行。 AllSignedRemoteSigned 执行策略可防止 PowerShell 运行没有数字签名的脚本。

本主题说明如何运行未签名的选定脚本(即使执行策略为远程签名),以及如何对脚本进行签名以供您自己使用。

有关 PowerShell 执行策略的更多信息,请参阅 about_Execution_Policies。

允许运行签名的脚本

当您第一次在计算机上启动 PowerShell 时,默认的受限执行策略可能会生效。

受限策略不允许任何脚本运行。

要查找计算机上的有效执行策略,请键入:

Get-ExecutionPolicy

要运行您在本地计算机上编写的未签名脚本和其他用户签名的脚本,请使用以管理员身份运行选项启动 PowerShell,然后使用以下命令将计算机上的执行策略更改为 >远程签名

Set-ExecutionPolicy RemoteSigned

有关详细信息,请参阅 Set-ExecutionPolicy cmdlet 的帮助主题。

使用 RemoteSigned 执行策略运行未签名的脚本

如果您的 PowerShell 执行策略是RemoteSigned,则 PowerShell 将不会运行从 Internet 下载的未签名脚本,包括您通过电子邮件和即时消息程序收到的未签名脚本。

如果您尝试运行下载的脚本,PowerShell 将显示以下错误消息:

The file <file-name> cannot be loaded. The file <file-name> is not
digitally signed. The script will not execute on the system. Please see
"Get-Help about_Signing" for more details.

在运行脚本之前,请检查代码以确保您信任它。脚本与任何可执行程序具有相同的效果。

要运行未签名的脚本,请使用 Unblock-File cmdlet 或使用以下过程。

  1. 将脚本文件保存在您的计算机上。
  2. 单击开始,单击我的电脑,然后找到保存的脚本文件。
  3. 右键单击脚本文件,然后单击属性
  4. 点击取消阻止

如果从 Internet 下载的脚本经过数字签名,但您尚未选择信任其发布者,PowerShell 将显示以下消息:

Do you want to run software from this untrusted publisher?
The file <file-name> is published by CN=<publisher-name>. This
publisher is not trusted on your system. Only run scripts
from trusted publishers.

[V] Never run  [D] Do not run  [R] Run once  [A] Always run
[?] Help (default is "D"):

如果您信任发布者,请选择运行一次始终运行。如果您不信任发布商,请选择从不运行不运行。如果您选择从不运行始终运行,PowerShell 将不会再次提示您选择此发布者。

签署脚本的方法

您可以对您编写的脚本以及从其他来源获取的脚本进行签名。在签署任何脚本之前,请检查每个命令以验证其运行是否安全。

有关代码签名的最佳实践,请参阅代码签名最佳实践。

有关如何对脚本文件进行签名的详细信息,请参阅Set-AuthenticodeSignature。

PowerShell 3.0 的 PKI 模块中引入的 New-SelfSignedCertificate cmdlet 可创建适合测试的自签名证书。有关详细信息,请参阅 New-SelfSignedCertificate cmdlet 的帮助主题。

要向脚本添加数字签名,您必须使用代码签名证书对其进行签名。有两种类型的证书适合签署脚本文件:

  • 由证书颁发机构创建的证书:公共证书颁发机构会付费验证您的身份并为您提供代码签名证书。当您从信誉良好的证书颁发机构购买证书时,您可以与运行 Windows 的其他计算机上的用户共享您的脚本,因为这些其他计算机信任该证书颁发机构。

  • 您创建的证书:您可以创建自签名证书,您的计算机是创建该证书的颁发机构。该证书是免费的,使您能够在计算机上编写、签名和运行脚本。但是,由自签名证书签名的脚本将无法在其他计算机上运行。

通常,您只会使用自签名证书来签署您为自己使用而编写的脚本,以及签署您从已验证安全的其他来源获得的脚本。它不适合共享脚本,即使在企业内部也是如此。

如果您创建自签名证书,请务必在您的证书上启用强大的私钥保护。这可以防止恶意程序代表您签署脚本。这些说明包含在本主题的末尾。

创建自签名证书

要创建自签名证书,请使用 PKI 模块中的 New-SelfSignedCertificate cmdlet。该模块是在 PowerShell 3.0 中引入的。有关详细信息,请参阅 New-SelfSignedCertificate cmdlet 的帮助主题。

$params = @{
    Subject = 'CN=PowerShell Code Signing Cert'
    Type = 'CodeSigning'
    CertStoreLocation = 'Cert:\CurrentUser\My'
    HashAlgorithm = 'sha256'
}
$cert = New-SelfSignedCertificate @params

使用 Makecert.exe

要在早期版本的 Windows 中创建自签名证书,请使用证书创建工具 MakeCert.exe。该工具包含在 Microsoft .NET SDK(版本 1.1 及更高版本)和 Microsoft Windows SDK 中。

有关 MakeCert.exe 工具的语法和参数说明的详细信息,请参阅证书创建工具 (MakeCert.exe)。

要使用 MakeCert.exe 工具创建证书,请在 SDK 命令提示符窗口中运行以下命令。

笔记

第一个命令为您的计算机创建本地证书颁发机构。第二条命令从证书颁发机构生成个人证书。您可以完全按照命令的显示方式复制或键入命令。尽管您可以更改证书名称,但无需替换。

makecert -n "CN=PowerShell Local Certificate Root" -a sha256 `
-eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer `
-ss Root -sr localMachine

makecert -pe -n "CN=PowerShell User" -ss MY -a sha256 `
-eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer

MakeCert.exe 工具会提示您输入私钥密码。该密码可确保未经您的同意任何人都无法使用或访问该证书。创建并输入您可以记住的密码。稍后您将使用此密码来检索证书。

要验证证书是否正确生成,请使用以下命令获取计算机上证书存储中的证书。您不会在文件系统目录中找到证书文件。

在 PowerShell 提示符下,键入:

Get-ChildItem cert:\CurrentUser\my -codesigning

此命令使用 PowerShell 证书提供程序来查看有关证书的信息。

如果已创建证书,则输出会在类似于以下内容的显示中显示标识证书的指纹

Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\My

Thumbprint                                Subject
----------                                -------
4D4917CB140714BA5B81B96E0B18AAF2C4564FDF  CN=PowerShell User ]

签署脚本

创建自签名证书后,您可以签署脚本。如果您使用AllSigned执行策略,签署脚本允许您在计算机上运行该脚本。

以下示例脚本 Add-Signature.ps1 对脚本进行签名。但是,如果您使用 AllSigned 执行策略,则必须在运行 Add-Signature.ps1 脚本之前对其进行签名。

这很重要

在 PowerShell 7.2 之前,必须使用 ASCII 或 UTF8NoBOM 编码保存脚本。 PowerShell 7.2 及更高版本支持任何编码格式的签名脚本。

要使用此脚本,请将以下文本复制到文本文件中,并将其命名为 Add-Signature.ps1

## Signs a file
[cmdletbinding()]
param(
    [Parameter(Mandatory=$true)]
    [string] $File
)

$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
    Select-Object -First 1

Set-AuthenticodeSignature -FilePath $File -Certificate $cert

要签署 Add-Signature.ps1 脚本文件,请在 PowerShell 命令提示符下键入以下命令:

$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
    Select-Object -First 1

Set-AuthenticodeSignature add-signature.ps1 $cert

签署脚本后,您可以在本地计算机上运行它。但是,该脚本不会在 PowerShell 执行策略需要来自受信任机构的数字签名的计算机上运行。如果您尝试,PowerShell 将显示以下错误消息:

The file C:\remote_file.ps1 cannot be loaded. The signature of the
certificate cannot be verified.
At line:1 char:15
+ .\ remote_file.ps1 <<<<

如果 PowerShell 在运行不是您编写的脚本时显示此消息,请像对待任何未签名的脚本一样对待该文件。查看代码以确定您是否可以信任该脚本。

为您的私钥提供强有力的保护

如果您的计算机上有私钥和证书,恶意程序可能能够代表您签署脚本,从而授权 PowerShell 运行它们。

要防止代表您自动签名,请使用证书管理器 Certmgr.exe 将签名密钥和证书导出到 .pfx 文件。证书管理器包含在 Microsoft .NET SDK、Microsoft Windows SDK 和 Internet Explorer 中。

导出证书:

  1. 启动证书管理器。
  2. 选择 PowerShell 本地证书根颁发的证书。
  3. 单击导出启动证书导出向导。
  4. 选择是,导出私钥,然后单击下一步
  5. 选择启用强保护
  6. 输入密码,然后再次输入以确认。
  7. 键入具有 .pfx 文件扩展名的文件名。
  8. 单击完成

重新导入证书:

  1. 启动证书管理器。
  2. 单击导入启动证书导入向导。
  3. 打开您在导出过程中创建的 .pfx 文件的位置。
  4. 在“密码”页面上,选择启用强私钥保护,然后输入您在导出过程中分配的密码。
  5. 选择个人证书存储。
  6. 单击完成

防止签名过期

脚本中的数字签名在签名证书过期之前一直有效,或者只要时间戳服务器可以在签名证书有效时验证脚本是否已签名。

由于大多数签名证书的有效期仅为一年,因此使用时间戳服务器可确保用户可以在未来多年内使用您的脚本。

参见

  • about_Execution_Policies
  • about_个人资料
  • Set-AuthenticodeSignature
  • Get-ExecutionPolicy
  • Set-ExecutionPolicy
  • 代码签名简介

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯