powershell脚本自签名

powershell脚本自签名

我使用 Power Shell cmdlet 创建了一个自签名证书

New-SelfSignedCertificate -DnsName test.OJ.com -CertStoreLocation cert:\LocalMachine\My

之后,您可以在确定在个人\证书下

现在我想用这个证书来签名一个PS脚本。我尝试了两种方法 1. 使用 PS 主机

$cert = @(Get-ChildItem cert:\CurrentUser\My -CodeSigning)[0] 

Set-AuthenticodeSignature .\scriptTosing.ps1 $cert

第一次命令执行后,$cert 变量为空

2. 使用SingTool.exe

signtool.exe  sign /debug /a ".\scriptTosing.ps1" 

结果如下:

The following certificates were considered:


After EKU filter, 0 certs were left.

After expiry filter, 0 certs were left.

After Private Key filter, 0 certs were left.

SignTool Error: No certificates were found that met all the given criteria.

请指教

答案1

这个问题很难解决,但最终找到了一个非常简单的解决方案

文档中Get-ChildItem -CodeSigning说:

-代码签名证书

仅获取具有代码签名权限的证书。此参数获取 EnhancedKeyUsageList 属性值中包含“代码签名”的证书。

您的$cert变量是空的,因为它没有从命令中获得返回get-childitem,因为您的证书不知道它是一个代码签名证书,因为EnhancedKeyUsage属性不等于“CodeSigning”(此外,您将证书存储在中LocalMachine,但想要从中读取它CurrentUser是错误的)。

因此,当您创建证书时,New-SelfSignedCertificate您必须告诉证书,它必须是代码签名证书。

New-SelfSignedCertificatecmdlet 具有以下参数:

-类型(Microsoft.CertificateServices.Commands.CertificateType)

指定此 cmdlet 创建的证书类型。此参数可接受的值为:

-- CodeSigningCert -- 自定义 -- DocumentEncryptionCert -- DocumentEncryptionCertLegacyCsp -- SSLServerAuthentication(默认)

因此你的整个脚本必须是这样的:

New-SelfSignedCertificate -DnsName test.OJ.com -CertStoreLocation cert:\LocalMachine\My -type CodeSigning
$cert = @(Get-ChildItem cert:\LocalMachine\My -CodeSigning)[0] 
Set-AuthenticodeSignature .\scriptTosing.ps1 $cert

相关内容