如何为Windows上的代码签名创建自签名证书?

如何使用Windows SDK中的工具创建用于代码签名的自签名证书?

214719 次浏览

更新后的答案

如果您正在使用以下Windows版本或更高版本:Windows Server 2012, Windows Server 2012 R2,或Windows 8.1,然后MakeCert现在已弃用, Microsoft建议使用PowerShell Cmdlet New-SelfSignedCertificate . txt

如果您使用的是Windows 7等旧版本,则需要坚持使用MakeCert或其他解决方案。有些人不知道该怎么做。

原来的答案

虽然你可以创建一个自签名的代码签名证书(SPC - 软件发行者证书),我更喜欢这样做:

创建自签名证书颁发机构(CA)

makecert -r -pe -n "CN=My CA" -ss CA -sr CurrentUser ^
-a sha256 -cy authority -sky signature -sv MyCA.pvk MyCA.cer

(^ =允许批处理命令行换行)

这将创建一个自签名(-r)证书,带有一个可导出的私钥(-pe)。它被命名为“My CA”,应该放在当前用户的CA存储中。我们正在使用sha - 256算法。该密钥用于签名(-sky)。

私钥应该存储在MyCA中。“MyCA. pvk”文件和MyCA. pvk文件中的证书。cer文件。

导入CA证书

因为如果您不信任CA证书,那么拥有它就没有意义了,您需要将其导入Windows证书存储区。你可以使用证书MMC管理单元,但从命令行:

certutil -user -addstore Root MyCA.cer

创建代码签名证书(SPC)

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

如果您正在使用密码,请使用下面的密码

pvk2pfx -pvk MySPC.pvk -spc MySPC.cer -pfx MySPC.pfx -po fess

如果您想保护PFX文件,请添加-po开关,否则PVK2PFX将创建一个没有密码短语的PFX文件。

使用证书对代码进行签名

signtool sign /v /f MySPC.pfx ^
/t http://timestamp.url MyExecutable.exe

(看看为什么时间戳可能很重要)

如果您将PFX文件导入到证书存储中(您可以使用PVKIMPRT或MMC管理单元),您可以按照以下方式对代码进行签名:

signtool sign /v /n "Me" /s SPC ^
/t http://timestamp.url MyExecutable.exe

signtool /t的一些可能的时间戳url是:

  • http://timestamp.verisign.com/scripts/timstamp.dll
  • http://timestamp.globalsign.com/scripts/timstamp.dll
  • http://timestamp.comodoca.com/authenticode
  • http://timestamp.digicert.com

完整的微软文档

下载

对于那些不是。net开发人员的人,您将需要一个Windows SDK和。net框架的副本。当前的链接可以在这里找到:[SDK & . net][5](它将makecert安装在' C:\Program Files\Microsoft SDK \Windows\v7.1 '中)。你的里程可能会有所不同。

MakeCert可从Visual Studio命令提示符获得。Visual Studio 2015确实有,它可以在Windows 7的开始菜单下“VS 2015的开发人员命令提示符”下启动。或“VS2015 x64本机工具命令提示符”;(可能都在同一个文件夹中)。

罗杰的回答很有帮助。

不过,我在使用它时遇到了一点麻烦,一直出现红色的“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

从PowerShell 4.0 (Windows 8.1/Server 2012 R2)开始,可以在没有makecert.exe的Windows中制作证书。

你需要的命令是New-SelfSignedCertificateExport-PfxCertificate

指令在使用PowerShell创建自签名证书中。

在Powershell中使用New-SelfSignedCertificate命令非常简单。

.打开powershell,执行3条命令
    <李> < p > 创建证书:
    $cert = New-SelfSignedCertificate -DnsName www.yourwebsite.com -Type CodeSigning -CertStoreLocation Cert:\CurrentUser\My

    <李> < p > 为它设置密码:
    $CertPassword = ConvertTo-SecureString 字符串“my_passowrd"force -AsPlainText < / p > <李> < p > 导出:
    Export-PfxCertificate -Cert "cert:\CurrentUser\My$($cert. thumbprint)" -FilePath“d: \ selfsigncert.pfx"密码美元CertPassword < / p >

您的证书selfsigncert.pfx将位于@ D:/


可选步骤:还需要将证书密码添加到系统环境变量中。通过在cmd中输入以下命令:setx CSC_KEY_PASSWORD "my_password"

如回答中所述,为了使用不弃用的方式为自己的脚本签名,应该使用New-SelfSignedCertificate

  1. 生成密钥:
New-SelfSignedCertificate -DnsName email@yourdomain.com -Type CodeSigning -CertStoreLocation cert:\CurrentUser\My
  1. 导出不带私钥的证书:
Export-Certificate -Cert (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0] -FilePath code_signing.crt

[0]将使此工作用于当您有多个证书时……显然,要让索引与你想要使用的证书相匹配…或采用一种滤液方式(指纹或发胶)。

  1. 将其作为受信任的发布者导入
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\TrustedPublisher
  1. 将其作为根证书颁发机构导入。
Import-Certificate -FilePath .\code_signing.crt -Cert Cert:\CurrentUser\Root
  1. 为脚本签名(假设这里的脚本名为script)。Ps1,修正相应的路径)。
Set-AuthenticodeSignature .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)
显然,一旦您设置了密钥,您就可以简单地使用它为任何其他脚本签名。
你可以在这篇文章中获得更详细的信息和一些故障排除帮助

你可以在Visual Studio 2019的项目属性中生成一个。在驱动程序签名部分,测试证书字段有一个下拉菜单。生成测试证书是其中一个选项。证书将位于扩展名为'cer'的文件中,通常与可执行文件或驱动程序位于相同的输出目录中。

这篇文章将只回答“如果你有证书,如何签署EXE文件”。部分:

为exe文件签名,我使用MS "signtool.exe"。为此,你需要下载庞大的微软Windows SDK,其容量高达1GB。幸运的是,您不必安装它。只需打开ISO并提取“Windows SDK Signing Tools-x86_en-us.msi"它只有400 KB。

然后我创建了这个小脚本文件:

prompt $
echo off
cls


copy "my.exe" "my.bak.exe"


"c:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64\signtool.exe" sign /fd SHA256 /f MyCertificate.pfx /p MyPassword My.exe


pause

< a href = " https://stackoverflow.com/questions/252226/signing-a-windows-exe-file " > < / >详细信息

__