如何使用Windows SDK中的工具为代码签名创建自签名证书?
答案 0 :(得分:340)
如果您使用的是以下Windows版本或更高版本:Windows Server 2012,Windows Server 2012 R2或Windows 8.1,则MakeCert is now deprecated,Microsoft建议使用the PowerShell Cmdlet New-SelfSignedCertificate。
如果您使用的是Windows 7等旧版本,则需要坚持使用MakeCert或其他解决方案。有些人suggest Public Key Infrastructure Powershell (PSPKI) Module。
虽然您可以一次性创建自签名代码签名证书(SPC - Software Publisher Certificate),但我更愿意执行以下操作:
makecert -r -pe -n "CN=My CA" -ss CA -sr CurrentUser ^
-a sha256 -cy authority -sky signature -sv MyCA.pvk MyCA.cer
(^ =允许批处理命令行换行)
这将创建一个带有可导出私钥(-pe)的自签名(-r)证书。它被命名为“我的CA”,应该放在当前用户的CA存储中。我们正在使用SHA-256算法。密钥用于签名(-sky)。
私钥应存储在MyCA.pvk文件中,而证书应存储在MyCA.cer文件中。
因为如果您不信任CA证书没有意义,您需要将其导入Windows证书库。您可以使用证书MMC管理单元,但是从命令行:
certutil -user -addstore Root MyCA.cer
makecert -pe -n "CN=My SPC" -a sha256 -cy end ^
-sky signature ^
-ic MyCA.cer -iv MyCA.pvk ^
-sv MySPC.pvk MySPC.cer
它与上面几乎相同,但我们提供发行者密钥和证书(-ic和-iv开关)。
我们还希望将证书和密钥转换为PFX文件:
pvk2pfx -pvk MySPC.pvk -spc MySPC.cer -pfx MySPC.pfx
如果要保护PFX文件,请添加-po开关,否则PVK2PFX会创建一个没有密码短语的PFX文件。
signtool sign /v /f MySPC.pfx ^
/t http://timestamp.url MyExecutable.exe
(See why timestamps may matter)
如果将PFX文件导入证书存储区(可以使用PVKIMPRT或MMC管理单元),则可以按如下方式对代码进行签名:
signtool sign /v /n "Me" /s SPC ^
/t http://timestamp.url MyExecutable.exe
signtool /t
的一些可能的时间戳网址是:
http://timestamp.verisign.com/scripts/timstamp.dll
http://timestamp.globalsign.com/scripts/timstamp.dll
http://timestamp.comodoca.com/authenticode
对于那些不是.NET开发人员的人,您需要一份Windows SDK和.NET框架。此处提供了当前链接:SDK & .NET(在C:\Program Files\Microsoft SDKs\Windows\v7.1
中安装makecert)。您的里程可能会有所不同。
MakeCert可从Visual Studio命令提示符获得。 Visual Studio 2015确实拥有它,它可以从Windows 7的“开发人员命令提示符VS 2015”或“VS2015 x64 Native Tools命令提示符”(可能所有这些都在同一文件夹中)的“开始”菜单中启动。
答案 1 :(得分:17)
罗杰的回答非常有帮助。
但是,我在使用它时遇到了一些麻烦,并且不断得到红色的“Windows无法验证此驱动程序软件的发布者”错误对话框。关键是用安装测试根证书certutil -addstore Root Demo_CA.cer
罗杰的回答并没有完全覆盖。
这是一个适用于我的批处理文件(使用我的.inf文件,不包括在内)。 它展示了如何从头到尾完成所有操作,完全没有GUI工具 (除了一些密码提示)。
REM Demo of signing a printer driver with a self-signed test certificate.
REM Run as administrator (else devcon won't be able to try installing the driver)
REM Use a single 'x' as the password for all certificates for simplicity.
PATH %PATH%;"c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin";"c:\Program Files\Microsoft SDKs\Windows\v7.0\Bin";c:\WinDDK\7600.16385.1\bin\selfsign;c:\WinDDK\7600.16385.1\Tools\devcon\amd64
makecert -r -pe -n "CN=Demo_CA" -ss CA -sr CurrentUser ^
-a sha256 -cy authority -sky signature ^
-sv Demo_CA.pvk Demo_CA.cer
makecert -pe -n "CN=Demo_SPC" -a sha256 -cy end ^
-sky signature ^
-ic Demo_CA.cer -iv Demo_CA.pvk ^
-sv Demo_SPC.pvk Demo_SPC.cer
pvk2pfx -pvk Demo_SPC.pvk -spc Demo_SPC.cer ^
-pfx Demo_SPC.pfx ^
-po x
inf2cat /drv:driver /os:XP_X86,Vista_X64,Vista_X86,7_X64,7_X86 /v
signtool sign /d "description" /du "www.yoyodyne.com" ^
/f Demo_SPC.pfx ^
/p x ^
/v driver\demoprinter.cat
certutil -addstore Root Demo_CA.cer
rem Needs administrator. If this command works, the driver is properly signed.
devcon install driver\demoprinter.inf LPTENUM\Yoyodyne_IndustriesDemoPrinter_F84F
rem Now uninstall the test driver and certificate.
devcon remove driver\demoprinter.inf LPTENUM\Yoyodyne_IndustriesDemoPrinter_F84F
certutil -delstore Root Demo_CA
答案 2 :(得分:12)
从PowerShell 4.0开始(Windows 8.1 / Server 2012 R2),可以在没有makecert.exe的情况下在Windows中创建证书。
答案 3 :(得分:12)
使用Powershell中的New-SelfSignedCertificate命令相当容易。 打开powershell并运行这3个命令。
1)创建证书:
$ cert = New-SelfSignedCertificate -DnsName www.yourwebsite.com -Type CodeSigning -CertStoreLocation Cert:\ CurrentUser \ My2)设置密码:
$ CertPassword = ConvertTo-SecureString -String" my_passowrd" -Force -AsPlainText3)导出:
Export-PfxCertificate -Cert" cert:\ CurrentUser \ My \ $($ cert.Thumbprint)" -FilePath" d:\ selfsigncert.pfx" -Password $ CertPassword
您的证书 selfsigncert.pfx 将位于@ D:/
可选步骤:您还需要将证书密码添加到系统环境变量中。通过在cmd中输入以下内容来执行此操作:setx CSC_KEY_PASSWORD "my_password"
答案 4 :(得分:11)
如答案中所述,为了使用一种不建议使用的方式来签名自己的脚本,应该使用New-SelfSignedCertificate。
生成密钥:
New-SelfSignedCertificate -DnsName email@yourdomain.com -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
导出不带私钥的证书:
Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt
[0]可以在您拥有多个证书的情况下使用此功能。显然,使索引与您要使用的证书相匹配...或使用过滤方法(通过指纹或发行方)。
将其导入为受信任的发布者
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
将其导入为根证书颁发机构。
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
签署脚本。
Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)
很显然,一旦设置了密钥,就可以使用它对其他任何脚本进行签名。
您可以在this article中获得更多详细信息和一些故障排除帮助。