如何成为自己的证书颁发机构并创建自己的证书来签署代码文件






4.86/5 (27投票s)
创建和安装证书颁发机构证书、签名证书以及用于签名程序的 BAT 文件的分步说明
引言
签名证书是从证书颁发机构(如 VeriSign)购买的。证书颁发机构会验证您的身份。他们颁发给您的证书源自他们已安装在用户 Windows 计算机上的证书颁发机构证书。购买签名证书是一种最佳实践。
如果您不想购买签名证书,则必须创建自己的证书颁发机构证书以及从中派生的签名证书。证书颁发机构证书必须安装在所有将运行您的应用程序的 PC 上。许多系统管理员会不愿意这样做。如果您是所有将运行您的应用程序的 Windows 计算机的系统管理员,那么您可以决定这样做。
背景
我不自称为证书专家。这是我为一家不想购买签名证书的小型非营利组织创建证书颁发机构证书和签名证书所遵循的步骤。我已经使用签名证书签署了 Click Once 部署清单和 SETUP.EXE 程序,这些程序随后在 Windows XP SP2、Windows 7、Windows 8 和 Windows 10 计算机上执行。
使用此过程
在以下所有步骤中,将 COMPANYNAME
替换为您组织的名称缩写(不含空格)。
下面示例中引用的证书创建和代码签名软件工具位于 C:\"Program Files (x86)"\"Windows
Kits"\8.0\bin\x86\ 目录中,它们是 Windows SDK 的一部分。Windows 8 SDK 可在此处 找到。
用于执行代码签名的 PC 上必须安装至少 Internet Explorer 7。任何早期版本的 Internet Explorer 都将无法工作。
1. 创建证书颁发机构证书
以下内容应全部写在一行
C:\"Program Files (x86)"\"Windows
Kits"\8.0\bin\x86\makecert -n "CN=COMPANYNAME"
-cy authority -a sha512 -len 4096 -sv "COMPANYNAME.pvk" -r "COMPANYNAME.cer" -m 600
Makecert
将要求您输入证书颁发机构密码。请勿忘记!
2. 运行 MMC.EXE
- 单击 文件,然后单击 添加/删除管理单元
- 从左侧列表中选择 证书,然后单击 添加
- 选择 我的用户帐户,然后单击 完成
- 再次从列表中选择 证书 并 添加
- 选择 计算机帐户
- 将 MMC 的此配置(文件,然后 另存为)另存为 Certificates.msc,位于“开始”菜单、程序、管理工具目录中,以便将来可以访问它
3. 安装新的证书颁发机构证书
证书颁发机构证书存储在将进行签名以及将运行您的应用程序的所有计算机的受信任存储的 证书(本地计算机) / 受信任的根证书颁发机构 区域中。
- 双击 证书(本地计算机)
- 右键单击 受信任的根证书颁发机构
- 选择 所有任务,然后选择 导入
- 选择新证书(COMPANYNAME.cer)将其放入 受信任的根证书颁发机构 区域
现在,计算机将隐式信任由该新证书颁发机构签名并颁发的所有证书。
在 Microsoft Active Directory 环境中,您可以注册您的证书颁发机构证书,以便将其分发到所有 Windows 计算机。有关如何在 Active Directory 中注册您的证书颁发机构证书的详细信息超出了本文的范围。
4. 创建签名证书
以下内容应全部写在一行
C:\"Program Files (x86)"\"Windows
Kits"\8.0\bin\x86\makecert -n "CN=COMPANYNAME Software" -ic
"COMPANYNAME.cer" -iv "COMPANYNAME.pvk" -a sha512 -len 4096 -sky
signature -pe -sr currentuser -ss my "COMPANYNAMESoftware.cer"
Makecert
将要求您输入新签名证书私钥的密码。
Makecert
将要求您输入上面第 1 步中证书颁发机构的私钥密码。
5. 安装签名证书
签名证书是从新的证书颁发机构证书派生而来的,并存储在将进行签名的那台 Windows 计算机的 证书 - 当前用户 / 个人 区域中。
您不必也绝不应该将此签名证书安装到您的用户计算机上。
- 在 证书 - 当前用户 中右键单击 个人
- 选择 所有任务,然后选择 导入。
- 选择新的签名证书 COMPANYNAMESoftware.cer,将其放入 证书 - 当前用户 / 个人 区域
6. 创建一个名为 SIGNCODE.BAT 的 BAT 文件
我将我的 SIGNCODE.BAT 文件放在一个名为 C:\BAT 的文件夹中,这样就可以方便地键入 C:\BAT\SIGNCODE.BAT 而不是一个长的文件夹路径。
@ECHO OFF
REM create an array of timestamp servers...
REM IMPORTANT NOTE - The SET statement and the four servers should be all on one line.
set SERVERLIST=(http://timestamp.comodoca.com/authenticode
http://timestamp.verisign.com/scripts/timstamp.dll
http://timestamp.globalsign.com/scripts/timestamp.dll http://tsa.starfieldtech.com)
REM sign the file...
C:\"Program Files (x86)"\"Windows Kits"\8.0\bin\x86\signtool.exe
sign /n "COMPANYNAME Software" %1
set timestampErrors=0
for /L %%a in (1,1,300) do (
for %%s in %SERVERLIST% do (
Echo Try %%s
REM try to timestamp the file.
This operation is unreliable and may need to be repeated...
C:\"Program Files (x86)"\"Windows Kits"\8.0\bin\x86\signtool.exe timestamp /t %%s %1
REM check the return value of the timestamping operation and retry
if ERRORLEVEL 0 if not ERRORLEVEL 1 GOTO succeeded
echo Signing problem - timestamp server %%s
set /a timestampErrors+=1
Rem Wait 6 seconds
choice /N /T:6 /D:Y >NUL
)
REM wait 12 seconds...
choice /N /T:12 /D:Y >NUL
)
REM return an error code...
echo SignCode.bat exit code is 1. %timestampErrors% timestamping errors.
exit /b 1
:succeeded
REM return a successful code...
echo SignCode.bat exit code is 0. %timestampErrors% timestamping errors.
exit /b 0
7. 如何签名程序的示例
在 CMD 窗口中,导航到包含要签名程序的目录,然后运行 BAT 文件。
C:\BAT\SIGNCODE.BAT SETUP.EXE
其中 SETUP.EXE 是要签名的程序。
关注点
我阅读了 Microsoft 和非 Microsoft 网站上的许多文章,才将这些说明拼凑起来。感谢所有发布信息的人,让我能够学习如何做到这一点,并随后发布了我遵循的所有步骤的分步说明。
历史
- 2013年2月24日 - 初始版本
- 2013年2月25日 - 添加了指向 Windows 8 Windows SDK 的链接
- 2013年3月1日 - 添加了对 Active Directory 的 CA 分发功能的引用
- 2014年10月17日 - 添加了要求安装至少 Internet Explorer 7 的声明
- 2019年9月20日 - 将 Makecert 选项从
-sky exchange
更改为-sky signature
。
我发现当使用从签名证书导出的 PFX 在 Visual Studio 中签名程序集时,“exchange”选项会产生错误。将-a sha1
更改为-a sha512 -len 4096