在 Visual Studio 2017 年使用 EV 证书签署 VSTO 代码

Signing VSTO Code with EV Certificate on Visual Studio 2017

我在 Visual Studio 2017 年有一个 VSTO 程序。为了使安装过程 运行 在我通过 ClickOnce 发布并将文件托管在网络上时更顺利,我购买了 EV 证书来自 DigiCert。

这是我买的 - https://www.digicert.com/code-signing/ev-code-signing/

所以我等了几天,得到了我的 USB 令牌,设置了一切,现在当我用我喜欢的新证书签署应用程序时...安装完全失败。

用户得到的错误是: Customized Functionality in this application will not work because the certificate used to sign the deployment manifest for AppName or its location is not trusted. Contact your administrator for further assistance.

我联系了 DigiCert 寻求技术支持,他们基本上说这是 Visual Studio 2017 和操作系统的错误。

然后我打电话给 Entrust 看他们是否可以确认,因为他们也有 EV 证书: https://www.entrust.com/code-signing-certificates/#ev-code-signing-certificates

结果我猜直到你买了一个,他们才能回答这个问题。他们只是说 "buy it and try it and if it doesn't work we'll give you your money back."

怎么可能没有人知道如何从 Visual Studio 签署安装?

我希望能够签署此安装并让它运行。

在 DigiCert 的支持下 phone 花费了大量时间后,我们终于找到了一个可行的流程。

在这种情况下并不明显的是,您最终会进行大量的代码签名。

因此,当您构建 VSTO 应用程序时,您使用 EV 证书对代码进行签名。然后,当您想要发布(使用 ClickOnce)时,您将不得不重新签名。

但即使在那之后,您还必须再对设置文件重新签名两次才能使这一切正常工作!

在这上面花了很多时间之后,我现在有了一个批处理文件来执行最后的步骤,包括将设置文件同步到 Amazon S3 以进行部署。

我是这样做的:

  1. 安装 USB 加密狗后,您可以设置 "Signing" Visual Studio 中的应用部分以引用正确的 证书.
  2. 右键单击您的项目并单击 Build(或 Rebuild 安全),您将必须使用加密狗进行签名。
  3. 现在,右键单击该项目并选择 Properties
  4. Properties 内转到 Signing 并确认您有 选择了正确的证书。如果您跳过此步骤,该应用将不会 安装。
  5. 仍在 Properties 内,转到 Publish 并确保设置 您的发布位置和安装文件夹。我使用亚马逊 S3 安装文件夹。
  6. 点击Publish Now。它会要求你重新签名。

现在,你会认为你已经完成了......但你没有。

  1. 那么您接下来需要的是 .p12 证书。我联系了 DigiCert 支持,他们可以免费给我一个(可能 仅仅一年)因为我遇到了很多问题。这是 不同于EV证书。
  2. 在您获得 .p12 证书和 EV 之后,我 运行 下面的批次 例程,它对 setup.exe 文件签名两次(一次用 .p12 然后 再次与 EV 一起使用)并且还推送到 Amazon S3。

这是我的 SignDeploy.bat 文件:

echo off
cls
echo Signing setup.exe with .p12 Certificate File
"C:\Program Files (x86)\Windows Kits\bin\x64\signtool.exe" sign /tr http://timestamp.digicert.com /td sha256 /fd sha256 /f [LOCATION OF P12 FILE] /p [PASSWORD] [LOCATION OF SETUP.EXE]
pause
echo Signing setup.exe with EV Certificate from Store
"C:\Program Files (x86)\Windows Kits\bin\x64\signtool.exe" sign /tr http://timestamp.digicert.com /td sha256 /fd sha256 /sha1 [EV HASH FROM DIGICERT] [LOCATION OF SETUP.EXE]
pause
echo Dry run on syncing files up to S3
aws s3 sync [LOCAL DEPLOYMENT FOLDER] [S3 BUCKET AND FOLDER LOCATION] --acl public-read --dryrun
echo  
echo If that worked, it's time to send them up for real.
echo Control-C to stop now, or...
pause
aws s3 sync [LOCAL DEPLOYMENT FOLDER] [S3 BUCKET AND FOLDER LOCATION] --acl public-read
pause

完成这一切之后(我认为您最终总共输入了 3 次 EV 证书密码)从指定位置(必须与您的应用中指示的相同)下载 setup.exe 的用户将能够安装和 运行 您的 VSTO 应用程序。

在客户端的安装过程中,我们遇到了其他问题 运行,但使用上述过程解决了签名问题。

我不会假装理解为什么这需要签名这么多次,也不会从内部顺利运行这没有意义 Visual Studio。 DigiCert 试图让我使用 Build Events 来执行此操作,但它不起作用 b/c BUILD 而非 PUBLISH 两侧的那些进程 运行。我们需要的是 Publish Events,我认为它不存在。

我已经探索了使用 MsBuild.exe 的更长更复杂的命令行过程的想法,但是很难以这种方式完成 Automatically increment revision with each release 部分。

也许这里有人知道如何设置它。我的过程仍然有点手动,但在这一点上它似乎可以可靠地工作,所以我不想把它弄得太多。

签署什么以及为什么

  1. Visual Studio 依靠 SignTool 来签署它构建的应用程序的 Setup.exe。这是因为 Windows 将在安装新应用时 运行 进行完整性检查。这是 Authenticode 技术,适用于任何软件 运行 通过 Windows。
  2. 但是,因为我们在 VSTO 的上下文中,并且因为 Microsoft Office 每次调用时都会验证 COM 加载项的完整性,所以您还需要通过 对项目 DLL 进行签名清单生成和编辑工具。这是 Mage 技术,专用于部署清单,例如 ClickOnce 所依赖的论文。
  3. 因为我们是在ClickOnce部署的上下文中,你还需要对部署清单进行签名,这保证了link到包含安装文件的远程位置是合法的。这是法师技术。
  4. 最后,ClickOnce 还需要签署应用程序清单;即,发布中包含的所有文件的列表(setup.exe / 主 DLL,以及支持 DLL 等其他必要条件)。这是法师技术。

值得注意

以往在安全方面Authenticode比Mage走得更快:SHA256摘要需要Authenticode签名,而Mage只支持SHA1摘要。因此有时需要对同一个文件签名两次。参见

然而,这似乎是过去的问题。


如何进行

我正在使用 Sectigo 提供的 EV 代码签名加密狗。 要通过 ClickOnce 签署和发布解决方案,我所要做的就是:

  1. 运行 SafeNet 身份验证客户端工具
  2. 插入加密狗并确保它出现在 SafeNet 客户端中
  3. 在 Visual Studio(此处为 VS 2017)中,转到 Project / Properties / Signing 并从商店中选择 [Select...]
  4. 发布解决方案(发布选项卡,点击[立即发布])
  5. SafeNet 将要求您提供签名证书密码。请注意,有时您可能需要输入两次密码,不知道为什么。
  6. 解决方案已完全发布,上述所有相关文件均已签署。