.NET ClickOnce 签名结果 "Unknown Publisher"

.NET ClickOnce Signing results in "Unknown Publisher"

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

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

但是,无论我做什么,当我使用 "Publish Now" 按钮实际发布 ClickOnce 应用程序时,所有文件都会发布,但是当我下载 "Setup.exe" 时,它总是说 "Unknown Publisher".

对我做错了什么有什么想法吗?我已经对此进行了数周的研究,并且我已经通读了足够多的内容,以至于我相信我正在这样做 "correctly",但我一定是遗漏了一些小的复选框或设置,或者当然是某些东西。

感谢任何帮助。

-- W.G.

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

然后将证书导入 MMC 控制台上的受信任的根证书颁发机构文件夹。

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

希望对您有所帮助。

谢谢

据我所知,"Unknown Publisher" 键关闭了代码签名,Visual Studio 没有为其提供接口。哦,它 有签名接口,但仅用于清单签名和强名称程序集签名。 This other question 也提到了三笔签约。

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

  <!-- 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 中出现错误 "Invalid SHA1 hash format: ?0c 0f f5...",则该问号表示存在不可见字符。
  4. 手动键入第一个字符,然后粘贴此对话框中的值。删除所有空格,使其看起来像 0c0ff5...,并使该行看起来像上面的 SigningCertificateCriteria 代码。

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

没那么复杂。

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

2nd,您需要将该证书安装到 "Trusted Root Certification Authorities" 存储在您的客户端 PC 上,这可以通过检查您的证书详细信息然后按照向导进行安装来完成,请确保您选择了正确的商店。

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

3rd,您可以再次将证书安装到"Trusted Publisher"存储在您的客户端PC上,然后发布者是受信任的发布者,您将不再得到提示,安装将会发生。

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

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

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

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

旧代码:

<Target Name="BeforePublish">
<Exec Command="&quot;C:\Program Files (x86)\Windows Kits\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\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