更新时间:2026-04-24 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/sha384/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

使用以下语法对镜像进行签名:

sbsign --key db.key --cert db.crt --output /boot/efi/EFI/hce/shimx64.efi /boot/efi/EFI/hce/shimx64.efi

sbsign --key db.key --cert db.crt --output /boot/efi/EFI/hce/mmx64.efi /boot/efi/EFI/hce/mmx64.efi

sbsign --key db.key --cert db.crt --output /boot/efi/EFI/hce/grubx64.efi /boot/efi/EFI/hce/grubx64.efi

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

获取安全启动证书

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

安全启动证书转码

  • 平台密钥(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. 在镜像所在行的“操作”列下,单击“修改”。
  6. 在弹出的“修改镜像”对话框中,启动方式选择“UEFI”。
  7. 开启安全启动选项后,在选项下方的密钥数据库后面填写对应的输入内容。
  8. 单击“确定”。

配置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