高通Linux安全指南(七)

安全启动的具体步骤

生成密钥和证书

为了启用UEFI安全启动,生成一对用于签名和认证的密钥和证书。

密钥生成支持以下算法:

  • RSA 2048/4096 和 SHA-256/SHA384 哈希算法
  • ECDSA secp256r1/secp384r1

以下过程提供了使用 RSA 2048 和 SHA-256 生成密钥和证书的示例说明。

注意: 创建一个文件夹并在同一位置执行这些命令,确保在Linux机器上执行这些步骤。

注意: 对于ECC,将 rsa:2048 替换为 ec:secp384r1 或 ec:secp256r1。对于 SHA384,将
-sha256 替换为 -sha384。

生成UID

你可以生成一个GUID,并创建三个具有自签名证书的新密钥,证书格式为CRT/PEM,密钥格式为.key:

使用uuidgen生成签名所有者GUID:

uuidgen --random > GUID.txt
创建PK密钥
  1. 创建一个PK密钥(RSA-2048)对和证书:

    openssl req -new -x509 -newkey rsa:2048 -subj "/CN=Custom PK/" -keyout PK.key -out PK.crt -days 3650 -nodes -sha256
    
  2. 将.crt文件转换为.cer文件:

    openssl x509 -outform der -in PK.crt -out PK.cer
    
  3. 将.crt文件转换为.esl文件:

    cert-to-efi-sig-list -g "$(< GUID.txt)" PK.crt PK.esl
    
  4. 使用.crt、.esl和.key文件签名并生成.auth文件:

    sign-efi-sig-list -k PK.key -c PK.crt PK PK.esl PK.auth
    
创建KEK密钥
  1. 创建一个KEK密钥(RSA-2048)对和证书:

    openssl req -new -x509 -newkey rsa:2048 -subj "/CN=Custom KEK/" -keyout KEK.key -out KEK.crt -days 3650 -nodes -sha256
    
  2. 将.crt文件转换为.cer文件:

    openssl x509 -outform der -in KEK.crt -out KEK.cer
    
  3. 将.crt文件转换为.esl文件:

    cert-to-efi-sig-list -g "$(< GUID.txt)" KEK.crt KEK.esl
    
  4. 使用.crt、.esl和.key文件签名并生成.auth文件:

    sign-efi-sig-list -k PK.key -c PK.crt KEK KEK.esl KEK.auth
    
创建DB密钥
  1. 创建一个DB密钥(RSA-2048)对和证书:

    openssl req -new -x509 -newkey rsa:2048 -subj "/CN=Custom DB Signing Key 1/" -keyout db.key -out db.crt -days 3650 -nodes -sha256
    
  2. 将.crt文件转换为.cer文件:

    openssl x509 -outform der -in db.crt -out db.cer
    
  3. 将.crt文件转换为.esl文件:

    cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl
    
  4. 使用.crt、.esl和.key文件签名并生成.auth文件:

    sign-efi-sig-list -k KEK.key -c KEK.crt db db.esl db.auth
    

签名镜像并将(.auth)密钥/签名文件复制到EFI分区

EFI系统分区包含EFI、loader和dtb目录,这些目录在使用systemd-boot时包含与EFI相关的信息。
该过程提供以下说明:

  • 签名各种镜像
  • 将(.auth)密钥和签名文件复制到EFI分区目录
  • 签名和可执行镜像文件(例如bootaa64.efi文件(systemd-boot))被放置在\EFI\BOOT\目录中,uki.efi文件(Linux镜像)被放置在\EFI\Linux\目录中。

除了验证签名镜像,systemd-boot还用于注册密钥。

  • UEFI安全启动密钥被放置在/keys的特定文件夹中用于密钥注册。systemd-boot在UEFI启动时间服务期间使用这些密钥并将其配置到RPMB或UEFI变量存储中。
  • 您可以在systemd-boot加载器配置中配置等待时间(以秒为单位)。在等待时间期间,内核加载被延迟,允许您查看和选择systemd-boot菜单中的可用选项。

