关于Authenticode签署UWP appxbundle文件,我面临一个相当有趣的问题.
一些背景信息:客户向我们提供了包含签名证书的SafeNet USB令牌.当然,私钥不可导出.我希望能够将此证书用于我们的自动发布版本以对包进行签名.遗憾的是,令牌需要在每个会话中输入一次PIN,因此,例如,如果构建代理重新启动,则构建将失败.我们在令牌上启用了单一登录,因此足以在会话后解锁它.
当前状态:我们可以在appxbundle上使用signtool而不会出现任何问题,因为令牌已被解锁.这种方法运行良好,但一旦重新启动机器或工作站被锁定就会中断.
经过一番搜索,我找到了这段代码.这将获取签名参数(包括令牌PIN)并调用Windows API对目标文件进行签名.我设法编译它并且它完美地用于签署安装包装器(EXE文件) - 令牌没有要求PIN并且由API调用自动解锁.
但是,当我在appxbundle文件上调用相同的代码时,调用CryptUIWizDigitalSign
失败并显示错误代码0x80080209 APPX_E_INVALID_SIP_CLIENT_DATA
.这对我来说是一个谜,因为在同一个包上调用signtool,使用相同的参数/证书可以正常工作,因此证书应该与包完全兼容.
有没有人有这样的经历?有没有办法弄清楚错误的根本原因(我的证书和捆绑包之间不兼容)?
编辑1
回应评论:
我用来调用API的代码(直接来自前面提到的SO问题)
#include <windows.h>
#include <cryptuiapi.h>
#include <iostream>
#include <string>
#pragma comment (lib, "cryptui.lib")
const std::wstring ETOKEN_BASE_CRYPT_PROV_NAME = L"eToken Base Cryptographic Provider";
std::string utf16_to_utf8(const std::wstring& str)
{
if (str.empty())
{
return "";
}
auto utf8len = ::WideCharToMultiByte(CP_UTF8, 0, str.data(), str.size(), NULL, 0, NULL, NULL);
if (utf8len == 0)
{
return "";
}
std::string utf8Str;
utf8Str.resize(utf8len);
::WideCharToMultiByte(CP_UTF8, 0, str.data(), str.size(), …
Run Code Online (Sandbox Code Playgroud)