.NET ClickOnce签名导致“未知发布者”

时间:2015-05-08 20:24:39

标签: .net clickonce manifest authenticode

我正致力于在.NET 4.5上部署ClickOnce Application构建 以下是事实:

  1. 我有一个有效的Comodo Authenticode证书
  2. 证书安装在我的本地证书商店
  3. “签名”选项卡的项目属性显示证书应该用于签署清单(我还没有尝试签署.NET程序集)
  4. 为comodo输入了正确的时间戳服务器URL
  5. 在“发布”标签上,设置非常典型:
  6. 发布到UNC路径
  7. 安装文件夹是映射到IIS中该路径的URL
  8. 但是,无论我做什么,当我使用“立即发布”按钮实际发布ClickOnce应用程序时,所有文件都会被发布,但是当我下载“Setup.exe”时,它总是说“未知”出版商”。

    关于我做错的任何想法?我已经研究了几个星期,我已经阅读了足够的信息,我正在“正确”地做到这一点,但我必须错过一些小的复选框或设置,或者当然。

    任何帮助表示感谢。

    - W.G。

5 个答案:

答案 0 :(得分:4)

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

获取&#34; Unknown Publisher&#34;替换为您的组织名称,您必须在.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>

要获取我已在机器上安装的证书的哈希码(&#34; 0c0ff5 ...&#34;上面),我

  1. Ran certmgr.msc并打开证书 - 当前用户&gt;个人&gt; 证书
  2. 双击我想要的证书,然后点击“详细信息”标签
  3. 使用Ctrl-C复制Thumbprint的值(看起来像&#34; 0c f0 f5 ...&#34;),除了第一个字符。这个文本框中有一个不可见的字符,它与第一个字符一起被复制,稍后它会弄乱你的脚本。因此,手动键入第一个字符(在这种情况下为&#34; 0&#34;),然后粘贴此对话框中的值。如果您收到错误,&#34;无效的SHA1哈希格式:?0c 0f f5 ...&#34;在Visual Studio中,该问号意味着隐形角色就在那里。
  4. 手动键入第一个字符,然后粘贴此对话框中的值。删除所有空格,使其看起来像0c0ff5 ...,并使该行看起来像上面的SigningCertificateCriteria代码。
  5. 你也可以手动使用SignTool.exe,但对我来说,这个设置在每次编译时都会透明地运行。

答案 1 :(得分:0)

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

其次,将证书导入MMC控制台上的“受信任的根证书颁发机构”文件夹。

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

我希望它有所帮助。

由于

答案 2 :(得分:0)

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

enter image description here

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

Make sure publisher name matches who the code signing certificate was issued to

答案 3 :(得分:0)

就我而言,我使用的是旧的 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\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

答案 4 :(得分:-1)

没有那么复杂。

第一,您只需要使用证书对清单进行签名即可。

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

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

3rd ,您可以再次将证书安装到客户端PC上的“受信任的发布者”存储中,然后该发布者是受信任的发布者,您将不再得到提示,安装即会发生。 / p>

希望这可以帮助仍然面临问题的人。