跳转至

eToken

使用 DigiCert eToken 进行 UEFI Secure Boot 签名

UEFI Secure Boot 要求 UEFI 二进制文件由 Microsoft 签名。本页记录了获取签名版 iPXEwimboot 的进行中工作。

EV 代码签名证书

Microsoft 要求提交的 UEFI 二进制文件使用 EV 代码签名证书签名。这些证书可以从 DigiCert 等提供商处获得,三年期证书的费用约为 2000 美元。请注意,你必须购买更昂贵的 EV 代码签名证书 来签署 UEFI 提交;普通的代码签名证书不会被 Microsoft 接受。

SafeNet eToken 5110+ FIPS

An Aladdin eToken

撰写本文时,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,允许 openscopenssl 等工具使用硬件令牌。

测试硬件令牌是否正常工作的最简单方法是安装 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

工具链

A (tool)chain

要签名提交给 Microsoft 的 UEFI .cab 文件,你还需要安装:

  • gcab
  • openssl
  • engine_pkcs11
  • osslsigncode(不要尝试使用 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.efisnponly.efisubmission.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 没有人知道签名过程实际上是如何运作的。

祝你好运!

Abandon all hope ye who submit here