SignTool 使用 SafeNet eToken 硬证书进行代码签名

news/2025/10/11 7:18:17/文章来源:https://www.cnblogs.com/lindexi/p/19134167

根据CA/B联盟国际标准要求,从 2022 年 11 月 15 日起,即使是 OV 代码签名证书,也需要将私钥存储在FIPS140-2 Level2、Common Criteria EAL4级以上或者同等认证级别的硬件,如 USB 令牌、硬件安全模块 HSM 等。原本之前只有 EV 证书才有此要求,现在代码签名也需要如此。我司购买的证书刚好最近差不多快过期了,续签的证书从原本的很方便的 PFX 软证书,换成使用带 HSM 硬件设备的硬证书

换成带 HSM 硬件设备的硬证书之后,依然可以使用 SignTool 进行自动化签名。和之前的软证书 PFX 文件只有命令行参数的差别了。本文将记录如何修改 SignTool 签名命令适配硬证书

我所在的团队是从天威诚信购买的证书,没有议价,稍贵。但他们的售后服务还不错,会给一些指导。但天威诚信推荐的是用他们的 iTrusSignTool.exe 工具,而非微软官方提供的 SignTool 工具,不利于我的自动化打包平台接入

好在天威诚信购买的证书使用的是 SafeNet 工具,依然可以从堆栈网找到 SafeNet eToken 的 SignTool 命令行签名方法,整个不会被弹出要求输入密码的对话框。堆栈网上给的是 EV 证书签名,且也没有中文截图。为了防止其他伙伴踩坑,我重新跑了一遍,编写了本文,包含详细的步骤。详细堆栈网的地址是: https://stackoverflow.com/questions/17927895/automate-extended-validation-ev-code-signing-with-safenet-etoken/47894907#47894907

先使用天威诚信供应商提供的口令和安装方法进行安装,这个步骤完成按照他们的文档就可以了,十分简单。唯一需要小心的是,这个过程里面不能使用远程桌面连接,哪怕用向日葵都可以,尽管在打包服务器部署向日葵是十分不安全的

详细配置文档请参阅 天威诚信代码签名证书安装配置指南(Digicert) 代码签名部署文档

如从其他供应商购买,还请自行参阅其他供应商提供的方法。如 https://www.geocerts.com/support/digicert-usb-etoken-installation-guide

完成证书下载任务之后,接下来即可进行本文的步骤了。本文以下步骤里面,我所有写入的我的密码等,都不是我所在团队真正使用的密码,还请大家不用担心我泄露密码,但却都是符合真实格式的内容,便于大家明确了解各个参数应该从哪里拿到

0 首先点击齿轮键进入高级模式,其高级模式界面如下

1 导出证书为 Codesign.cer 文件。右击对应的证书,选择导出,保存到文件即可。导出的 cer 格式的证书文件将不包含私钥,需要使用以下步骤获取 CSP 名和其对应的私钥容器名参数才能让 SignTool 从硬件设备获取私钥用于签名

2 记住证书的容器名。将其记录到记事本里,后续命令将会用到。如我的是 Container name 容器名是 p11#59336aa23069996b

3 获取设备的 CSP 名和读卡器名称

读卡器名称:

CSP 名:

CSP 名和读卡器名称在相同一页,只是内容比较多,需要滚动一下滚动条才能看到。额外地,在菜单栏也提供了复制的按钮,不需要真自己一个个字符抄

如我的读卡器名 reader 为 SafeNet Token JC 0

我的 CSP 名为 eToken Base Cryptographic Provider

4 拼接私钥容器名参数

eToken CSP 具有隐藏(或者至少没有广泛宣传)的功能,可以从容器名称中解析出令牌密码。尽管 https://stackoverflow.com/questions/17927895/automate-extended-validation-ev-code-signing-with-safenet-etoken/47894907#47894907 说明包含四个可选项,但实际我测试了,最委托的是最为复杂的写法项

为了让我的博客引擎开森,我将以下代码的两个连在一起的花括号替换为全角的花括号

[reader{{password}}]=ContainerName

其各个参数含义如下

  • reader: 读卡器名。第 3 步获取到的,如我的是 SafeNet Token JC 0
  • password: 下载证书过程中,自己设置的证书密码,如我的是 Lindexi123
  • ContainerName: 证书的容器名。第 2 步获取的,如我的是 p11#59336aa23069996b

重点说明,以上格式的两个连续花括号是必需的部分,这属于语法的一部分,还请不要省略

拼接之后的私钥容器名参数如下

/k "[SafeNet Token JC 0{{Lindexi123}}]=p11#59336aa23069996b"

5 完全的签名参数

