【问题标题】:.NET ClickOnce Signing results in "Unknown Publisher".NET ClickOnce 签名导致“未知发布者”
【发布时间】:2015-05-08 20:24:39
【问题描述】:

我正在部署基于 .NET 4.5 的 ClickOnce 应用程序 以下是事实:

  1. 我有一个有效的 Comodo Authenticode 证书
  2. 证书安装在我的本地证书存储中
  3. “签名”选项卡的项目属性显示证书应该用于签署清单(我什至还没有尝试签署 .NET 程序集)
  4. 为 comodo 输入了正确的时间戳服务器 URL
  5. 在“发布”选项卡上,设置非常典型:
  6. 发布到 UNC 路径
  7. 安装文件夹是映射到 IIS 中该路径的 URL

但是,无论我做什么,当我使用“立即发布”按钮实际发布 ClickOnce 应用程序时,所有文件都会发布,但是当我下载“Setup.exe”时,它总是显示“未知”出版商”。

关于我做错了什么有什么想法吗?我已经对此进行了数周的研究,并且我已经阅读了足够多的内容,以相信我正在“正确”地做这件事,但是我只是缺少一些小复选框或设置,或者当然是某些东西。

任何帮助表示赞赏。

-- W.G.

【问题讨论】:

  • 我找到了它无法签署清单的原因。我们的证书被吊销了。发布过程中没有来自 Visual Studio 的消息,但是当我尝试手动签署 setup.exe 时,我收到了一般错误。因此,我使用 certutil 来验证我们的证书,并看到该证书显示出来自颁发者的 CRL 的撤销。我们正在与发行人合作找出原因......
  • 我的情况完全一样。但是当我尝试手动签署 setup.exe 时,我没有收到任何错误。与 Visual Studio 的结果相同。一切都很好。但我仍然得到“未知出版商”。我只对 ClickOnce 清单进行签名,并且我仔细检查了“发布”选项卡中的“发布者名称”是否正是证书中的名称。 @Arin 的回答对我没有用。有什么想法吗?

标签: .net clickonce manifest authenticode


【解决方案1】:

据我所知,“未知发布者”关闭了代码签名,Visual Studio 没有为其提供接口。哦,它确实具有签名接口,但仅用于清单签名和强名称程序集签名。 This other question 也提到了三个签约。

要将“未知发布者”替换为您的组织名称,您必须在 .csproj 或 .vbproj 文件中添加一些 XML。在结束 </Project> 标记之前,您需要调用 SignTool.exe,我手动将其复制到解决方案的主 Bin 文件夹(如果没有,它是 Windows SDK 的一部分)。这是我的样子:

  <!-- This section is used for code-signing the application. This should not be confused with manifest signing or with strong-name assembly signing, which can both be done from the Visual Studio interface. -->
  <Target Name="SignOutput" AfterTargets="CoreCompile">
    <PropertyGroup>
      <TimestampServerUrl>http://timestamp.verisign.com/scripts/timstamp.dll</TimestampServerUrl>
      <ApplicationDescription>A.Franklin's Awesome App</ApplicationDescription>
      <SigningCertificateCriteria>/sha1 0c0ff5e29404b7d78q2517f487da0b1a0912c4da</SigningCertificateCriteria>
    </PropertyGroup>
    <ItemGroup>
      <SignableFiles Include="$(ProjectDir)obj\$(ConfigurationName)\$(TargetName)$(TargetExt)" />
    </ItemGroup>
    <Exec Command="&quot;$(ProjectDir)..\Bin\SignTool&quot; sign $(SigningCertificateCriteria) /d &quot;$(ApplicationDescription)&quot; /t &quot;$(TimestampServerUrl)&quot; &quot;%(SignableFiles.Identity)&quot;" />
  </Target>

