我有一个使用 AjaxControlToolkit.dll 和 Log4Net.dll 的网站。
当我尝试在 VS 2010 中运行性能分析工具时,它给了我以下警告:
AjaxControlToolkit.dll 已签名并且检测它将使其签名无效。如果您在没有仪器后事件的情况下继续对二进制文件重新签名,则它可能无法正确加载。
现在,如果我选择继续而不重新签名的选项,分析将开始,但程序集不会加载并给出 ASP.NET 异常。
我有一个使用 AjaxControlToolkit.dll 和 Log4Net.dll 的网站。
当我尝试在 VS 2010 中运行性能分析工具时,它给了我以下警告:
AjaxControlToolkit.dll 已签名并且检测它将使其签名无效。如果您在没有仪器后事件的情况下继续对二进制文件重新签名,则它可能无法正确加载。
现在,如果我选择继续而不重新签名的选项,分析将开始,但程序集不会加载并给出 ASP.NET 异常。
如果您在开发机器上执行此操作,您可以使用sn -Vr *
. 如果你这样做,你不必辞职。这种方法可能存在安全风险,但如果您对它感到满意,它比辞职更容易。
具体来说,来自MSDN,它说:
注册程序集以跳过验证。或者,您可以指定以逗号分隔的用户名列表。如果您指定 infile,验证仍然启用,但 infile 中的公钥用于验证操作。可以以 *,strongname 形式指定程序集,以使用指定的强名称注册所有程序集。Strongname 应指定为表示公钥的标记化形式的十六进制数字字符串。查看 -t 和 -T 选项以显示公钥令牌。
以及安全风险:
注意:仅在开发期间使用此选项。将程序集添加到跳过验证列表会产生安全漏洞。恶意程序集可以使用添加到跳过验证列表中的程序集的完全指定的程序集名称(程序集名称、版本、文化和公钥令牌)来伪造其身份。这将允许恶意程序集也跳过验证。
ghusse 链接到给出答案的博客文章。那里描述了答案。正如他所指出的,您必须在每个已签名的程序集中使用仪器后事件。
直接调用最简单sn.exe
:
"C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\sn.exe" -R [pathOfDll] [pathOfSNK]
请注意,[pathOfDll]
它位于与项目关联的目录obj\Debug中。
答案在此处描述。您必须在每个已签名的程序集中使用仪器后事件。
我无法通过安装 VS 2010 使其“按原样”工作。我不得不将此命令行称为每个 dll 上的构建后事件:
"C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" & sn -Ra [pathOfDll] [pathOfSNK]
请注意,[pathOfDll]位于与项目关联的目录obj\Debug中。
对尚未重新签名的已签名二进制文件进行检测的最简单方法是完全禁用签名检查。这是一个机器范围的设置,您可以通过为*
模式注册一个例外来激活它:
sn.exe -Vr *
此命令必须从提升的命令提示符处执行。您将sn.exe
在 SDK 中找到(在我的情况下,我在 中找到它C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin
)。
完成测试后,您应该取消注册异常:
sn.exe -Vu *
否则您的机器可能容易受到恶意代码的攻击,因为即使程序集已被篡改,它们也会受到信任。
探查器可能会更改程序集,因为它以前已签名。显然,您需要添加一个重新签署程序集的仪器后操作。
这可能是一个问题,因为您没有用于签署第 3 方程序集的 sn 文件。
可能在这里采取了懒惰的无学习新事物的方式,但我最终通过编写一个 powershell 脚本来取消签名我的解决方案中的所有项目来解决这个问题——工作得很好。作为脚本的一部分,我保存了原始的 csproj 文件,以便之后可以恢复它们。(您也可以撤消源代码管理中的更改)。
应该能够通过调用它通过 -revert 开关来恢复。