使用代码签名证书标记已下载的MSIs和建立IE9 SmartScreen信任

[原文发表地址] Using Code Signing Certificates to sign downloaded MSIs and build reputation with IE9 SmartScreen

[原文发表时间] 2011-06-27 11:39

首先,我想说,如果你希望很多人下载,千万别忘了在标题中显示“HTML5”,“支持”和“更新/升级”。那些研发Diablo 3的人如果把它称作"Diablo 3 HTML5 Support Update",我相信会有更多数以万计的人去下载的。

就是说,Web平台和工具团队中的一队人为Visual Studio 2010编辑器创建了支持HTML5的Web标准升级包

这个Web标准升级是团队中任何人都能发布的,只需将Visual Studio用标准方法扩展开来。和其他在Visual Studio Extension Gallery中的大部分扩展一样,它并没有被“签名”。它不是微软的正式项目,而是我们一群人利用闲暇时间为社区而做的。至于它为什么会被关注,是因为它支持HTML5和CSS3。

在短短四天之内它就成了Visual Studio Gallery中最热门的,显然,很多人都想要它。去NuGet获取吧!;)

这就是麻烦的根源。它在报刊中被谈论,就好像是种“过失”一样。我承认我们(我占主导)在这方面很逊,没能从一开始就讲清楚这个升级只是一个内部团队升级。可以说,这不是正式的,不过我们倒是很希望在下一版Visual Studio升级时能有官方支持。

由于所有的MSI都没有被签名,你用IE9下载MSI 安装器时,会收到这样的消息:

Do you want to Run or Save this MSI?

这很正常,而且挺可爱的。然后会跳出这样一个令人毛骨悚然的红色警示条(是由另一个gallery item发出的):

SmartScreen Red (BAD) Bar

这是IE9的SmartScreen系统在警告我们,这不是经常下载的项目。实际上,这是IE9一个非常有用的功能,并且在现有的浏览器中独一无二。它使用一些特别的辅助(一些推断,数理,十进制)来公正地判断此项下载。就算是来自Microsoft.com网站的,也一视同仁。SmartScreen是公正的,没有看见过的,一律不信任

更新:就像我刚刚的测试那样,SmartScreen现在将我们的下载认定为是安全的!

此时,如果我点击 继续 ,会看到这个。(没错,我知道这些截图不是所有都符合标准。)

 (38)

实际上,对大多数人来说,他们甚至还不能点击“总是运行”。他们必须点 更多选项来看见总是运行按钮。(如果我是开发者型而且一直点更多选项,我要么很清楚我在做什么,要么我喜欢冒险。更多选项会在几次下载之后保持打开状态。这会省下我点击的次数,但其他的警告仍然存在。)

作为发布者,我们有一些选择。我们可以用微软代码证书来签名二进制文件(MSIs),但是这就需要高管签字明确声明微软官方发布此代码。这是件大事情。介于这并不是官方发布,像这样的情况,我们就不能用微软来签名。代码签名证书保证了文件不被篡改,且有已知的通过验证的组织或个人担保

最后SmartScreen会识别出我们的MSI很安全,但我们不知道这需要花费多久。可能是几周,也可能是几个月,这要视情况而定。不管怎样,无论你是个人还是小公司,你都得为你的代码签名。比如,如果我下载了 Eric Lawrence的Fidder或者Rick Brewster的Paint.NET,他们都是签过名的,我可以在用户帐号控制(UAC)对话中找到他们的名字。我可以点击查看他们的证书,这样就知道我在下载的文件是有人担保的。

记得去Authenticode Code Signing看看Eric Lawrence超赞的文章,很细致而且绝对值。

获取代码签名证书

我是在InstantSSL.com获取的代码签名证书。当然还有其他很多种选择,都是一样的。虽然很贵,包年180美元或者一次性包3年,每年166美元,但我可以用它做很多其他的事情。

在此过程中,无论你选择哪个,都会有些小陷阱。

ž 登记注册证书的时候要用同一台电脑,同一操作系统,同一浏览器(最好是IE,这个可不是开玩笑的)。这是因为,一半的证书(证书所需的证书)在你申请证书的时候生成了,而在你真正获取了证书时他们会自动匹配。

ž 留邮政箱或者企业地址,或者向他们申请技术支持去除你的地址项。否则你完整的信息就会出现在证书上。

ž 你得向他们证明你是谁。现在往下继续。

你得证明你就是真正的你。我申请时提供给他们的审查人员以下证件:护照首页复印件,驾照复印件,两张水电费账单复印件(上面的电话地址与我信用卡地址相符)。他们还打了我水电费帐单上的电话号码以确认是不是我本人。这很麻烦,需要一点时间,他们并没有拖拉。对你们使用者来说,这是件好事,不过对我这个提供者来说就烦了。不过总的来说这是件好事。

Certificate Manager with my new Cert

我的证书出来的时候,我得将其输出,连同其所有信息和强密码存放在安全的位置。这是独一无二的,必须保护起来。

代码签名

一旦证书出来,实际的签名就不难了。这里是命令代码,使用Visual Studio自带的signtool.exe就行。当然你也可以分开下载。

C:\DEV> signtool sign /t https://timestamp.comodoca.com/authenticode /f "C:\DEV\HanselmanCODESIGNINGCERT.pfx" /p SecretPassword '.\MySpecial.msi'Done Adding Additional StoreSuccessfully signed and timestamped: .\MySpecial.msi

如果谁试着去下一个新签名的MSI,他会看到这样一个稍稍有点吓唬人的黄色条。什么?我的签名代码没有免费通行证?

SmartScreen Yellow Bar

嗯,就像有了SSL证书不会让我有银行的信誉,同样,代码签名证书也不会让我看上去更值得信任。

HTTPS的SSL证书保证的是隐私,而不是信任。

那就是为什么还要有EV SSL证书。

代码签名证书保证的是身份,而不是信任。

它保证这是我,但你得决定你要不要信任我。

如果你现在点击动作 ,你会看到我的名字显示在出版商中,你可以验证证书然后决定要不要信任我。但是SmartSreen还并不信任我。为什么呢?

My code signing certificate in the Run Dialog

因为我的证书,不像微软的已经建立其信誉。 "Scott Hanselman"的代码签名证书要赢得信任,就像Rick Brewster和Eric Lawrence以及其他已建立信誉的共享软件或免费软件开发者一样。不过,有这样的MSI签名意味着你知道它背后有我(还有Mads,Vishal以及其他为这个MSI服务的人)的支持。希望不久后(几天几周的下载后)SmartScreen可以信任我们,这样就能让我们以后签名的项目更快地被信任。那时,我的签名代码就会被信任,你就不会在下载时被SmartScreen跳出来的框框吓到了。

记住,代码签名证书,Windows体验和UI运行签名的MSI和EXEs都是独立于SmartScreen的,他们齐心协力,互相扶持。去他们的团队博客和常见问题(FAQ )了解更多有关SmartScreen的详情

希望这些对你有帮助!浏览Smart。思考一下你下载的东西以及你所信任的人。

*现在看来,SmartScreen好像信任我了!