更新时间:2025-08-28 GMT+08:00

配置ECS安全启动

操作场景

安全启动用于在设备启动过程中检测各个部件(驱动加载程序、内核、内核驱动程序)的完整性,防止因加载运行未经过认证的部件,产生对系统及用户数据的安全威胁。

安全启动是统一可扩展固件接口(Unified Extensible Firmware Interface,简称UEFI)的一项功能,要求在加载之前验证所有低级别的固件和软件组件。 在启动过程中,UEFI安全启动会检查每个启动软件的签名,包括UEFI固件驱动程序(也称为ROM选项)、可扩展固件接口(EFI)应用程序、操作系统驱动程序和二进制文件。 如果签名有效或被原始设备制造商(OEM)认可,则设备将启动,而固件将控制权交给操作系统。

安全启动通过密钥对启动设备进行签名和验证,确保ECS只启动使用了加密密钥签名的软件,帮助用户保护软件免受重新引导过程中持续存在的威胁。安全启动的密钥存储在UEFI非易失性变量存储的密钥数据库中。
  • 开启安全启动后,系统启动时会校验部件完整性,对业务无影响。
  • 关闭安全启动后,系统启动时不再校验部件完整性,对业务无影响。

背景知识

统一可扩展固件接口UEFI是一种详细描述全新类型接口的标准,可用于操作系统自动从预启动的操作环境加载到一种操作系统上。

UEFI启动方式的操作系统支持安全启动,该功能提供了有关启动链状态的验证,旨在确保固件自初始化后只执行经过加密验证的UEFI二进制文件。这些二进制文件包括UEFI驱动程序、主启动加载程序以及链加载组件。

默认情况下,安全启动处于禁用状态,且系统处于SetupMode。当系统处于SetupMode时,所有密钥变量都可以在没有加密签名的情况下进行更新。启用安全启动后,系统退出SetupMode。

启用安全启动后,系统会在任何UEFI二进制文件上强制执行签名验证。

安全启动基于在信任链中使用的密钥数据库如表1所示,这些数据库存储在UEFI变量存储中。

表1 密钥数据库

密钥数据库

简称

是否必选

说明

格式约束

平台密钥

PK (Platform Key)

PK数据库是安全启动实例的信任根。

PK数据库包含一个公有PK密钥,该密钥在信任链中用于更新密钥交换密钥(KEK)数据库。

要更改PK数据库,必须拥有私有PK密钥才能签署更新请求。这包括通过写入空PK密钥来删除PK数据库。

  • 支持der/esl/auth证书格式
  • 仅支持一本证书
  • 签名类型仅支持x509
  • 不支持证书摘要

密钥交换密钥

KEK (Key Exchange Key)

KEK数据库是信任链中用于更新签名(DB)和拒绝列表(DBX)数据库的公有KEK密钥的列表。

私有KEK用于向DB添加密钥,该数据库是要在系统上启动的授权签名列表。

要更改公有KEK数据库,必须拥有私有PK密钥才能签署更新请求。

  • 支持der/esl/auth证书格式
  • esl/auth文件签名类型仅支持x509
  • 不支持证书摘要

签名数据库

DB(Signature Database)

DB数据库是信任链中用于验证所有UEFI启动二进制文件的公有密钥和哈希值的列表。

DB列表包含授权在系统上启动的授权密钥。要修改列表,需要私有KEK。

要更改DB数据库,必须拥有私有PK密钥或私有KEK密钥中的任何一个才能签署更新请求。

  • 支持der/esl/auth证书格式
  • esl/auth文件签名类型仅支持x509
  • 不支持证书摘要

禁用签名数据库

DBX (Forbidden Signatures Database)

DBX数据库是不受信任的公有密钥和二进制哈希的列表,在信任链中用于吊销文件。

DBX数据库始终优先于所有其他密钥数据库。

要更改DBX数据库,必须拥有私有PK密钥或私有KEK密钥中的任何一个才能签署更新请求。

您可以在UEFI论坛获取公开可用的DBX,请参见Unified Extensible Firmware Interface Forum

  • 支持esl/auth证书格式
  • 签名类型支持x509
  • 支持sha256/sha284/sha512/sm3证书摘要

时间戳签名数据库

DBT ( Timestamp Signatures Database)

DBT数据库是在时间戳签名数据库中保留代码的签名。

  • 支持der/esl/auth格式证书
  • esl/auth文件签名类型仅支持x509
  • 不支持证书摘要

