自签名证书及其应用方式
代码签名有什么用?
对于我们来说,代码签名的作用也就是在UAC和运行程序时的界面稍微好看一点,看上去更高大上一点。
对于Windows应用程序的开发人员和软件厂商来说,代码签名可以减少应用程序的错误信息并提高应用程序的的可信度。 软件厂商和个体开发商可对他们通过互联网分销的软件进行数字签名并盖上时间戳, 该数字签名确保了最终用户知道该软件是合法的, 来自知名的软件厂商并且该程序代码字自发行以来就没有被篡改过。
但是随便一搜,发现所有的代码签名服务都是付费的,切价格昂贵.
Part Ⅱ 如何自己创建代码签名证书?
2-1 需要准备的工具
制作自己的代码签名证书需要的工具有:
- cert2spc.exe
- makecert.exe
- signcode.exe
- certmgr.exe
2-2 开始制作
2-2-1 制作证书
首先,以管理员权限运行cmd,cd进工具所在的目录(我的工具所在的目录是D:\cert)
```cd /d D:\cert``
然后,用makecert.exe开始制作证书
makecert.exe -sv root.pvk -ss SubjectName -n "CN=Dounick,E=Email,C=China,S=Hubei" -r root.cer
这行命令会创建root.pvk和root.cer两个文件,其中CN表示您的组织或公司的名称,这个公司名称会显示在UAC界面上,E表示您的电子邮箱,C表示国家,S表示省份。把SubjectName替换成您证书的储存名称(其实也就是您的组织或公司的名称)
这个时候会弹出一个提示框,在这个提示框中设置您的密码,这个密码一定要记住,后面还需要用到。密码设置完成后就点击OK,如果不需要密码可以直接点None表示没有密码。
密码设置完成以后,会弹出另一个窗口,在这个窗口中重新输入刚刚设置好的密码,点击OK即可。
回到cmd窗口,看到上面显示Succeeded即表示操作成功,就可以在makecert.exe所在的目录下找到root.pvk和root.cer
在正常情况下打开root.cer的界面是这样的:
图中的Dounick就是前面命令中的CN
这时我们的证书会被认为是不受信任的证书,但是不要紧,我们继续回到cmd,执行下面的命令:
cert2spc.exe root.cer root.spc
同样,出现Succeeded的字样就说明命令执行成功。这条命令会根据刚刚生成好的root.cer转换成root.spc。.spc文件是PKCS#7证书,可以直接使用signcode.exe对可执行文件进行数字签名,但是系统提示证书不受信任该怎么办呢?
2-2-2 解决证书不受信任
回到cmd命令行,输入以下命令:
certmgr.exe -add -c root.spc -s -r localMachine root
注意,在执行这行命令的时候,360可能会报毒,直接允许就可以了。命令执行完成后,双击打开root.spc:
2-2-3 给 .exe .cab .dll .ocx等文件进行数字签名
双击打开signcode.exe,如图,注意是signcode.exe,不是signtool.exe
选择需要进行数字签名的应用(注意,在点击下一步之前,一定要确定选中的文件没有运行,并不是只读文件,否则程序会报错)
然后选中自定义,点击下一步:
接着选择我们之前准备好了的root.spc文件:
然后选择之前准备好的私钥文件,即root.pvk
接下来选择加密算法,默认就好
下一步也无需修改,默认就好
然后填写您应用程序的标题,这里填写的标题将会作为UAC几面的标题。
下面填写时间戳服务URL,可以忽略,也可以填写以下几个URL中的一个:(填了也没什么实际作用,因为这都是其他证书颁发机构的时间戳此服务)
- http://timestamp.digicert
- http://timestamp.entrust/TSS/RFC3161sha2TS
- http://timestamp.globalsign
- http://rfc3161timestamp.globalsign/advanced
- http://sha256timestamp.ws.symantec/sha256/timestamp
- http://timestamp.wosign/rfc3161
- http://timestampodoca/rfc3161
- http://tsa.starfieldtech
- http://tsa.swisssign
- http://timestamp.entrust/TSS/AuthenticodeTS
- http://timestamp.globalsign/scripts/timstamp.dll
- http://timestamp.verisign/scripts/timstamp.dll
- http://timestamp.wosign/timestamp
- http://timestampodoca/authenticode
完成数字签名向导,在弹出的提示框里再次输入之前设置好的密码,这次一定不能输错,不然就要重新开始数字签名向导了。
这个时候再以管理员权限运行刚刚数字签名过的程序,就发现UAC界面有变化了,说明自制代码签名证书成功
2-2-4 让程序在别的电脑上运行的时候,防止数字签名失效
如果证书不受信任,数字签名就不会起作用,UAC界面就不会更改,我们的证书是自己给自己颁发的,所以会被Windows默认分配到”不受信任的证书颁发者“中,也就是说,只有别人把我们制作的证书安装到了“受信任的证书颁发者“中,数字签名才会在别的电脑上生效,那我们不妨就在别人运行您的程序之前偷偷地把我们的证书安装到电脑上,具体步骤见下:
创建config.bat,内容如下:
1 | @echo off |
@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注意事项以及使用方法:
- 如果文件%temp%\your.app.name.key存在,即表示证书导入成功,否则证书导入失败
- 在config.bat所在目录下需要有事先准备好的root.spc以及开始前下载好的certmgr.exe
参考来源
- 完全免费的Windows代码签名证书