当你的程序从Edge浏览器下载下来时却被浏览器警告“不安全”的时候,原因很有可能不是因为程序有风险代码而是没有“数字签名”,而完成数字签名后,可以提高应用程序的的可信度(首次打开软件时“未知发布者”和“Bysun Software development,Inc.”哪个更可信就不用说了)

如何自己创建代码签名证书?

需要提前准备的工具:

  • cert2spc.exe
  • makecert.exe
  • signcode.exe
  • certmgr.exe

这些我已经提前打包好了:
下载链接
如果下载不了:备用下载

开始制作签名证书

制作证书

首先,把下载好的压缩包解压出来,这里我为了方便解压到D:\zs,后面我也会把这里当默认目录。


然后,以管理员身份运行cmd:

然后cd到证书的目录:cd /d D:\zs

然后,用makecert.exe开始制作证书:
makecert.exe -sv root.pvk -ss SubjectName -n "CN=你的组织或者公司名称,E=ni邮箱,C=国家,S=省份" -r root.cer

就比如我输入的是
makecert.exe -sv root.pvk -ss SubjectName -n "CN=Bysun,E=bysun00@qq.com,C=China,S=Shandong" -r root.cer
输入完成后回车,会弹出一个窗口:

这里设置一个密码,一定要记住,后面还要用到!
设置完成后点击确定,会再次弹出一个窗口:

再次输入刚才设置的密码,再看cmd窗口提示:“Succeeded”就是成功了

这时目录下应该会多出两个文件:root.pvk和root.cer

现在证书就生成好了,不过正常情况下打开root.cer的界面是这样的:

这时我们的证书会被认为是不受信任的证书,但是不要紧,我们继续回到cmd,执行下面的命令:cert2spc.exe root.cer root.spc

同样,出现Succeeded的字样就说明命令执行成功。这条命令会根据刚刚生成好的root.cer转换成root.spc。.spc文件是PKCS#7证书,可以直接使用signcode.exe对可执行文件进行数字签名,但是系统提示证书不受信任该怎么办呢?

解决证书不受信任的问题

回到cmd命令行,输入以下命令:
certmgr.exe -add -c root.spc -s -r localMachine root
命令执行完成后提示“CertMgr Succeeded”,然后双击打开root.spc


然后依次进行以下步骤:



给 .exe .cab .dll .ocx等文件进行数字签名

双击打开signcode.exe:


点击下一步:

选择要数字签名的文件:

然后继续:

接着选择我们之前准备好了的root.spc,然后下一步:

然后选择之前准备好的私钥文件,即root.pvk,然后再下一步:

输入之前设置的密码:

然后选择加密算法:

到了其他证书这一步默认就好不用动:

下一步,程序描述,填不填都行:

下一步填写时间戳服务器,可以有效防止文件被伪造和篡改,填不填都可以,我这里填一个:

以下都是时间戳服务的url:

http://sha256timestamp.ws.symantec.com/sha256/
http://timestamp.comodoca.com/rfc3161
http://tsa.wosign.com/timestamp
http://tsa.starfieldtech.com
http://timestamp.globalsign.com/scripts/timstamp.dll
http://rfc3161timestamp.globalsign.com/advanced
http://timestamp.digicert.com
http://time.certum.pl
http://timestamp.verisign.com/scripts/timestamp.dll
http://timestamp.entrust.net/TSS/AuthenticodeTS

到这一步,基本就完成了:


输入密码就完成了:

能看到签名前后多了一个数字签名的属性:

以管理员身份启动签名前后也有所不同:

让程序在别的电脑上运行的时候,防止数字签名失效

之前的操作有一步是“解决证书不受信任的问题”,不过这个解决方法也是在自己电脑上信任,想要在其他电脑上信任需要把制作的证书安装到其他电脑的“受信任的证书颁发者“中,这时我们需要创建config.bat,内容如下:

@echo off
mshta vbscript:msgbox("请关闭一切杀毒软件并授予Windows命令处理程序管理员权限,即允许Windows命令处理程序具对您的设备进行更改,否则操作可能会失败!",64+4096,"证书操作")(window.close)
%1 %2
mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto runas","goto notadmin","runas",1)(window.close)&&exit
 
:runas
cd /d %~dp0
setlocal enabledelayedexpansion
certmgr.exe -add -c root.spc -s -r localMachine root>>%temp%\config.tmp
for /f "delims=" %%a in (%temp%\config.tmp) do (set var=%%a)
echo %var% | find "CertMgr Failed" > NUL && goto no
echo %var% | find "CertMgr Succeeded" > NUL && goto yes
del /f /q %temp%\config.tmp
 
:no
del /f /s %temp%\your.app.name.key
cls
mshta vbscript:msgbox("证书导入失败,请尝试重新关闭杀毒软件并以管理员权限运行此脚本!",64+4096,"证书操作")(window.close)
exit
 
:yes
echo CertMgr Succeeded>>%temp%\your.app.name.key
mshta vbscript:msgbox("证书导入成功!",64+4096,"证书操作")(window.close)
exit

在config.bat所在目录下需要有事先准备好的root.spc以及开始前下载好的certmgr.exe,然后运行config.bat文件就可以将证书安装到了“受信任的证书颁发者“中了。