约束与限制

  • 实例规格需支持UEFI安全启动,包括:C7t、Kc2、aC8。
  • 仅支持在制作私有镜像时导入相关密钥,不支持在ECS的BIOS启动界面导入。
  • 不支持在ECS中通过mokutil工具导入密钥或相关配置。
  • 裸金属类型的实例不支持UEFI安全启动。
  • 支持UEFI启动方式的操作系统请参考支持UEFI启动方式的操作系统版本
  • Windows系统镜像用户需要通过操作系统官网下载对应的证书,请参见Keys Required for Secure Boot on all PCs

操作流程

图1 配置ECS安全启动流程

创建安全启动密钥(Linux)

您需要以UEFI安全启动的标准创建密钥,并为每个密钥创建一个证书,再将每个证书转换为UEFI签名列表(二进制文件),最后使用相关密钥签署每个证书。

  1. 创建全局唯一标识符(GUID)

    在创建密钥对之前,请先创建用于密钥生成的全局唯一标识符(GUID)。

    1. 连接到实例
    2. 执行以下命令,创建用于密钥生成的全局唯一标识符(GUID)。

      uuidgen --random > GUID.txt

  2. 创建平台密钥(必选)

    平台密钥(PK)是UEFI安全启动实例的信任根。

    1. 执行以下命令创建密钥,并将变量命名为PK。

      openssl req -newkey rsa:4096 -nodes -keyout PK.key -new -x509 -sha256 -days 3650 -subj "/CN=Platform key/" -out PK.crt

      其中相关参数说明如下:

      • keyout PK.key:私有密钥文件。
      • days 3650:证书有效天数。
      • out PK.crt:创建UEFI变量的证书。
      • CN=Platform key:密钥的公用名(CN)。您可以输入您自己企业的名称而不是平台密钥。
    2. 创建证书。

      openssl x509 -outform DER -in PK.crt -out PK.cer

    3. 将证书转换为UEFI签名列表。

      cert-to-efi-sig-list -g "$(< GUID.txt)" PK.crt PK.esl

    4. 使用私有PK签署UEFI签名列表。

      sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt PK PK.esl PK.auth

  3. 创建密钥交换密钥(必选)

    私有密钥交换密钥(KEK)用于向签名数据库(DB)添加密钥,该数据库是用于在系统上启动的授权签名列表。

    1. 创建密钥。

      openssl req -newkey rsa:4096 -nodes -keyout KEK.key -new -x509 -sha256 -days 3650 -subj "/CN=Key Exchange Key/" -out KEK.crt

    2. 创建证书。

      openssl x509 -outform DER -in KEK.crt -out KEK.cer

    3. 将证书转换为UEFI签名列表。

      cert-to-efi-sig-list -g "$(< GUID.txt)" KEK.crt KEK.esl

    4. 使用私有PK签署签名列表。

      sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt KEK KEK.esl KEK.auth

  4. 创建签名数据库(必选)

    签名数据库(DB)列表包含授权在系统上启动的授权密钥。要修改签名数据库列表,需要私有密钥交换密钥(KEK)。

    开启镜像安全启动时将使用此步骤中创建的私有密钥签名。

    1. 创建密钥。

      openssl req -newkey rsa:4096 -nodes -keyout db.key -new -x509 -sha256 -days 3650 -subj "/CN=Signature Database key/" -out db.crt

    2. 创建证书。

      openssl x509 -outform DER -in db.crt -out db.cer

    3. 将证书转换为UEFI签名列表。

      cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl

    4. 使用私有密钥交换密钥(KEK)签署签名列表。

      sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db db.esl db.auth

  5. 创建禁用签名数据库(可选)

    禁用签名数据库(DBX)的作用是禁用特定的db证书,可以是证书列表或哈希列表。

  6. 创建时间戳签名数据库(可选)

    时间戳签名数据库(DBT)的作用是对签名时间戳进行签名,当db证书在dbx中,且dbx指定了吊销时间,如果签名时间在吊销时间之前,则db证书可以用于验签,否则不能用于验签。

使用密钥对ECS镜像进行签名

对于HCE系统,需要对如下镜像进行签名:

/boot/efi/EFI/hce/shimx64.efi

/boot/efi/EFI/hce/mmx64.efi