按照微软的官方文档,可以知道其核心参数如下

  • /f : 导出的 Codesign.cer 签名证书文件,此证书文件没有包含私钥。私钥是存放在硬件设备里面。如后续步骤错误,将收到 SignTool Error: No private key is available 错误提示
  • /csp : 步骤 3 获取的 CSP 名。只有 csp 不配合 /k 参数,则将收到 SignTool Error: The /csp option requires the /k option. 错误
  • /k : 从步骤 4 拼接到的。等同于 /kc 参数,即写 /k/kc 都可以

非核心的日常参数如下,以下参数相对固定,正常不用更改

  • /td :将此选项与 /tr 选项一起使用可请求 RFC 3161 时间戳服务器使用的摘要算法。正常现在只能用 /td sha256

  • /tr :指定 RFC 3161 时间戳服务器的 URL 地址。如用 digi 的服务器 /tr http://timestamp.digicert.com

  • /fd :指定要用于创建文件签名的文件摘要算法。正常现在只能用 /fd sha256

  • /as :追加此签名。如果不存在主签名,则改为使此签名成为主签名

以下是我的示例签名命令,对 Test1.exe 文件进行签名

SignTool sign /f "Codesign.cer" /td sha256 /as /fd sha256 /tr http://timestamp.digicert.com /csp "eToken Base Cryptographic Provider" /k "[SafeNet Token JC 0{{Lindexi123}}]=p11#59336aa23069996b" Test1.exe

以上签名命令里面,为了让我的博客引擎开森,我将两个连在一起的花括号替换为全角的花括号。额外地,大家所设置的密码,即 Lindexi123 部分,以及证书的容器名,即 p11#59336aa23069996b 部分,都是和我不相同的,还请大家自行替换为自己的密码和证书的容器名

在此过程里面,都需要保持签名设备没有远程桌面 RDP 连接,否则将会签名失败。如签名成功,将会看到大概如下的控制台输出内容

Done Adding Additional Store
Successfully signed: Test1.exe

右击被签名的文件的属性,可以从数字签名界面看到签名内容。大家可以先尝试命令行参数,确定能够正常签名之后,再接入到自己的打包平台里面。对每个文件的签名,也只有传入的文件路径不相同而已,其他参数都是一样的,换句话说只要自己能拼接出一次正确的命令参数,接下来的其他文件的签名都可以复用这些参数

参考文档

  • Digicert代码签名证书助手操作指南 代码签名部署文档
  • 天威诚信代码签名证书安装配置指南(Digicert) 代码签名部署文档
  • https://www.gworg.com/code/1627.html
  • 使用 SignTool 对文件进行签名 - Win32 apps Microsoft Learn
  • SignTool - Win32 apps - Microsoft Learn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/934514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络技术全面解析:从基础架构到未来趋势

本文深入解析计算机网络的核心概念,涵盖网络类型、拓扑结构、关键组件及通信协议,同时探讨网络优势、风险挑战与未来发展趋势,为理解现代网络技术提供全面指南。什么是计算机网络? 计算机网络是指在信息系统中通过…

高增长行业碳减排技术路径解析

本文探讨了高增长经济部门实现碳减排的技术路径,包括可再生能源应用、电动交通转型、物流系统优化等关键技术领域,分析了清洁能源基础设施和零排放车辆等技术挑战与解决方案。高增长经济部门碳减排的技术路径 应对气…

css_01_自适应grid布局

网格布局根据宽度自动分配列数和列宽 主要是在设置 grid-template-columns 时设置repeat的第一个参数是 auto-fill或auto-fit第二个参数使用minmax和min进行配合让宽度使用最小值 注:希望grid中单元格宽度固定就使用 …

css01_自适应grid布局

网格布局根据宽度自动分配列数和列宽 主要是在设置 grid-template-columns 时设置repeat的第一个参数是 auto-fill或auto-fit第二个参数使用minmax和min进行配合让宽度使用最小值 注:希望grid中单元格宽度固定就使用 …

Software Foundations Vol.I : 更多基本策略(Tactics)

Software Foundations Vol.I : 更多基本策略(Tactics)本章主要内容包括:如何在“向前证明”和“向后证明”两种风格中使用辅助引理; 如何对数据构造子进行论证,特别是,如何利用它们单射且不交的事实; 如何增强归纳…

Ai元人文:算力的涅槃——当“悟空之眼”照见AI决策的下一纪元

让我们以相同的硬件为舞台,展开一场关于“模拟悟空决策”范式与传统大模型之间,那场关乎效率与智慧本质的深刻对话。 在这场人工智能的竞赛中,我们常被一种叙事所主导:更大的模型、更多的数据、更强的算力。这是一…

