1. 简介
使用HCK(Hardware Certification Kit)签名的驱动,适用于win7及以上的操作系统;
使用HLK(Hardware Lab Kit)签名的驱动,适用于win10及以上的操作系统。
HCK和HLK是一个测试工具框架,对不同设备类型的驱动提供了不同的测试用例集,通过了所有与认证相关的用例后,使用HCK或HLK 将测试结果及驱动程序文件进行打包,然后使用EV证书对打包后的文件签名,再将签名后的打包文件提交到微软伙伴中心。微软伙伴中心会为驱动程序进行正式签名,此后驱动程序才能在win7或win10系统上使用。
2.安装VHLK服务端(也称VHLK控制器)
HLK的安装比较复杂,所以微软提供虚拟机镜像,镜像中提前安装好了HLK,称为VHLK。
VHLK的安装过程见:
1)准备一台win10物理机做为主机系统,其中运行预定义好的VHLK虚拟机镜像,虚拟机中会运行HLK(Hardware Lab Kit 硬件实验室工具包)控制器端程序
说明:VHLK虚拟机镜像中的操作系统是windows server;如果不使用VHLK虚拟机镜像,而是直接安装HLK控制器,则主机系统需要安装windows server 英文版操作系统
2)另准备一台或多台win10物理机做为HLK客户端。客户端向控制器端注册,控制器端进行测试控制,发送测试命令给HLK客户端执行
3)主机系统和客户端系统都需要是物理机
4)主机系统由于要安装虚拟机,需设置bios启用虚拟化支持,关闭安全启动
5)客户端系统需要设置为测试模式 注1
6)测试过程中需要重启客户端系统,因此要保证客户端系统重启后能进入系统
7)主机系统、客户端系统,设置“电源选项”,将“使计算机进入睡眠状态”设置设为“从不”
8)VHLK虚拟机中已经创建好了用户,我们后面需要使用该用户凭据进入虚拟机中,用户名: HLKAdminUser 密码:Testpassword,1
注1:客户端需要先安装驱动才能对驱动进行测试,但此时驱动还没有获得微软的正式签名,无法安装测试;将客户端系统设置为测试模式,则可以安装并运行没有获得正式签名的驱动程序。
windows系统设置为测试模式的方法:
以管理员身份运行cmd,输入如下指令后重起电脑:
bcdedit -set TESTSIGNING ON // 最后一个参数改为OFF,则恢复为正常模式
另外,此时驱动文件需用测试证书进行签名,否则即使系统设置为测试模式,驱动也是无法正确运行的。如何用测试证书进行签名,网络上可以查找相关操作说明。
3. 安装HCK服务端(也称HCK控制器)
如果驱动需要在win7上安装,则需要使用HCK进行签名,为此主机系统上需要安装HCK控制器微软没有提供像VHLK那样预安装好的虚拟机镜像,因此只能找一台物理机安装英文版本的windows server操作系统,然后再安装HCK 控制器程序。
我没有实际安装过HCK,因此不展开描述。需要安装的同学可参考:
Windows HCK Getting Started - Windows 8.1 HCK | Microsoft Learn
windows server需要安装什么版本,上面的链接中也有描述。
4.安装HLK或HCK客户端
如果主机系统上安装的是HLK(VHLK),则需要找一个或多个win10物理机安装HLK的客户端,什么场景需要安装多个客户端呢?例如你有两个驱动需要测试,为提高工作效率,可在客户端A上安装驱动1,在客户端B上安装驱动2,两个驱动同时进行测试;
如果主机系统上安装的是HCK,则需要找一个或多个win7物理机安装HCK的客户端。
安装客户端的过程比较简单,HLK(VHLK)或HCK安装好后,会创建一个共享目录,客户端访问共享目录,下载客户端程序进行安装即可,安装好后,客户端程序会自动向控制器进行注册。通过前面给的链接可以找到客户端的安装说明。
注意:
1)HLK客户端系统上,win10操作系统不同的版本号需安装对应版本的HLK(VHLK)
如下图所示,适用于windows 10 版本 2004的HLK(VHLK),对应的客户端可以是win10 22H2, 21H1等版本,客户端只要是这些版本都是可以的;如果是一个1809版本的客户端,则不能成功向2004的VHLK控制器注册。
https://learn.microsoft.com/zh-cn/windows-hardware/test/hlk/
2)安装client端时会自动创建用户并设置其可以自动登录,win7创建的用户名:DTMLLUAdminUser; win10创建的用户名: HLKAdminUser,密码均是:Testpassword,1
如果重启系统后,系统不会以创建的用户自动登录,则需做如下设置:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword /t REG_SZ /d Testpassword,1 /f
3)测试过程中不要用mstsc登录客户机
4)如果一切顺利,主机系统上打开HLK studio或HCK studio,应能看到客户端信息
点击Configuration选项卡, 在Default Pool中可以看到对应新增的machine, 状态开始为init状态,一段时间后切换为NotReady状态
studio工具中,新建一个Machine Pool ,设置有意义的名字例如My Pool, 将已注册machine从Default Pool拖动到My Pool, 再右键点击该machine,修改状态为Ready。如果状态成功变成Ready状态,则表明该客户端已经可以用于安装驱动并运行测试用例了。
5. 执行测试用例
测试用例的执行过程,HLK与HCK是大致相同的,如无特别强调,则表示HLK与HCK均适用。
1)首先在客户端系统中安装要测试的驱动。
注意:前面已经强调过,客户端系统需要设置为测试模式;驱动程序文件(*.inf, *.sys, *.cat)需要使用测试证书进行签名
2)主机系统中打开HLK studio(或HCK studio),创建一个新项目或打开旧项目,点击“Selection” tab页,选择一个Machine Pool,例如上面创建的My Pool。根据驱动名称进行搜索
注意:有些驱动不一定能根据名称查找到的,例如usbdk驱动是一个过滤驱动,其会附加在usb设备及usb根集线器之少,因此可以像下图这样对usb3.0根集线器进行测试,实测是可以获得签名的:
3)点击“Tests”tab页
该页选择要执行哪些测试用例,如下图所示:
如果是HCK很好选择,View By下拉框中选择“Certification”即可,根据不同的设备类型,结果列表中会罗列出不同的用例集合,不同的设备类型,用例数量差异较大,有的设备类型几十个用例,有的设备类型上百个用例;
HLK中却没有“Certification”这个分类,可以打开以下网址:
Windows Hardware Lab Kit | Microsoft Learn
下载一个名为 Compat Playlists.zip 的压缩包文件,压缩包解压后有多个xml文件,hlk客户端Tests页中有“load playlist”按钮,加载其中的HLK Version 2004 CompatPlaylist x86 x64 ARM64.xml文件,加载该文件后会列出测试用例集,通过这些测试用例后,实测可以拿到微软签名。(加载其它文件没有用,加载后没有任何测试项显示在列表中)
全选这些用例,点击“Run Selected”按钮开始测,此时能看到会客户端系统上执行测试用例的过程,例如不停的有cmd窗口被创建,里面打印测试相关的信息,甚至客户端系统自动重启等。
注意:
1)所有测试用例都通过后才能拿到正式签名,如果有用例执行失败了,双击失败的用例能看到原因,需要进行修改,然后在客户端重新安装驱动程序,重新进行测试。
失败一般有以下原因:
1.1).inf文件里有写得不对的地方;
1.2)驱动代码有错;
1.3)有些用例重复测几次也许就能通过;
1.4)驱动的某些功能没有使能;
1.5)也有可能是测试用例本身有问题
有些失败用例是hlk或hck的原因或os的原因,误判了,可以从微软下载一个.sql文件,这样错误的用例就能变通过。具体操作见:
Windows Hardware Certification Kit Filters
https://learn.microsoft.com/en-us/previous-versions/windows/hardware/hck/hh998024(v=vs.85)?redirectedfrom=MSDN
1.6)极少数的情况是hlk或hck本身的bug
例如 https://bugzilla.redhat.com/show_bug.cgi?id=1653219 帖子中提到的问题,就需要更新hck的一个名为WDTFNetData.dll的文件
2)测试用例的执行是非常耗时的,例如MirrorDriver显卡驱动,需要测试两天才能完成,这里就涉及一些技巧:
2.1)测试用例的type,表明一些用例是需要人工协助的(数量一般较少),例如键盘驱动,可能就会弹出一个界面,需要人点击键盘按键才能继续往下走,因此如果准备一次测多个用例,准备跑上一整晚,则不要选择需要人工协助的用例,以免中途被卡住;
2.2)第一次测时最好先将所有用例都测一遍,先测不需要人工协助的用例,再测需要人工协助的用例(用例之间没有顺序依赖)。将失败的用例都记录下来,对驱动进行修改,然后针对失败的用例进行测试;失败的用例都测过了,再将所有的用例执行一遍,直到一次性全部通过。
6. 测试结果打包
测试用例全部通过后,就可以将测试结果进行打包了。
1)在主机系统中创建一个目录,将驱动文件拷贝到该目录中,驱动文件一般包括.inf, .cat, .sys三个文件,有时也可能还包括.dll文件,.pdb文件不需要拷贝。
需要注意的是,之前为了在客户端系统中安装驱动程序,已经使用测试证书对驱动文件进行了签名,如果将驱动文件直接提交给微软伙伴中,微软签发证书后,驱动文件将包含两个证书,一个是测试证书,另一个是微软签发的证书。这样的驱动文件在win10上使用没有问题,在win7上却不一定,如果win7缺少一些补丁,则只能识别到测试证书,导致驱动文件无法正常使用。因此如果驱动程序将用于win7系统,则需要将驱动文件上的测试证书先删除再进行打包。
删除测试证书的方法:
1.1).inf文件 无需签名,不用处理,微软伙伴中心也不会对其进行签名;
1.2).sys文件 使用signtool.exe remove /s xxx.sys 来去除签名; .dll文件也同样处理
不是所有signtool.exe 都有remove参数,要Windows8以上 sdk中的signtool工具才行
1.3).cat文件 使用vsigntool工具来去除签名,这是因为signtool.exe不支持.cat文件;
不要用vsigntool工具删除.sys,.dll文件的签名,可能会破坏文件。
vSignTool的下载地址 VSign 远程数字签名解决方案_代码签名工具,下载的位置:
2)使用HLK(VHLK) studio或HCK studio工具进行打包
2.1)点击"Package"tab页,点击Add Driver Folder 按钮
点OK按钮后,出现下面的提示框,点yes:
选择语言:
点击ok按钮关闭对话框;
“Package” Tab的右下角有一个 Create Package选项,点击该选项弹出下面的对话框
选择 “Do not sign", 然后继续。后面会提示为生成的*.hlkx或*.hckx 文件指定文件名, 可任意指定。继续执行将生成指定名称的*.hlkx文件或*.hckx文件,生成的文件中包括驱动程序文件及测试结果。
说明:
生成的打包文件(即*.hlkx或*.hckx文件),需要用EV证书先进行签名,然后才能提交到微软伙伴中心,为什么此处选择Do not sign呢?这是因为HLK或HCK Server是部署在windows server中的,在windows server系统中,无法识别ukey,导致不能完成签名。因此先生成一个未签名的打包文件,将打包文件拷贝到另一个windows10的主机上,在该主机上完成EV证书签名。
7. 用EV证书签名测试结果文件
1)另外准备一台win10_64的主机,在该主机安装 HLK Studio, 该工具将用于对上面生成的*.hlkx或*.hckx文件进行EV证书签名。
说明:
上面已经说过只能在windows server系统安装HLK 控制器,这里仅安装HLK Studio,此时可以使用windows10操作系统,安装过程也很快,具体见:
安装独立 HLK Studio | Microsoft Learn
2.2.1)下载 HLKSetup.exe
2.2.2)双击.exe
2)win10主机上,安装 SafeNetAuthenticationClient 软件:
下载网址: EV代码签名驱动下载 下载最新版本
3)插入保存了EV证书的uKey
要想获得微软的正式签名,你所在的公司需要先向有资质的公司申领购买EV证书。现在的EV证书已经不是一个文件了,而是一个像u盘的uKey
4)打开SafeNetAuthenticationClient,从uKey中导出.cer文件,如果已经导出过则不用再做此步
5)将未签名的*.hlkx或*.hckx文件拷贝到这台主机,打开HLK Studio,点击Connect, 打开*.hckx或*.hlkx文件
打开 Package tab,点击 Create Package
弹出窗口中,点击“Use a certificate file”, 加载从uKey中导出的.cer 文件,根据要求输入ukey密码,完成签名,生成一个新的*.hlkx文件;你没看错,如果输入的是HCK studio生成的*.hckx文件,生成的也是*.hlkx文件。
8. EV证书上传微软伙伴中心
这一步只用做一次,除非EV证书过期了,需要更换证书。
原因:
上面用EV证书签名的*.hlkx文件(实际是用私钥签名)将会上传微软伙伴中心,微软伙伴中心需要有对应的公钥验证上传文件的真实性,为此我们需要将EV证书中的公钥先上传到微软伙伴中心。
说明:
登录微软伙伴中心的账号如何注册,我没有操作过,无法进行描述,有可能是购买EV证书时,由证书代理公司帮忙注册的。
步骤:
登录微软伙伴中心,在“账户设置”中有一个“管理证书”,在其中上传新的证书。
上传证书的步骤:
1)按提示下载一个名为 SignableFile.bin 的文件
2)用EV证书对该文件进行签名
使用vSignTool进行签名即可,证书中选择UKEY那个,即用token中的证书进行签名。 vSignTool的下载路径见第6节中的描述。
注意:
2.1)要插入token并打开SafeNet Authentication工具才能在vsigntool中看到对应的证书
2.2)不要使用mstsc登录远程主机并在远程主机中访问token,这样是看不到ukey证书的。
2.3)注意要带上时间戳,是GlobalSign的证书,就尽量用GlobalSign的时间戳服务器;
签名模式选择SHA256签名
3)将签好名的SignableFile.bin文件上传回去即可
4)如果上传文件失败,出现如下所示的提示信息。可找微软进行支持
是中国工程使在提供支持,用中文描述问题即可,响应较快的。
9. EV证书签名后的*.hlkx或*.hckx文件上传微软伙伴中心
访问网址:合作伙伴中心
输入账号或密码,如何在微软合作伙伴中心注册账号,我没有操作过,因此无法说明此步骤,有可能是购买EV证书时,由证书代理公司帮忙注册的。
弹出窗口中选择:输入验证码
会有一个验证码发送到注册账号绑定的手机上,输入验证码,完成登录。
登录完成后的界面中,点击 "Submit new hardware"
弹出页面中指定一个有意义的名字,加载之前签过名的*.hlkx文件
类型选 External, Firmware version顺便填写, 其它保持默认,点submit开始认证。
微软伙伴中心处理大概要半小时到1小时,完成后下载正式签名的驱动程序文件
下载的文件包括 .sys, .cat, .inf等文件,检查.sys文件的属性,看是否获得微软的签名。