/boot/efi/EFI/hce/grubx64.efi

/boot/vmlinuz-5.10.0-60.18.0.50.r951_39_66.hce2.x86_64

使用uname -a命令可查看镜像内核版本,例如:

linux-iXZPNN:~ # uname -a

Linux linux-iXZPNN 5.10.0-60.18.0.50.r951_39_66.hce2.x86_64 #1 SMP Sun Jul 30 15:05:32 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

To sign an image

Use the following syntax to sign an image.

sbsign --key db.key --cert db.crt --output /boot/vmlinuz-5.10.0-60.18.0.50.r951_39_66.hce2.x86_64 /boot/vmlinuz-5.10.0-60.18.0.50.r951_39_66.hce2.x86_64

Refer to the documentation for your distribution to find out about your boot chain and required images.

¹ Thanks to the ArchWiki community for all of the work they have done. The commands for creating the PK, creating the KEK, creating the DB, and signing the image are from Creating keys, authored by the ArchWiki Maintenance Team and/or the ArchWiki contributors.

获取安全启动证书

请联系镜像提供方获取安全启动证书。

安全启动证书转码

  • 平台密钥(Platform Key)转码

    __platform_key=$(cat PK.der | base64 -w 0)

  • 密钥交换密钥(Key Exchange Key)转码

    __key_exchange_key=$(cat KEK.der | base64 -w 0)

  • 签名数据库(Signature Database)转码

    __signature_database=$(cat DB.der | base64 -w 0)

  • 禁用签名数据库(Forbidden Signatures Database)转码

    __forbidden_signatures_database=$(cat DBX.der | base64 -w 0)

  • 时间戳签名数据库(Timestamp Signatures Database)转码

    __timestamp_signatures_database=$(cat DBT.der | base64 -w 0)

  • PK.der为平台密钥(Platform Key)证书。
  • KEK.der为密钥交换密钥(Key Exchange Key)证书。
  • DB.der为签名数据库(Signature Database)证书。
  • DBX.der为禁用签名数据库(Forbidden Signatures Database)证书。
  • DBT.der为时间戳签名数据库(Timestamp Signatures Database)证书。

创建私有镜像

您可以通过镜像服务IMS创建私有镜像,创建私有镜像的方式包括:

更新安全启动镜像元数据

可通过“更新镜像信息”接口,更新以下镜像元数据。

接口获取地址:更新镜像信息

hw_firmware_type=uefi
__support_secure_boot=true
__platform_key=${__platform_key}
__key_exchange_key=${__key_exchange_key}
__signature_database=${__signature_database}
__forbidden_signatures_database=${__forbidden_signatures_database}
__timestamp_signatures_database=${__timestamp_signatures_database}

开启镜像安全启动

  1. 登录管理控制台
  2. 选择“计算 > 镜像服务”,进入镜像服务页面。
  3. 单击“私有镜像”页签进入对应的镜像列表。
  4. 在镜像所在行的“操作”列下,单击“修改”。
  5. 在弹出的“修改镜像”对话框中,启动方式选择“UEFI”。
  6. 开启安全启动选项后,在选项下方的密钥数据库后面填写对应的输入内容。
  7. 单击“确定”。

配置ECS安全启动

  1. 登录管理控制台
  2. 单击管理控制台左上角的,选择区域和项目。
  3. 单击“”,选择“计算 > 弹性云服务器”。
  4. 单击“购买弹性云服务器”,系统进入创建页。
  5. 根据业务需要,设置“可信系统”。
    • 勾选“安全启动”,开启安全启动。
    • 去勾选“安全启动”,关闭安全启动。

    购买弹性云服务器的基础配置、网络配置以及高级配置,请参见自定义购买弹性云服务器

  6. 单击“确认”,完成安全启动配置。

后续操作

  • 验证是否启用了UEFI安全启动(Windows)
    1. 打开msinfo32工具。
    2. 检查Secure Boot State(安全启动状态)字段。

      Secure Boot State值为Supported(支持),表示已启用UEFI安全启动。

  • 验证是否启用了UEFI安全启动(Linux)
    1. 在实例上,运行以下命令。

      mokutil --sb-state

    2. 确认输出结果。
      • 如果启用了UEFI安全启动,则输出结果中包含SecureBoot enabled
      • 如果未启用UEFI安全启动,则输出结果中包含SecureBoot disabledFailed to read SecureBoot