为什么我可以通过签署exe post build来避免签署引用的dll?

时间:2015-03-07 02:13:33

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

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

我设法在项目 - >处签署ClickOnce清单签名 - >在Visual Studio中签署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(如果实际可能的话)。

1 个答案:

答案 0 :(得分:1)

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

What is a "STRONG NAME" in .NET?

很好地回答了强烈命名的意义。

签署单击一次清单实际上只是添加authenticode签名并且是无关的,通常您作为发布者希望您的authenticode签名可执行文件也被强烈命名以限制对被替换的DLL的暴露。

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