如何使用SignTool签署应用程序包
备注
有关签署UWP应用程序包的信息,请参阅使用SignTool签署应用程序包。
了解如何使用SignTool对Windows应用商店应用包进行签名,以便部署它们。SignTool是Windows软件开发工具包(SDK)的一部分。
必须先对所有Windows应用商店应用包进行数字签名,然后才能部署它们。虽然Microsoft Visual Studio 2012及更高版本可以在创建期间对应用程序包进行签名,但是您使用Windows SDK中的应用程序打包程序(MakeAppx.exe)工具创建的程序包未签名。
备注
您只能使用SignTool在Windows 8及更高版本或Windows Server 2012及更高版本上对Windows应用商店应用包进行签名。您无法使用SignTool在Windows 7或Windows Server 2008 R2等低级操作系统上签署应用程序包。
你需要知道什么
技术
代码签名简介
应用包和部署
签名文件和检查签名的工具
先决条件
SignTool,它是Windows SDK的一部分
有效的代码签名证书,例如,使用MakeCert.exe和Pvk2Pfx.exe工具创建的个人信息交换(.pfx)文件
有关创建有效代码签名证书的信息,请参阅如何创建应用程序包签名证书。
打包的Windows应用商店应用,例如,使用app packager(MakeAppx.exe)工具创建的.appx文件
其他考虑因素
用于对应用程序包进行签名的证书必须符合以下条件:
证书的主题名称必须与包存储在AppxManifest.xml文件的Identity元素中的Publisher属性相匹配。发布者名称是Windows应用商店应用的标识的一部分,因此您必须使证书的主题名称与应用的发布者名称相匹配。这允许根据数字签名检查签名包的标识。有关使用SignTool对应用程序包进行签名可能产生的签名错误的信息,请参阅如何创建应用程序包签名证书的“备注”部分。
证书必须对代码签名有效。这意味着这两个项都必须为真:
证书的扩展密钥用法(EKU)字段必须未设置或包含代码签名的EKU值(1.3.6.1.5.5.7.3.3)。
证书的密钥用法(KU)字段必须未设置或包含数字签名的使用位(0x80)。
证书包含私钥。
证书有效。它是活动的,尚未过期,并且尚未被撤销。
说明
第1步:确定要使用的哈希算法
在对应用程序包进行签名时,必须使用创建应用程序包时使用的相同哈希算法。如果您使用默认设置来创建应用程序包,则使用的哈希算法是SHA256。
如果您使用具有特定哈希算法的app packager来创建应用程序包,请使用相同的算法对包进行签名。要确定用于签名包的哈希算法,可以提取包内容并检查AppxBlockMap.xml文件。BlockMap元素的HashMethod属性指示创建应用程序包时使用的哈希算法。例如:
句法
复制
<BlockMap xmlns="https://schemas.microsoft.com/appx/2010/blockmap"
HashMethod="https://www.w3.org/2001/04/xmlenc#sha256">
前面的BlockMap元素表示使用了SHA256算法。此表列出了当前可用算法的映射:
HashMethod值 要使用的hashAlgorithm
https://www.w3.org/2001/04/xmlenc#sha256 SHA256(.appx默认值)
https://www.w3.org/2001/04/xmldsig-more#sha384 SHA384
https://www.w3.org/2001/04/xmlenc#sha512 SHA512
步骤2:运行SignTool.exe以对包进行签名
使用.pfx文件中的签名证书对包进行签名
句法
复制
SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password filepath.appx
如果未指定,则 SignTool将/ fd hashAlgorithm参数默认为SHA1,并且SHA1对签名应用程序包无效。因此,您必须在签署应用程序包时指定此参数。要签署使用默认SHA256哈希创建的应用程序包,请将/ fd hashAlgorithm参数指定为SHA256:
句法
复制
SignTool sign /fd SHA256 /a /f signingCert.pfx /p password filepath.appx
如果使用非密码保护的.pfx文件,则可以省略/ p password参数。您还可以使用SignTool支持的其他证书选择选项来签署应用程序包。有关这些选项的更多信息,请参阅SignTool。
备注
您不能在已签名的应用程序包上使用SignTool时间戳操作; 该操作不受支持。
如果要为应用程序包添加时间戳,则必须在签名操作期间执行此操作。例如:
句法
复制
SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password /tr timestampServerUrl
filepath.appx
使/ tr timestampServerUrl参数等于RFC 3161时间戳服务器的URL。
备注
本节讨论解决应用包的签名错误问题。
排除应用包签名错误
除了签约的错误,SignTool可以返回,SignTool也可以返回特定于应用程序包的签名错误。这些错误通常显示为内部错误:
句法
复制
SignTool Error: An unexpected internal error has occurred.
Error information: "Error: SignerSign() failed." (-2147024885 / 0x8007000B)
如果错误代码以0x8008开头,例如0x80080206 APPX_E_CORRUPT_CONTENT),则表示正在签名的包无效。在这种情况下,在对包进行签名之前,必须重建包。有关0x8008 *错误的完整列表,请参阅COM错误代码(安全性和设置)。
更常见的是,错误是0x8007000b(ERROR_BAD_FORMAT)。在这种情况下,您可以在事件日志中找到更具体的错误信息:
搜索事件日志
运行Eventvwr.msc。
打开事件日志:事件查看器(本地)>应用程序和服务日志> Microsoft> Windows> AppxPackagingOM> Microsoft-Windows-AppxPackaging / Operational
查找最新的错误事件。
内部错误通常对应于以下之一:
活动ID 示例事件字符串 建议
150 错误0x8007000B:应用清单发布者名称(CN = Contoso)必须与签名证书的主题名称匹配(CN = Contoso,C = US)。 应用清单发布者名称必须与签名的主题名称完全匹配。
[!注意]
这些名称用引号指定,并且都是大小写和空格敏感的。
您可以更新为AppxManifest.xml文件中的Identity元素定义的Publisher属性字符串,以匹配预期签名证书的主题名称。或者,选择一个主题名称与应用清单发布者名称匹配的其他签名证书。清单发布者名称和证书使用者名称都列在事件消息中。
151 错误0x8007000B:指定的签名哈希方法(SHA512)必须与应用程序包块图(SHA256)中使用的哈希方法匹配。 / fd参数中指定的hashAlgorithm不正确(请参阅步骤1:确定要使用的哈希算法)。使用与应用程序包块映射匹配的hashAlgorithm 重新运行SignTool。
152 错误0x8007000B:应用程序包内容必须根据其块映射进行验证。 应用程序包已损坏,需要重建才能生成新的块映射。有关创建应用程序包的更多信息,请参阅使用app packager 创建应用程序包或使用Visual Studio 2012创建应用程序包。
安全考虑因素
对程序包进行签名后,用于对程序包进行签名的证书仍必须由要部署程序包的计算机信任。通过将证书添加到本地计算机证书存储区,可以影响计算机上所有用户的证书信任。我们建议您将用于测试应用程序包的任何代码签名证书安装到“受信任的人”证书存储区,并在不再需要时立即删除这些证书。如果您为签署应用程序包创建自己的测试证书,我们还建议您限制与测试证书关联的权限。有关为签名应用程序包创建测试证书的详细信息,请参阅如何创建应用程序包签名证书。
展示效果如下
Q947MF电动卸灰球阀(喷煤粉专用球阀), Q647F-Q647Y-Q647H气动固定球阀, Q947F-Q947Y-Q947H电动固定球阀, Q47F美标固定球阀, Q41F浮动球阀, Q41F浮动式球阀, 管路球阀, Q71F薄型球阀, 气动管路球阀, Q71F对夹式薄型球阀, Q41F塑料球阀, Q41F-10S塑料法兰球阀, PVC塑料球阀, QY347F氧气球阀, QY347F氧气专用球阀, 不锈钢气源球阀, QG·Y1气源球阀, BQ41H夹套球阀, BQ41H夹套保温球阀, Q41F46衬氟球阀, Q41F46衬四氟球阀, Q941F46电动衬氟球阀, FQ41F46衬氟放料球阀, Q641F46气动衬氟球阀, GU高真空球阀, GUQ气动高真空球阀, Q91SA异径球阀, Q91SA不锈钢异径球阀, Q41F美标球阀, Q41F日标球阀, Q41F日标法兰球阀, Q41F德标球阀, Q41F德标法兰球阀, Q41F铸铁球阀, Q41F铸铁法兰球阀, Q41F铸钢球阀, Q41F铸钢法兰球阀, Q41F碳钢球阀, Q41F碳钢法兰球阀, Q941TC电动陶瓷球阀, Q41TC陶瓷球阀, Q41TC手动陶瓷球阀, Q341TC蜗轮陶瓷球阀, Q641TC气动陶瓷球阀, Q41F国标球阀, Q41F国标法兰球阀, Q41H硬密封球阀, Q41Y金属硬密封球阀, Q41F软密封球阀, Q41F法兰式软密封球阀, Q61F承插焊球阀, Q61F不锈钢承插焊球阀, Q11F锌合金球阀, Q41F不锈钢球阀, Q41F不锈钢法兰球阀, Q41F液化气球阀, Q41F天然气球阀, Q41F液化气专用球阀, Q41F天然气专用球阀, Q41F-ZL法兰铝合金球阀, Q41F-ZL铝合金球阀, Q11F不锈钢一片式球阀, Q11F一片式球阀, Q11F二片式球阀, Q11F两片式球阀, Q41F三片式法兰球阀, Q81F三片式卡箍球阀, Q61F三片式焊接球阀, Q21F三片式活接对焊球阀, Q11F三片式内螺纹球阀, Q11F三片式球阀, Q61F三片式对焊球阀, Q11F三片式承插焊球阀, 高平台球阀, 不锈钢法兰高平台球阀, 高平台三通球阀, 两片式高平台球阀, 上装式球阀, 上装式固定球阀, Q41PPL一体式球阀, Q41PPL一体式高温球阀, KQ41F抗硫球阀, 高温高压球阀, 三片式高平台球阀, Z45W黄铜法兰闸阀, Z941H电动闸阀, Z941H矿用防爆电动闸阀, PZ73TC陶瓷刀型闸阀, Z943WF电动平板闸阀, Z543WF伞齿轮平板闸阀, Z43WF平板闸阀, Z643WF气动平板闸阀, Z43WF手动平板闸阀, Z43WF带导流孔平板闸阀, Z43WF无导流孔平板闸阀, Z43Y-Z63Y-Z83Y高压平板闸阀, Z40H美标闸阀, Z40H美标法兰闸阀, Z41H日标闸阀, Z41H日标不锈钢闸阀, Z41H铸钢闸阀, Z41H铸钢法兰闸阀
如何使用SignTool签署应用程序包的更多相关文章
- 如何以编程方式签署应用程序包(C ++)
了解如何使用SignerSignEx2函数对应用包进行签名. 如果要使用Packaging API以编程方式创建Windows应用商店应用包,则还需要在部署之前对应用包进行签名.Packaging A ...
- 转:vs发布window应用程序时出错:未能签名 ...\setup.exe
在vs发布window应用程序过程中,提示“SignTool 报告了一个错误‘未能签名 ...\setup.exe.SignTool 错误: ISignCode::Sign 返回的错误: 0x80 ...
- signtool对EXE进行签名
https://msdn.microsoft.com/zh-cn/library/9sh96ycy(VS.80).aspx .NET Framework 2.0 其他版本 文件签名工具使用 A ...
- 签署 Centennial Program Addendum,使用 Desktop Bridge 将 Win32 应用转制成 UWP
原文 签署 Centennial Program Addendum,使用 Desktop Bridge 将 Win32 应用转制成 UWP 能上架 Windows 应用商店的并不一定必须是 UWP 应 ...
- VS 2012: Post build 中使用 Signtool.exe,对于特殊password中字符的处理方法
众所周知,在VS(Visual Studio)里面可以利用post build 进行一些类似于CMD或者批处理的操作. 最近的项目中用到了MicroSoft的SignTool工具,目的是要把一个数字签 ...
- signtool.exe not found
When check the [sign the Xap File] checkbox, build project failed due to signtool.exe not found. Fol ...
- SignTool.exe(签名工具)
水漂收集 -- SignTool.exe(签名工具) =============C#.Net 篇目录============== 签名工具是一个命令行工具,用于用证书对文件进行数字签名,验证文件和时间 ...
- Windows文件居然有解锁一说,并且还会引起SignTool Error,真是昏倒!
I'm running Windows 7 and when I try to run a batch file, it says, "The publisher could not be ...
- Eclipse在Jar形成和应用程序包
最近的熟悉Java语言.在学习过程中Eclipse经常使用再熟悉它.本文简单说下Jar形成和应用程序包. Java在Jar相当于包C/C++该lib库,它是.class文件打包:经常使用Jar包有AP ...
随机推荐
- SSH免密码登录Linux服务器
作者:荒原之梦 原文链接:http://zhaokaifeng.com/?p=587 操作环境: 客户机操作系统:Ubuntu Linux 服务器操作系统:CentOS Linux 免密登陆的原理: ...
- C++/C实现各种排序算法(持续更新)--冒泡排序,选择排序,归并排序
2018 3 17 今日总结一下C++中的排序算法: 1冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是 ...
- AWS的区域和可用区概念解释
AWS的每个区域一般由多个可用区(AZ)组成,而一个可用区一般是由多个数据中心组成.AWS引入可用区设计主要是为了提升用户应用程序的高可用性.因为可用区与可用区之间在设计上是相互独立的,也就是说它们会 ...
- WebSocket和Socket
WebSocket和Socket tags:WebSocket和Socket 引言:好多朋友想知道WebSocket和Socket的联系和区别,下面应该就是你们想要的 先来一张之前收集的图,我看到这张 ...
- border-radius 圆角
border-radius:3px; 参数的单位可以使绝对的像素px,也可以用相对单位%; 参数顺序是左上角,右上角,右下角,左下角. 圆角: div{width: 100px;height: 10 ...
- Java注解Retention、Documented、Target的含义
Retention注解 Retention(保留)注解说明,这种类型的注解会被保留到那个阶段. 有三个值: 1.RetentionPolicy.SOURCE -- 这种类型的Annotations只在 ...
- public_handers.go
package],,) ],,) ]:],,);:],],,) ) ]],,) )) ,) )) if etagMatch { w.WriteHeader(ht ...
- C++中memset()函数的作用
memset()函数可以对大内存的分配进行很方便的操作(初始化),所谓“初始化”,当然是指将你定义的变量或申请的空间赋予你所期望的值, 例如语句int i=0;就表明定义了一个变量i,并初始化为0: ...
- 遥远的国度 bzoj3083
分析: 这个题一看就是裸的树剖... 唯一值得考虑的就是它的根一直在变化,我们可以这样想,如果假根在这个点的子树外,那么直接将这个点的子树作为答案区间,如果在子树内,则相对复杂,我们假设son为roo ...
- MySql-两阶段加锁协议
此篇博客主要是讲述MySql(仅限innodb)的两阶段加锁(2PL)协议,而非两阶段提交(2PC)协议,区别如下: 2PL,两阶段加锁协议:主要用于单机事务中的一致性与隔离性. 2PC,两阶段提交协 ...