设备树文件存储在/dtb文件夹中。这些文件在运行时由UEFI使用,设备树文件被初始化。签名时,会创建.sig文件并放置在同一文件夹中,因为这些文件是非PE镜像。

在这里插入图片描述
在Linux主机上将签名镜像和密钥放置在EFI分区中,请遵循以下步骤:

  1. 在contents.xml文件中找到efi.bin文件路径以从meta中获取efi.bin文件。

  2. 将efi.bin文件挂载到目录,并在目录中创建一个efimountedbin文件夹。

  3. 挂载efi.bin文件:

    sudo mount efi.bin efimountedbin
    cd efimountedbin
    
  4. 在/efimountedbin/loader/keys目录中创建一个authkeys文件夹以注册密钥。

  5. 选择并复制.auth文件(PK.auth、KEK.auth和db.auth)到authkeys文件夹:

    sudo cp <selected algo PK/KEK/DB auth files from the files location> 
    <workspace>/efimountedbin/loader/keys/authkeys/
    
  6. 使用密钥签名bootaa64.efi、uki.efi和dtb镜像文件并复制到efimountedbin目录中的相应文件夹。
    a. 签名EFI镜像:
    sbsign工具用于签名遵循EFI规范的EFI启动镜像,例如bootaa64.efi或UKI.efi。该工具专门用于UEFI安全启动签名,可在Linux系统上下载和使用。需要注意的是,sbsign只能签名具有.efi扩展名的PE镜像。

    将bootaa64.efi文件从efimountedbin文件夹中的/EFI/BOOT目录和uki.efi文件从/EFI/Linux目录复制到Linux机器上的镜像文件夹中。
    签名镜像:

    cd <workspace>/images
    sudo sbsign --key <workspace>/keys/db.key --cert <workspace>/keys/db.crt bootaa64.efi -- output <workspace>/bootaa64.efi
    sudo sbsign --key <workspace>/keys/db.key --cert <workspace>/keys/db.crt uki.efi --output  <workspace>/uki.efi
    

    b. 签名dtb镜像:
    所有由UEFI安全启动认证的镜像都是常规API,并且通常是PE格式。签名头和大小附加到现有PE头,并将签名附加到签名文件的末尾。
    然而,当非PE格式的镜像需要UEFI安全启动认证时,缺乏PE头和识别镜像格式的魔术数将会失败。因此,无法使用标准工具和路径进行镜像验证。
    目前,在UEFI安全启动验证的镜像列表中,只有dtb文件是非PE格式镜像。作为sbsign工具的替代,您可以使用OpenSSL cms命令生成用于签名非PE格式镜像的签名文件。
    按照以下步骤签名非EFI镜像:
    要签名dtb文件及签名文件,运行以下命令:

    openssl cms -sign -inkey <.key file> -signer <.crt file> -binary -in <input dtb file> -out <output .dtb.sig file> -outform DER
    

    c. 要签名镜像,运行以下命令:

    cd <workspace>/images
    sudo openssl cms -sign -inkey <workspace>/keys/db.key -signer <workspace>/keys/db.crt -binary -in qcm6490-idp.dtb --out qcm6490-idp.sig -outform DER
    
  7. 将签名的uki和bootaa64镜像复制回efimountedbin目录中的相应文件夹位置(/EFI/BOOT和/EFI/Linux)。

  8. 将签名的qcm6490-idp.sig文件复制到efimountedbin目录的/dtb文件夹中。

  9. 配置systemd-boot中的等待时间:

    a. 打开并编辑/loader/loader.conf文件,具有sudo权限:

    sudo vi loader.conf
    

    b. 添加行timeout 2以设置启动菜单超时时间并保存文件。

  10. 卸载EFI二进制文件以获取最新的efi.bin文件,执行命令:

    sudo umount efimountedbin
    
  11. 将签名镜像和密钥安全地放置在目标EFI分区中。
    将设备置于Fastboot模式,并使用fastboot命令刷写最新的efi.bin文件:

    fastboot flash efi <efi binary location>
    
  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值