在没有pfx文件的情况下签署一个Excel / VSTO项目

我有一个结合了C#和Excel的VSTO项目。 我的雇主要求我使用我没有pfx文件的证书签名,我只有芯片卡上的证书。

我已经阅读了大多数在VSTO上签名的手册和问题,但都以某种方式假定我拥有pfx文件。 我在Visual Studio中的设置如下:

  1. “签署ClickOnceManifest”被选中,使用“从存储中select”来select来自芯片卡的证书
  2. “签署Assemly”被检查。 我没有pfx文件,所以我点击“新build”,并创build了一个名为assemblySigningCertificate.pfx的证书(这可能是一个完全虚假的步骤,但这是我得到的唯一一个pfx)
  3. 发布项目后,我运行一个脚本,使用mage.exe更新签名,如

    set AppPublishPath=publish set AppPublishVersionPath=publish\Application Files\diagramUnifier_1_0_0_0 copy bin\Debug\*.dll "%AppPublishVersionPath%" copy bin\Debug\*.dll.config "%AppPublishVersionPath%" copy bin\Debug\*.exe "%AppPublishVersionPath%" mage.exe -update "%AppPublishVersionPath%\diagramUnifier.dll.manifest" -ch "… certificate hash from certmgs.msc " mage.exe -update "%AppPublishVersionPath%\diagramUnifier.vsto" -appmanifest "%AppPublishVersionPath%\diagramUnifier.dll.manifest" -ch "… certificate hash from certmgs.msc " mage.exe -update "%AppPublishPath%\diagramUnifier.vsto" -appmanifest "%AppPublishVersionPath%\diagramUnifier.dll.manifest" -ch "… certificate hash from certmgs.msc " 

一旦完成这一切,我安装VSTO并运行xlsm文件。 我收到一个“SignatureDescription无法从提供的签名algorithm创build”错误指向VSTO文件。 错误的详细信息只提供了一个stackTrace,没有别的。

我的问题是:

  1. 是否有可能签署一个VSTO项目没有证书,我有一个pfx文件?
  2. 如果我没有pfx文件,在设置的“签名程序集”部分创build一个新的证书是正确的
  3. 我在做别的事情吗?

丹尼尔,非常感谢任何帮助

问题:使用selfcert.exe创build证书时,私钥不能导出。 Windows证书控制台的导出向导显示“关联的私钥被标记为不可导出”。

解决scheme版本1:使用带“-pe”选项的makecert.exe创build并存储具有可导出私钥的证书:

makecert -r -pe -n“CN = Your Name”-b 01/01/2000 -e 01/01/2099 -eku 1.3.6.1.5.5.7.3.3 -ss My

然后,您可以从Windows证书存储中导出证书,包括私钥。

注意:旧版本的makecert.exe不支持“-pe”选项。 .NET Framework SDK 2.0和2002年10月版的Platform SDK(内部版本3718.1)包含支持“-pe”选项的新版本的makecert.exe(5.131)。 (.NET Framework SDK 1.0和1.1都包含不支持“-pe”选项的旧版本的makecert.exe)。

解决scheme版本2:可以使用以下命令创build包含自签名证书和相关私钥的PFX文件(PKCS#12):

 makecert -r -n "CN=Your Name" -b 01/01/2000 -e 01/01/2099 -eku 1.3.6.1.5.5.7.3.3 -sv selfcert.pvk selfcert.cer cert2spc selfcert.cer selfcert.spc pvkimprt -pfx selfcert.spc selfcert.pvk 

最后一个命令(pvkimprt -pfx)创build文件selfcert.pfx。 这个PFX文件然后可以被导入到Windows证书存储并用于代码签名。 (makecert.exe和cert2spc.exe是多个Microsoft SDK的一部分,例如Platform SDK或DotNet SDK,它们可以从microsoft.com下载,pvkimprt.exe可以单独从Microsoft下载。

你是说你没有证书的私钥? 如果是这种情况,那么你绝对不能签署程序集/安装程序。 签名的要点是要certificate程序集来自可信/authentication的来源(即证书(私钥)持有者)。

谁是你的雇主? 较大的公司有适当的stream程来获得通过其IT /安全部门签署的安装程序和程序集。 我会仔细检查,你的工作情况并非如此。

另一点…你有没有安装.NET4.5? 看到这里可能有帮助…

这一变化是因为我们在NetFX4.5中停止使用旧版证书作为默认(SHA-1)来签署清单,而是使用新版本(SHA-256),这是NetFx4.0运行时无法识别的。 因此,在parsing清单时,4.0运行时会抱怨无效的清单。 对于传统框架,当我们尝试在没有目标运行时的框上运行ClickOnce应用程序时,ClickOnce会向用户popup一条消息,提示您“需要xxxx.xx运行时才能运行此应用程序”。 但是从.NET 4.5开始,如果在安装了.NET 4.0的机器上运行4.5 ClickOnce应用程序,则该消息会抱怨无效的清单。 为了解决此问题,您必须在目标系统上安装.Net Framework 4.5。