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

时间:2017-08-07 20:46:23

标签: visual-studio ssl certificate visual-studio-2017

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

这是我买的 - 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

原来我想在你买一个之前,他们无法回答这个问题。他们只是说“买它并尝试它,如果它不起作用,我们会把钱还给你。”

有没有人知道如何从Visual Studio签名安装?

我希望能够签署此安装并使其正常运行。

2 个答案:

答案 0 :(得分:4)

在DigiCert的支持下花了很多时间在手机上,我们终于想出了一个有效的流程。

在这种情况下,最不明显的是你最终做了很多代码签名。

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

但即使在那之后,您还必须重新签署设置文件两次以使这一切全部工作!

在花了大量时间之后,我现在有了一个批处理文件来完成最后的步骤,包括将安装文件同步到Amazon S3进行部署。

所以我就是这样做的:

  1. 安装USB加密狗后,设置“签名” 您在Visual Studio中的应用程序部分引用正确的 证书。
  2. 右键点击您的项目,然后点击Build(或Rebuild即可 安全)你必须使用加密狗签名。
  3. 现在,右键单击该项目并选择Properties
  4. Properties内,转到Signing并确认您有。{1}} 选择了正确的证书如果您跳过此步骤,该应用程序将不会 安装。
  5. 仍在Properties内,请转到Publish并确保设置 您的发布位置和安装文件夹。我使用的是亚马逊S3 用于安装文件夹。
  6. 点击Publish Now。它会要求你再次签名。
  7. 现在,你会想到你已经完成了......但你不是。

    1. 接下来你需要的是.p12证书。我联系了 DigiCert的支持,他们能够免费给我一个(问题 因为我遇到这么多问题所以只有一年了。这是 与EV证书不同。
    2. 获得.p12证书和EV后,我运行以下批次 例程,将setup.exe文件签署为TWICE(一次使用.p12然后 再次使用EV)并推送到Amazon S3。
    3. 这是我的SignDeploy.bat文件:

      echo off
      cls
      echo Signing setup.exe with .p12 Certificate File
      "C:\Program Files (x86)\Windows Kits\10\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\10\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 :(得分:1)

要签名什么以及为什么

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

值得注意的

过去,就安全性而言,Authenticode比Mage前进得更快:Authenticode需要签署SHA256摘要,而Mage仅支持SHA1摘要。因此,有时需要对同一文件签名两次。参见full topic here

但是,这似乎是过去的问题。


如何进行

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

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