为了获取我已经安装在我机器上的证书的哈希码(上面的“0c0ff5...”),我

  1. 运行 certmgr.msc 并打开证书 - 当前用户 > 个人 > 证书
  2. 双击我想要的证书并单击详细信息选项卡
  3. 使用 Ctrl-C 复制指纹的值(看起来像“0c f0 f5...”),第一个字符除外。这个文本框中有一个不可见的字符,它与第一个字符一起被复制,稍后它会弄乱你的脚本。因此,手动键入第一个字符(在本例中为“0”),然后粘贴此对话框中的值。如果您在 Visual Studio 中收到错误消息“无效的 SHA1 哈希格式:?0c 0f f5...”,则该问号表示存在不可见字符。
  4. 手动键入第一个字符,然后粘贴此对话框中的值。删除所有空格,使其看起来像 0c0ff5...,并使该行看起来像上面的 SigningCertificateCriteria 代码。

您也可以手动使用 SignTool.exe,但对我来说,此设置在每次编译期间都会透明地运行它。

【讨论】:

  • 虽然我确实弄清楚了发布过程无法签署清单的原因,但您已经概述了这是一个非常有用的过程。我将继续将此答案标记为我见过的最佳答案。谢谢!
【解决方案2】:

没那么复杂。

1st,您只需使用您的证书签署清单即可。

2nd,您需要将该证书安装到客户端 PC 上的“受信任的根证书颁发机构”存储中,您可以通过检查您的证书详细信息然后按照向导安装,确保您选择正确的商店。

此步骤会将未知发布者更改为您证书中的名称。(由于发布者现在位于您受信任的根 CA 中,因此它不再是“未知”),但您仍然会收到要求安装确认的提示。

3rd,您可以再次将证书安装到您客户端PC上的“Trusted Publisher”商店,然后发布者是受信任的发布者,您将不再收到提示,安装会发生。

希望这对仍然面临问题的人有所帮助。

【讨论】:

    【解决方案3】:

    检查您的应用程序清单是否用于信任信息(即发布者名称)。如果是,请确保发布者名称与颁发证书的人完全匹配。如果不匹配,您将收到“未知发布者”问题。此设置位于 Visual Studio 中的“发布”选项卡中。单击“选项...”按钮,然后单击“清单”列表项。

    尝试取消选中“使用应用程序清单获取信任信息”并重新发布以查看问题是否已解决。如果您确实需要选中该选项,请单击“描述”选项卡并确保“发布者名称”值与代码签名证书颁发给的名称的值完全匹配。

    【讨论】:

      【解决方案4】:

      就我而言,我使用的是旧 Comodo 的时间戳服务器。截至目前,Comodo 现在是 Sectigo,他们对时间戳服务器进行了更改,所以现在他们默认使用 RFC3161 而不是 Authenticode。所以我只需要更改 Signtool.exe 参数以适应新服务器,使用新 url 将参数 /t 更改为 /tr,并添加参数 /td 以指定哈希算法。此更改是在 &lt;/project&gt; 结束标记之前编辑 .csproj 文件进行的。

      旧代码:

      <Target Name="BeforePublish">
      <Exec Command="&quot;C:\Program Files (x86)\Windows Kits\10\App Certification Kit\signtool.exe&quot; sign /f &quot;$(ProjectDir)MyCert.p12&quot; /t http://timestamp.comodoca.com/authenticode /p CertPassword /v &quot;$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)&quot;" />
      

      新代码:

      <Target Name="BeforePublish">
      <Exec Command="&quot;C:\Program Files (x86)\Windows Kits\10\App Certification Kit\signtool.exe&quot; sign /f &quot;$(ProjectDir)MyCert.p12&quot; /tr http://timestamp.sectigo.com /td SHA256 /p CertPassword /v &quot;$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)&quot;" />
      

      来源: Sectigo's Timestamp Server Info

      【讨论】:

        【解决方案5】:

        首先,您必须发布到 IIS 中的网站,而不是 UNC 路径。发布到站点指向的文件夹。

        第二次将证书导入 MMC 控制台上的 Trusted Root Certificate Authorities 文件夹。

        最后,在签署清单时,在 Visual Studio 的“签名”选项卡上选择“从商店中选择”。我得到了这个与测试证书一起使用。

        希望对你有帮助。

        谢谢

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多