我应该对第三方DLL(例如JSON.NET)进行数字签名吗?

13

我有一个应用程序,使用了各种第三方库,例如JSON.NET。

我想确保构成我的应用程序的所有DLL都是数字签名的,包括第三方的。鉴于这些不是由作者签名的,我是否可以/应该自己签署第三方的DLL?

2个回答

21

我刚试图在互联网上寻找同样问题的答案,但没有成功。

结果我做的是检查了一下谷歌或Adobe如何交付他们的产品,并发现他们文件夹中的每个二进制文件都被签名,包括第三方的。

以下是一些例子:

  1. Google Chrome包括pepflashplayer.dll,这是由Adobe版权所有,但由“Google Inc.”数字签名。
  2. Adobe Reader包括icudt40.dll,这是由IBM版权所有,但由“Adobe Systems”数字签名。

因此,我认为最佳实践是签署构成您的应用程序的所有二进制文件,包括第三方的。这是有道理的,因为它可以帮助您避免或至少轻松检测到客户机上的篡改。


4
您是在谈论强名称还是Authenticode签名?后者的问题在于,当加载Authenticode签名的程序集时,.NET会验证证书,在某些配置下(例如需要检查OCSP并且无法访问),这可能需要几十秒钟。由于这个原因,我们不得不停止使用Authenticode和X.509证书对程序集进行签名。
另一个缺点是,如果签名程序集被恶意软件以某种方式使用,一些不称职的想要成为专家的杀毒软件公司可能会将程序集标记为恶意软件,并且更糟糕的是,向颁发您代码签名证书的证书机构投诉,导致证书被吊销。
.NET强命名(使用没有证书的密钥对)基本上是您自己的事情。
更新:Authenticode通常应用于PE格式文件(EXE和DLL)、SYS和CAB。强命名是纯.NET技术。
警告消息涉及Authenticode签名。签署安装程序是必需的(这是肯定的),并足以摆脱该消息,除非系统策略设置为仅允许运行已签名的应用程序(在这种情况下,您的应用程序的EXE也必须进行签名)。

@EugeneMayevskiEldoS: 感谢您。嗯,我不确定-这种差异不是我以前知道的。我的目标只是让我的应用程序安装/运行时不会出现任何“此应用程序未经签名”的警告。 - Gary McGill
也许我应该只签署安装程序,而不是 DLL 文件本身? - Gary McGill
10
实际上这并没有回答问题。问题是“是否应该”签署第三方库和应用程序,它并没有询问Authenticode签名的利弊。我从谷歌上找到了这个答案,感到非常失望。 - ldam
@EugeneMayevski'EldoSCorp 提示:如果您的部署中出现证书吊销列表检查超时问题,您可以通过设置非常低的超时时间(默认为20秒)来在本地解决该问题。http://rusanu.com/2009/07/24/fix-slow-application-startup-due-to-code-sign-validation/ - Remus Rusanu
你能完全禁用证书验证并自行进行吗?我们已经自我检查以防篡改。如果需要,我很乐意在第三方DLL上禁用它。 - rollsch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接