【发布时间】:2020-08-15 04:09:07
【问题描述】:
我正在尝试生成适合签署 Microsoft 通用 Windows 平台 (UWP) 应用程序的证书。我有一份我自签名的有效证书,以及一份由我公司的内部证书颁发机构根据我制作并提交给他们的 CSR(证书请求)文件颁发的证书。
为了生成自签名证书,我使用了以下 powershell 命令
New-SelfSignedCertificate -Type Custom -Subject "<full certificate DN>" -KeyUsage DigitalSignature -FriendlyName "MyFriendlyName" -CertStoreLocation "Cert:\CurrentUser\My" -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}")
为了生成我们内部 CA 颁发的证书,我创建了一个具有相同属性的 CSR:
KeyUsage: Digital Signature
ExtendedKeyUsage: CodeSigning (1.3.6.1.5.5.7.3.3)
2048 bit key
algo: AES-SHA256
其他大多数属性都是默认的。
正如我所说,自签名证书有效,CA 颁发的证书不会被 Visual Studio 接受。这是我在尝试分配 CA 颁发的证书进行签名时遇到的错误:
清单设计器无法导入证书。 您选择的证书对签名无效,因为它是 要么过期,要么有其他问题。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkID=241478.
编辑 - 注意:CA 根证书和中间证书安装在相应证书存储中的计算机上
以下是并排的证书属性。 有什么方法可以知道失败的证书具体出了什么问题?我觉得我已经满足了所有 UWP 签名要求。
更新
事情变得陌生。这些步骤有效:
- 右键单击并从解决方案资源管理器“发布”我的 UWP 应用
- 选择在发布时不对包进行签名
- 使用 SignTool.exe 通过命令行对包进行签名,为我的 CA 颁发的证书使用正确的指纹 (SHA),它可以工作!
这是我的 SignTool 命令行:
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64\signtool.exe" sign /v /fd sha256 /sha1 <my CA-issued cert thumbprint> "path-to-my-unsigned.msix"
使用 /v(详细)从 Signtool 输出:
The following certificate was selected:
Issued to: <my org>
Issued by: <my internal CA name>
Expires: Mon Apr 30 11:41:36 2035
SHA1 hash: <CA-Issued cert hash>
Done Adding Additional Store
Successfully signed: path-to-my-app.msix
Number of files successfully Signed: 1
Number of warnings: 0
Number of errors: 0
所以问题仍然存在,为什么 Visual Studio 不接受我的 CA 颁发的证书作为有效的签名证书,即使我可以使用它通过 SignTool.exe 手动签名?
结束更新
【问题讨论】:
-
我已在Microsoft Q&A 上回复您。请检查一下。
-
基本约束需要为端实体或缺失;否则,您有一个证书用于颁发其他证书,而不是用于实际签署代码。无法判断它是否丢失。
-
@Peter Torr - 显示两个证书的所有属性。我会三重检查,但我 99.999% 确定 CA 颁发的证书缺少基本约束。我确保在屏幕截图中捕获所有证书属性
-
证书存储区 - CSP 和 CNG 有区别吗?运行
certutil -verifystore -user MY {serialNumber}以获取如下输出:Provider = Microsoft Platform Crypto Provider...许多应用程序仍然存在基于CNG的证书的问题... -
结果:“Provider = Microsoft Software Key Storage Provider”
标签: uwp certificate code-signing