【问题标题】:Why can I avoid having to sign a referenced dll by signing the exe post build?为什么我可以通过签署 exe post build 来避免签署引用的 dll?
【发布时间】:2015-03-07 02:13:33
【问题描述】:

我正在开发一个 ClickOnce 应用程序,现在我想使用从 Comodo 获得的证书进行签名,只是为了避免在用户安装它时出现“未知发布者”警告(现​​在还有 SmartScreen 禁令)。

我设法在 Visual Studio 中的 Project -> Signing -> Sign the ClickOnce manifests 中签署了 ClickOnce 清单。但是由于几个错误,无法通过使用我的 Comodo 证书检查 签署程序集 复选框来签署程序集。然后我用 Visual Studio 生成的测试证书对其进行了测试,我收到一条错误消息,告诉我“程序集生成失败 -- 引用的程序集 'blah.dll' 没有强名称”。显然,即使我能够使用我的实际证书签署我的程序集,我也需要签署 dll。

然后我读到here,您可以通过在构建后命令行中输入以下内容来签署您的程序集:"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe" sign /f "$(ProjectDir)actual_cert.pfx" /p password /v "$(ProjectDir)obj\x86\$(ConfigurationName)\$(TargetFileName)"。这也摆脱了未签名引用的 dll 错误。

我将我的应用程序发布到一个测试位置,并且所有 3 个(或 2 个?)警告对话框都显示了我作为发布者的名称(我知道用户需要多次安装我的应用程序才能摆脱 SmartScreen 的问题)。所以一切似乎都很好。这正是我担心的,因为 dll 没有签名。

这是一个最终会适得其反的黑客行为吗?即使用户多次安装我的应用程序,SmartScreen 的东西是否永远不会消失,因为 dll 没有强名称?还是一切都会好起来的?如果是这样,为什么 Visual Studio 不让您使用未签名的 dll,如果它实际上是可能的。

【问题讨论】:

  • 我只关心使用 signtool 进行 Authenticode 签名,而不是点击清单/强命名。您尝试在哪些文件上使用 signtool?没有 signtool 正确签署您的 DLL?当我签署我的 DLL 时,我注意到只有在我没有签署的 .exe 上,浏览器在下载文件时显示警告,或者 Windows 显示有关未知发布者的警告。不签署 Dll 不会影响这些警告是否出现。
  • 是的,在我看来,它也只显示 EXE 的警告,而不显示引用的 DLL。但是我很好奇as any programmer would,如果我在构建后使用signtool 对其进行签名,为什么Visual Studio 不允许您引用未签名的DLL 而能够做到这一点。喜欢是出于某种原因我不应该做的事情。
  • 我对在 VS 中签署程序集不是很熟悉,因为我主要使用 signtool 来签署我的 C++ exe 和 DLL。但似乎问题在于您无法签署 DLL,因为它不是强命名的?如果你把它命名为强名称,它会起作用吗?

标签: visual-studio visual-studio-2013 clickonce code-signing authenticode


【解决方案1】:

签署程序集和签署点击一次清单实际上是两件不同的事情。您无法签署具有未签名引用的程序集,因为这就是强名称在 .net 中的工作方式,并且它将使用不同的工具 (sn.exe) 在命令提示符下执行此操作

What is a "STRONG NAME" in .NET?

对强大的命名意味着什么有一个很好的答案。

在清单中对点击进行签名实际上只是添加了验证码签名并且是无关的,通常作为发布者,您希望您的验证码签名的可执行文件也被强命名以限制对被替换的 dll 的暴露。

因此,您可以在非强命名程序集上使用 signtool 的原因是该工具不需要这样做,但无论如何这样做可能是个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多