eToken
使用 DigiCert eToken 进行 UEFI Secure Boot 签名¶
UEFI Secure Boot 要求 UEFI 二进制文件由 Microsoft 签名。本页记录了获取签名版 iPXE 和 wimboot 的进行中工作。
EV 代码签名证书¶
Microsoft 要求提交的 UEFI 二进制文件使用 EV 代码签名证书签名。这些证书可以从 DigiCert 等提供商处获得,三年期证书的费用约为 2000 美元。请注意,你必须购买更昂贵的 EV 代码签名证书 来签署 UEFI 提交;普通的代码签名证书不会被 Microsoft 接受。
SafeNet eToken 5110+ FIPS¶

撰写本文时,DigiCert 以 Aladdin/SafeNet eToken 5110+ FIPS USB 硬件令牌的形式提供 EV 代码签名证书。该令牌包含证书和对应的私钥。
各种可用于 Linux 的开源硬件令牌驱动程序几乎(但还不完全)支持该令牌。作为临时措施,你可以下载并安装专有的 Safenet Authentication Client。Safenet Authentication Client 包含许多你不需要或不想要的功能(例如 GUI 工具和会导致 Firefox 自动尝试使用你的证书向你访问的每个网站标识你身份的 RPM 安装后脚本):安装后你可能想要禁用或删除其中的大部分。
Safenet Authentication Client 软件中唯一必需的部分是库 /usr/lib64/libeToken.so。这个库提供标准化的 PKCS#11 API,允许 opensc 和 openssl 等工具使用硬件令牌。
测试硬件令牌是否正常工作的最简单方法是安装 opensc 并运行命令:
pkcs11-tool --module libeToken.so --list-objects
更改密码¶
要更改硬件令牌上的密码,运行命令:
pkcs11-tool --module libeToken.so --change-pin
提取证书¶
要从硬件令牌中提取证书,首先运行:
pkcs11-tool --module libeToken.so --list-objects
并记下与你的证书关联的 ID。例如:
Certificate Object, type = X.509 cert
label: Fen Systems Ltd.
ID: 842ea4f497f6defa75e786015c2cdbfd12a18891
然后可以使用以下命令提取证书:
pkcs11-tool --module libeToken.so --read-object --type cert --id 842ea4f497f6defa75e786015c2cdbfd12a18891 \
| openssl x509 -inform DER -out codesigning.crt
(把 "842ea4f497f6defa75e786015c2cdbfd12a18891" 替换为你的证书的 ID)。这将给你一个包含你的代码签名证书的文件 codesigning.crt(但不包含私钥,私钥仍保留在令牌上)。你可以使用以下命令检查 codesigning.crt 的内容:
openssl x509 -in codesigning.crt -noout -text
工具链¶

要签名提交给 Microsoft 的 UEFI .cab 文件,你还需要安装:
gcabopensslengine_pkcs11osslsigncode(不要尝试使用pesign进行代码签名,因为它有缺陷,无法使用硬件令牌执行签名。请改用osslsigncode。如果pesign将来被修复:你可以使用以下命令配置 NSS 让pesign使用libeToken.so:
sudo modutil -dbdir /etc/pki/pesign -add eToken -libfile /usr/lib64/libeToken.so
然后你可以使用以下命令列出可供 pesign 使用的证书:
certutil -d /etc/pki/pesign -h eToken -L
并尝试使用例如以下命令进行签名:
pesign -s -i unsigned.exe -o signed.exe -t "Fen Systems Ltd." -c "Fen Systems Ltd."
(把 "Fen Systems Ltd." 替换为上面 certutil 显示的你的令牌名称)。)
所有这些都为 Red Hat 和 SuSE 衍生版(Fedora、CentOS、OpenSuSE 等)提供了预打包版本。你应该不需要从源代码构建其中任何一个。
Microsoft 硬件开发中心¶
你需要在 Microsoft 合作伙伴中心注册一个账户,并添加你的代码签名证书。此过程将要求你签名一个下载的文件 SignableFile.bin:你可以使用以下命令完成:
osslsigncode -pkcs11module /usr/lib64/libeToken.so -h sha256 -askpass \
-t http://timestamp.digicert.com -certs codesigning.crt \
-key 842ea4f497f6defa75e786015c2cdbfd12a18891 \
-in SignableFile.bin -out SignedFile.bin
(同上,把 "842ea4f497f6defa75e786015c2cdbfd12a18891" 替换为你的证书的 ID)。
创建 UEFI 签名提交¶
要创建 UEFI 签名提交,你必须创建一个包含你的(未签名的).efi 文件的 .cab 文件。例如,你可以使用以下命令创建一个包含 ipxe.efi 和 snponly.efi 的 submission.cab 文件:
gcab -n -c submission.cab ipxe.efi snponly.efi
你可以使用以下命令签名 submission.cab 文件:
osslsigncode -pkcs11module /usr/lib64/libeToken.so -h sha256 -askpass \
-t http://timestamp.digicert.com -certs codesigning.crt \
-key 842ea4f497f6defa75e786015c2cdbfd12a18891 \
-in submission.cab -out submission-signed.cab
(同上,把 "842ea4f497f6defa75e786015c2cdbfd12a18891" 替换为你的证书的 ID)。
请注意,osslsigncode 2.6 版有一个 bug,会导致它生成无效的 .cab 文件。你需要使用 osslsigncode 2.7 或更高版本(或 2.5 或更早版本)。
提交给 Microsoft¶
登录 Microsoft 合作伙伴中心并选择 "Submit New UEFI"。
等待¶
你可能需要等待长达六个月才能收到 Microsoft 的回复,在此期间你可能会偶尔收到询问无关问题的电子邮件。当回复最终到来时,很可能是一条自动消息,内容如下:
Thank you for your submission. We were unable to sign your EFI binaries. Common reasons for failure are:
Including any files that are not EFI binaries (e.g. README)
Invalid directory structure - packages should include only EFI files at the root-level of the package
EFI Bytecode (EBC) drivers must pass the /ALIGN:32 flag to the Intel EBC linker
细心的读者会注意到,这条消息没有提供任何关于签名过程失败原因的信息。如果你尝试向 Microsoft 跟进,你会发现 Microsoft 没有人知道签名过程实际上是如何运作的。
祝你好运!
