根据本指南我尝试创建一个用于签署 PowerShell 脚本的证书:
CD C:\OpenSSL-Win32\bin
REM Create the key for the Certificate Authority. 2048 is the bit encryptiong, you can set it whatever you want
openssl genrsa -out C:\Test\ca.key 2048
openssl req -config C:\OpenSSL-Win32\bin\openssl.cfg -new -x509 -days 1826 -key C:\Test\ca.key -out C:\Test\ca.crt
REM Now I'm creating the private key that will be for the actual code signing cert
openssl genrsa -out C:\Test\codesign.key 2048
openssl req -config C:\OpenSSL-Win32\bin\openssl.cfg -new -key C:\Test\codesign.key -reqexts v3_req -out C:\Test\codesign.csr
openssl x509 -req -days 1826 -in C:\Test\codesign.csr -CA C:\Test\ca.crt -CAkey C:\Test\ca.key -extfile C:\OpenSSL-Win32\bin\cnf\opensslTest.cnf -set_serial 01 -out C:\Test\codesign.crt
openssl pkcs12 -export -out C:\Test\codesign.pfx -inkey C:\Test\codesign.key -in C:\Test\codesign.crt
出现以下错误:
C:\OpenSSL-Win32\bin>openssl x509 -req -days 1826 -in C:\Test\codesign.csr -CA C:\Test\ca.crt -CAkey C:\Test\ca.key -extfile C:\OpenSSL-Win32\bin\cnf\openssl.cnf -set_serial 01 -out C:\Test\codesign.crt
Error Loading extension section default
14516:error:22097082:X509 V3 routines:do_ext_nconf:unknown extension name:crypto\x509v3\v3_conf.c:78:
14516:error:22098080:X509 V3 routines:X509V3_EXT_nconf:error in extension:crypto\x509v3\v3_conf.c:47:name=HOME, value=.
我用了OpenSSL v1.1.0c。我发现的所有其他指南都会创建不能用于代码签名的证书。
答案1
Windows 上的 OpenSSL 不需要。在 Windows 7 上,您可以使用我在 TechNet Script Gallery 上发布的 PowerShell 脚本:自签名证书生成器(PowerShell)用法可以是这样的:
New-SelfsignedCertificateEx -Subject "CN=Test Code Signing" `
-EKU "Code Signing" `
-KeySpec "Signature" `
-KeyUsage "DigitalSignature" `
-FriendlyName "Test code signing" `
-NotAfter $([datetime]::now.AddYears(5))
(第一个例子)。
从 Windows 8 开始,您可以使用内置certreq.exe
工具生成证书。使用证书配置创建 INF 文件,例如:
[NewRequest]
Subject = "CN=Test Code Signing"
KeyLength = 2048
KeyAlgorithm = RSA
ProviderName = "Microsoft Enhanced RSA and AES Cryptographic Provider"
MachineKeySet = false
Exportable = true
KeySpec = 2
KeyUsage = 0x80
RequestType = Cert
[EnhancedKeyUsageExtension]
OID=1.3.6.1.5.5.7.3.3 ; Code signing
然后运行以下命令:
Certreq –new path\inffilename.inf
这将生成证书并将其安装到当前用户的证书存储区。
从 Windows 10 开始,您可以使用内置的 PowerShell cmdlet,如下所示:
New-SelfSignedCertificate -CertStoreLocation cert:\currentuser\my `
-Subject "CN=Test Code Signing" `
-KeyAlgorithm RSA `
-KeyLength 2048 `
-Provider "Microsoft Enhanced RSA and AES Cryptographic Provider" `
-KeyExportPolicy Exportable `
-KeyUsage DigitalSignature `
-Type CodeSigningCert
但是,不建议在生产环境中使用自签名证书进行代码签名。您应仅在测试环境中使用它们。
对于私人使用(仅限于组织内部),您应该检查公司是否已经拥有 PKI 基础设施,并联系适当人员以获取公司批准的代码签名证书。
对于公共脚本(您将与软件包一起分发,或将脚本交付给您的客户),我建议从全球信任的商业 CA 提供商处购买代码签名。
答案2
使用 openssl 是可能的。添加一个部分
[ authenticode_cert ]
basicConstraints=CA:FALSE
extendedKeyUsage=codeSigning
nsCertType = objsign
到 openssl.cnf。按照 OP 链接的指南中所述创建密钥和请求。使用 openssl 签名有不同的方法。虽然指南使用命令openssl x509
进行签名,但我更喜欢:
openssl ca -startdate 230101000000Z -enddate 301231225959Z -extensions authenticode_cert -policy policy_any -in codesign.csr -out codesign.crt
最后按照说明导出为 PKCS12,并将结果安装.pfx
为受信任的发布者。
恕我直言,guids 所说的内容[ v3_req ]
可以放心忽略。上面的部分已经完成了工作。签名时指定部分的名称就足够了。
我甚至发现,添加除之外的任何其他内容codeSigning
都会extendedKeyUsage
使证书无法用于 MS 代码签名。