关于微信公众号/服务号自动回消息问题(python)

天呐!!!!!真的忙活了好久,终于在将近凌晨两点的时候解决了问题。进入正题。是的,没有错,如果你怀疑微信那边给的示例有问题那是对的,至少其给的示例在python3上有问题(我测试是如此哈, python3.9),需要改动一…

10.10 闲话

Alexander Hamilton.《会魔法的老人》 我从出生就是一个自闭小孩 容易被别人一句话给轻易伤害 所以 我在唱台上 不断的摆弄我的肢体 为了阻挡光线 和我眼神里的荒诞 独自在电影院里 观看一部杰作 野火在我的心底燃烧 梦…

Python 中的函数签名:详解与实例

Python 中的函数签名:详解与实例 函数签名(Function Signature)在 Python 中是对函数调用接口的结构化描述,它定义了函数接收参数的方式、类型提示以及返回值信息。Python 的函数签名具有灵活性,不强制参数类型,…

基于AXI模块的视频流传输(上板移植篇)

先发泄一下,终于!!!国庆!一个国庆,你知道我怎么过的吗!!! 首先我是拿官方例程,但是还是依旧跑不通,检查一下,发现以下几个问题,并且我是怎么处理的: 1、首先上板失败,可能由于只是粗略配置了一下管脚没配…

装饰器工厂与类装饰器:进阶装饰器技术解析

装饰器工厂与类装饰器:进阶装饰器技术解析 装饰器是Python中强大的元编程工具,除多种进阶形式。其中装饰器工厂(Decorator Factory)和类装饰器(Class Decorator)是两种重要变体,分别解决“带参数的装饰器”和“…

53最大子数组和 动态规划和分制 - MKT

53最大子数组和 动态规划和分制 class Solution { public:// 时间不通过int maxSubArray_2(vector<int>& nums) {int tager_max=nums[0];int left=0;// sum_[i] map<int,int> sum_i; // 和 索引 由于…

Codeforces 2153D Not Alone 题解 [ 绿 ] [ 线性 DP ] [ 分类讨论 ]

Not Alone:唐题。 容易将题意转化为:环上的每一个颜色段长度都 \(\ge 2\),求最小操作数。 再考虑一个 \(O(n^2\log n)\) 的暴力,定义 \(dp_i\) 表示以 \(i\) 结尾的最小操作数,然后枚举前一个转移点 \(j\)。继续考…

__closure__:闭包的“身份证”

要理解“闭包函数和嵌套函数的区别在于 __closure__ 属性”,首先需要明确 嵌套函数 和 闭包函数 的基础关系——闭包函数是“满足特定条件的嵌套函数”,而 __closure__ 属性正是闭包函数区别于普通嵌套函数的“标志性…

Codeforces Round 1057 (Div. 2)

A. Circle of Apple Trees 题意:一个环形数组,每次到一个位置可以选择拿走这个元素或者跳过,然后走到下一个位置。每次拿的数要比之前拿的大,求最多拿多少数。 显然可以从小到大拿,那么答案就是不同数的个数。点击…

“表达式”(Expression)和“语句”(Statement)概念辨析

在编程中,“表达式”(Expression)和“语句”(Statement)是两个基础且容易混淆的概念。它们的核心区别在于是否有返回值以及在代码中的作用,以下从定义、特点、示例三个维度详细说明: 一、定义与核心区别表达式(…

每日一题 ###121买卖股票的最佳时机

仅以此记录所学所想,如有错误,还望指正。 首次尝试 1、我小小的脑子只能想出暴力解法,结果是超时了。 class Solution { public:int maxProfit(vector<int>& prices) {int max=0;for(int i=0;i<prices…

10.10总结

1.将一个数组中的值按逆序重新存放进行了编程联系,生成了对应程序 2.明天学习完善程序细节 3.今天收获满满

LibreChat-图文并茂手把手教你界面配置 | Adorable LibreChat Interface Configuration Guide

@目录🎀 整体介绍 | Overview🍪 配置项详解 | Field Details🎨 开关大全 | All Switches✨ 配置示例 | Cute ExampleConclusion | 结语 🎀 整体介绍 | Overview 今天我们来学习一下,LibreChat的页面基础配置哇…

GAE-广义优势估计算法介绍

一句话总结 GAE 就像「既要稳又要准」的聪明妥协:用多步 TD 误差加权平均,既缓解了 MC 的高方差,又减少了 TD 的单一偏差,通过调节参数(λ)灵活平衡两者的优缺点。MC vs TD 的痛点MC(蒙特卡洛):原理:跑完整个…