# ms_cert_tools **Repository Path**: robinhood002/ms_cert_tools ## Basic Information - **Project Name**: ms_cert_tools - **Description**: 微软证书工具,提取自Windows SDK。 Windows SDK原始下载地址:https://developer.microsoft.com/zh-cn/windows/downloads/windows-sdk/ - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: https://developer.microsoft.com/zh-cn/windows/downloads/windows-sdk/ - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-12-18 - **Last Updated**: 2023-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 微软数字签名工具 提取自Windows SDK > SDK Version: 10.0.22621.0 arch: x64 ## 使用方法 ### 0. 获取Windows驱动签名工具 Windows驱动签名工具包含在`Windows SDK`中,可以前往微软官网下载: [Windows SDK](https://developer.microsoft.com/zh-cn/windows/downloads/windows-sdk/) 在页面中找到`下载安装程序`,并下载自己喜欢的版本。 下载并安装完成后,要用的文件位于: > C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\ 上述路径中,windows版本取决于你安装的SDK版本 ### 1. 使用`MakeCert.exe`创建私钥 参考命令如下:`注意,一定要用管理员权限` > makecert.exe -sv myfile.pvk -n "CN=My Name, O=Organization, C=CN" myfile.cer -b 01/01/2023 -e 12/31/2072 -r -h 0 -len 2048 -pe -eku "1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13" 参数说明: ```desc -sv 文件名.pvk : 指定保存私钥文件及文件名 -n "CN=My Name" 文件名.cer : 指定证书发布者名称,此名称必须符合 `X.500` 标准。 最简单的方法是使用 "CN=MyName" 格式。额外带的:"O:组织名称"、"C:国家缩写(2个字母)"、"E:电子邮件" -b mm/dd/yyyy : 证书生效日期 -e mm/dd/yyyy : 证书失效日期 -r : 创建自签名证书,这样可以省掉一些认证 -h 数字 : 证书后面可以的最大层级(能不能用来签发别的证书),设为 `0` 代表不能用来签发别的证书 -len 长度 : 指定使用者的私钥和公钥的长度(以位为单位),默认为 1024 -pe : 允许导出私钥 -eku oid1,oid2... : 将一个或多个逗号分隔的 `增强型密钥使用对象标识符` 的列表 (OID) 插入证书。 其中两个 OID 含义如下: "1.3.6.1.5.5.7.3.3" :指示证书对代码签名有效。 始终指定此值以限制证书的预期用途。 "1.3.6.1.4.1.311.10.3.13" : 表示证书遵循生存期签名。 通常,如果签名带有时间戳,只要证书在时间戳时有效,即使证书过期,签名也仍然有效。 无论签名是否带有时间戳,此 EKU 都会强制签名过期。 需注意:`OID之间的逗号后面不要带空格!` ``` 额外:详细OID定义见`"CryptoAPI 2.0 中的 Wincrypt.h 文件"`: ### 2. 使用 `Pvk2Pfx.exe` 创建个人信息交换 (.pfx) 文件 参考命令如下: > Pvk2Pfx /pvk MyKey.pvk /pi pvkPassword /spc MyKey.cer /pfx MyKey.pfx [/po pfxPassword] `MyKey.pvk` 和 `MyKey.cer` 文件与MakeCert.exe在上一步中创建的文件相同。 通过使用可选的 `/po` 参数,可以为生成的 `.pfx 指定不同的密码`;否则,`.pfx 的密码与 MyKey.pvk 相同`。 ### 3. 运行 `SignTool.exe` 对包进行签名 参考命令: > signtool.exe sign /fd SHA256 /a /f myfile.pfx /p pfxPassword [/tr http://sha256timestamp.ws.symantec.com/sha256/timestamp /td SHA256] myAppx.exe 参数说明: ```desc sign : 进行签名操作 /fd : 文件签名HASH算法,可选有:`SHA256` (.appx 默认)、`SHA384`、`SHA512` /a : 自动选择最佳签名证书。 /f myfile.pfx : 用于签名的证书文件 /p pfxPassword : 用于签名的pfx证书文件密码 /tr RFC3161时间戳服务器url : 用于添加时间戳的RFC3161时间戳服务器url /td 时间戳HASH算法 : 根据时间戳服务器的HASH算法填 myAppx.exe : 被签名的应用程序 ``` > 更多签名参数见:https://learn.microsoft.com/zh-cn/windows/win32/seccrypto/signtool 注:`时间戳服务器是可选的`,以下是一些可用的时间戳服务器: ### 额外:免费可信时间戳地址 Timestamp URL 服务提供商|类型|URL :--------:|:------|:------ Symantec|SHA-1时间戳|http://timestamp.verisign.com/scripts/timstamp.dll Symantec|SHA-1 RFC3161时间戳|http://sha1timestamp.ws.symantec.com/sha1/timestamp Symantec|SHA-256 RFC3161时间戳|http://sha256timestamp.ws.symantec.com/sha256/timestamp COMODO|SHA-1 时间戳|http://timestamp.comodoca.com/authenticode COMODO|SHA-256 RFC3161时间戳|http://timestamp.comodoca.com/rfc3161 GlobalSign|SHA-1 时间戳|http://timestamp.globalsign.com/scripts/timestamp.dll GlobalSign|SHA-256 RFC3161时间戳|http://timestamp.globalsign.com/?signature=sha2 Entrust|SHA-1 时间戳|http://timestamp.entrust.net/TSS/AuthenticodeTS Entrust|SHA-1 RFC3161时间戳|http://timestamp.entrust.net/TSS/RFC3161sha1TS Entrust|SHA-256 RFC3161时间戳|http://timestamp.entrust.net/TSS/RFC3161sha2TS # 额外:一些较为实用的证书用途OID 以下内容摘自`Wincrypt.h`文件 ```h //+------------------------------------------------------------------------- // Enhanced Key Usage (Purpose) Object Identifiers //-------------------------------------------------------------------------- // 别直接用这个,用这个的结果就是,证书啥地方都不能用! #define szOID_PKIX_KP "1.3.6.1.5.5.7.3" // Consistent key usage bits: DIGITAL_SIGNATURE, KEY_ENCIPHERMENT // or KEY_AGREEMENT // 服务端验证 #define szOID_PKIX_KP_SERVER_AUTH "1.3.6.1.5.5.7.3.1" // Consistent key usage bits: DIGITAL_SIGNATURE // 客户端验证 #define szOID_PKIX_KP_CLIENT_AUTH "1.3.6.1.5.5.7.3.2" // Consistent key usage bits: DIGITAL_SIGNATURE // 代码签名 #define szOID_PKIX_KP_CODE_SIGNING "1.3.6.1.5.5.7.3.3" // Consistent key usage bits: DIGITAL_SIGNATURE, NON_REPUDIATION and/or // (KEY_ENCIPHERMENT or KEY_AGREEMENT) // 电子邮件(E-Mail)保护 #define szOID_PKIX_KP_EMAIL_PROTECTION "1.3.6.1.5.5.7.3.4" // Consistent key usage bits: DIGITAL_SIGNATURE and/or // (KEY_ENCIPHERMENT or KEY_AGREEMENT) // IP层安全协议终端系统 #define szOID_PKIX_KP_IPSEC_END_SYSTEM "1.3.6.1.5.5.7.3.5" // Consistent key usage bits: DIGITAL_SIGNATURE and/or // (KEY_ENCIPHERMENT or KEY_AGREEMENT) // IP层安全协议隧道 #define szOID_PKIX_KP_IPSEC_TUNNEL "1.3.6.1.5.5.7.3.6" // Consistent key usage bits: DIGITAL_SIGNATURE and/or // (KEY_ENCIPHERMENT or KEY_AGREEMENT) // IP层安全协议用户 #define szOID_PKIX_KP_IPSEC_USER "1.3.6.1.5.5.7.3.7" // Consistent key usage bits: DIGITAL_SIGNATURE or NON_REPUDIATION // 时间戳签名 #define szOID_PKIX_KP_TIMESTAMP_SIGNING "1.3.6.1.5.5.7.3.8" // OCSP response signer // OCSP(在线证书状态协议)响应签名 #define szOID_PKIX_KP_OCSP_SIGNING "1.3.6.1.5.5.7.3.9" ```