windows7 驱动(windows7驱动数字签名)居然可以这样
今年 1 月,微软结束了对 Win7 长达三年的扩展支持(ESU),Win7 已正式走向其生命的终点……
前言今年的 1 月,微软结束了对 Win7 长达三年的扩展支持(ESU),Win7 已正式走向其生命的终点这也意味着,任何和 Win7 有关的问题,都可能永远也没有解决之日了缘起笔者在今年早些时候对旧的驱动代码进行了一些修改,而后相关改动进入了“正常”的编译、打包、测试流程,随后我们发现新的驱动无法在 Win7 系统上运行了。
Win7 无法加载驱动Suprise!!!然而如果咱去实地看一下咱的驱动文件,在资源管理器里右键来查看它的数字签名信息,却发现它签名是 OK 的……
资源管理器验证签名 OKWin7 时代的驱动签名方式 Croos-Sign从「资源管理器」证实我们的驱动有一个 OK 的数字签名证书这一点来看,我们的文件内容本身理应是完好的但是,资源管理器验证的结果可能并不适用于加载驱动时的系统内核。
如果使用 signtool verify /kp 命令去验证那个驱动文件,会得到一个报错信息SignTool Error: Signing Cert does not chain to a Microsoft Root Cert.。
而如果对我修改代码之前的正常驱动使用 signtool verify /v /kp 验证,得到的结果是这样的Cross Certificate Chain: Issued to: Microsoft Code Verification Root。
Issued by: Microsoft Code Verification Root Expires: Sat Nov 01 21:54:03 2025 SHA1 hash: 8FBE4D070EF8AB1BCCAF2A9D5CCAE7282A2C66B3
Issued to: DigiCert Assured ID Root CA Issued by: Microsoft Code Verification Root Expires: Fri Apr 16 03:51:37 2021
SHA1 hash: BA3EA54D72C145D37C255E1EA40AFBC63348B96E Issued to: DigiCert Assured ID Code Signing CA-1
Issued by: DigiCert Assured ID Root CA Expires: Tue Feb 10 20:00:00 2026 SHA1
hash: 409AA4A74A0CDA7C0FEE6BD0BB8823D16B5F1875 Issued to: XXXX Issued by: DigiCert Assured ID Code Signing CA-1
Expires: XXXXXXXXXXXXXXXXXXXXXXXX SHA1 hash: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Successfully verified: .\XXX.sys看来确实是在签名上出了点什么问题而这还得从一种驱动签名方式 Cross-Sign 说起注意到上面 Cross Certificate Chain:。
这一行文本了吗?这意味着这个证书链是使用 Cross-Sign 证书构建出来的原本的证书链是这样的:Signing Certificate Chain: Issued to: DigiCert Assured ID Root CA。
Issued by: DigiCert Assured ID Root CA Expires: Mon Nov 10 08:00:00 2031 SHA1 hash: 0563B8630D62D75ABBC8AB1E4BDFB5A899B24D43
Issued to: DigiCert Assured ID Code Signing CA-1 Issued by: DigiCert Assured ID Root CA
Expires: Tue Feb 10 20:00:00 2026 SHA1 hash: 409AA4A74A0CDA7C0FEE6BD0BB8823D16B5F1875
Issued to: XXXX Issued by: DigiCert Assured ID Code Signing CA-1 Expires: XXXXXXXXXXXXXXXXXXXXXXXX
SHA1 hash: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX这个证书链的根是 DigiCert Assured ID Root CA ,不过可惜的是,加载驱动的内核只信任少许几个微软自己的根证书,
DigiCert Assured ID Root CA 并不在其列上面说过,内核里只有微软自己的根证书,难道所有的驱动签名证书只能由微软来颁发?于是 Cross-Sign 就派上用场了注意上面的 Cross Certificate Chain
中有这样一个证书: Issued to: DigiCert Assured ID Root CA Issued by: Microsoft Code Verification Root
Expires: Fri Apr 16 03:51:37 2021 SHA1 hash: BA3EA54D72C145D37C255E1EA40AFBC63348B96E
原本 DigiCert Assured ID Root CA 是自签的(它是根当然要自签),但现在它多了一个“爸爸”,就是 Microsoft Code Verification Root ,所以构建证书链的时候可以找个两个根。
这另一个根的证书信任路径也叫 「备用信任路径(Alternate trust path)」 通过这一条多出来的路径,加之 Microsoft Code Verification Root 在内核的信任列表中,内核便可以构建出它所期待的信任链了。
因此,有了这个 Cross-Sign 的证书,我们的驱动才能被内核信任而加载那一开始的现象怎么解释?其实在这个问题被发现之前,还发生过一个小插曲,那就是过去用来签名驱动的证书过期了,而后换了一个新证书不巧的是签名的时候没有加上 Cross-Sign 证书。
续不上的签名总算是找到了问题所在,就那个,忘加 Cross-Sign 了嘛,加上不就好了但现在这 Cross-Sign 可不是想加就能加的了咱在用新证书签名的时候,不是咱不想加微软的 Cross-Sign 证书,而是已经没得加了。
2019 年 8 月 1 日,微软宣布结束对驱动代码的 Cross-Sign 支持,它不会再签发新的 Cross-Sign 证书已有的 Cross-Sign 证书大部分都会在 2021 年过期没错,就是 2021 年,咱上面的那个 Cross-Sign 证书也是 2021 年过期的,但为什么直到今年才出现问题呢,2022 年的时候咱也用得好好的?那是因为我们的证书是在 Cross-Sign 证书过期之前出生的,所以它还能享用 Cross-Sign 的便利。
等现有的证书过期之后,就是过了这村儿,再没这店儿了那就"凉拌"?也不尽然HCK在 Cross-Sign 方式之外,还有一种给驱动签名的方式可以在 Win7 上使用,并且也已经存在了相当长的时间HCK 的工作方式是在开发人员的本地搭建出一套测试环境,被测试的驱动通过这套环境的测试后,测试套件便可以在本地给其签名,而后开发人员把已签名的驱动包上传给微软的服务,由微软在线完成最终的签名。
要用 HCK 来签名,首先要准备好环境:一台 Windows Server 2012(必须是英文版),作为测试、签名服务器在服务器上安装 HCK Controller 和 Studio在服务器上部署好可用的
「EV 证书」 签名环境,并可以通过 Certificate Store 来访问(可用 signtool sign /s 来验证)1...N 台 Windows7 设备,作为测试机在测试机上安装 HCK Client,并加入 HCK Controller(详看官方文档)
准备好环境后,接下来开始测试、签名:把驱动安装到测试机上并运行在 HCK Studio 上选择测试机和被测驱动进行测试使用 inf2cat 生成 cat 文件,并使用自己的 EV 证书对 cat 文件进行签名
把 .inf .cat .sys 文件都加入 HCK 工程的驱动文件中从 HCK Studio 中导出 .hckx 文件并同时指定 EV 证书签名把签好名的 .hckx 文件上传到微软等待在线签名流程通过后下载签名后的驱动包
看起来可以解决问题,但 HCK 实际上很不完美一是不是所有驱动都能轻松通过 HCK 测试,甚至有的驱动命中注定无法通过二是其环境部署复杂,需要配备转用软硬件,其对 EV 证书本地部署要求更是增加了成本三是此种方式只能以 SHA256 的方式签出驱动,不能用 SHA1。
而有的 Win7 系统还没有打 SHA256 补丁,也就认不了驱动签名四是前途也未可知微软已结束对 Win7 的支持,HCK 也面临随时被中止的风险,这并不难想象结语这小小的驱动签名,让人越发感到 Windows 7 的光辉已经褪去。
英雄迟暮,而我们的故事已经结束还将继续……
免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186