我使用 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-SelfSignedCertificate
cmdlet 具有以下参数:
-类型(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