配置ECS安全启动
操作场景
安全启动用于在设备启动过程中检测各个部件(驱动加载程序、内核、内核驱动程序)的完整性,防止因加载运行未经过认证的部件,产生对系统及用户数据的安全威胁。
安全启动是统一可扩展固件接口(Unified Extensible Firmware Interface,简称UEFI)的一项功能,要求在加载之前验证所有低级别的固件和软件组件。 在启动过程中,UEFI安全启动会检查每个启动软件的签名,包括UEFI固件驱动程序(也称为可选ROM)、可扩展固件接口(EFI)应用程序、操作系统驱动程序和二进制文件。 如果签名有效或被原始设备制造商(OEM)认可,则设备将启动,而固件将控制权交给操作系统。
- 开启安全启动后,系统启动时会校验部件完整性,对业务无影响。
- 关闭安全启动后,系统启动时不再校验部件完整性,对业务无影响。
背景知识
统一可扩展固件接口UEFI是一种详细描述全新类型接口的标准,可用于操作系统自动从预启动的操作环境加载到一种操作系统上。
UEFI启动方式的操作系统支持安全启动,该功能提供了有关启动链状态的验证,旨在确保固件自初始化后只执行经过加密验证的UEFI二进制文件。这些二进制文件包括UEFI驱动程序、主启动加载程序以及链加载组件。
默认情况下,安全启动处于禁用状态,且系统处于SetupMode。当系统处于SetupMode时,所有密钥变量都可以在没有加密签名的情况下进行更新。启用安全启动后,系统退出SetupMode。
启用安全启动后,系统会在任何UEFI二进制文件上强制执行签名验证。
安全启动基于在信任链中使用的密钥数据库如表1所示,这些数据库存储在UEFI变量存储中。
| 密钥数据库 | 简称 | 是否必选 | 说明 | 格式约束 |
|---|---|---|---|---|
| 平台密钥 | PK (Platform Key) | 是 | PK数据库是安全启动实例的信任根。 PK数据库包含一个公有PK密钥,该密钥在信任链中用于更新密钥交换密钥(KEK)数据库。 要更改PK数据库,必须拥有私有PK密钥才能签署更新请求。这包括通过写入空PK密钥来删除PK数据库。 |
|
| 密钥交换密钥 | KEK (Key Exchange Key) | 是 | KEK数据库是信任链中用于更新签名(DB)和拒绝列表(DBX)数据库的公有KEK密钥的列表。 私有KEK用于向DB添加密钥,该数据库是要在系统上启动的授权签名列表。 要更改公有KEK数据库,必须拥有私有PK密钥才能签署更新请求。 |
|
| 签名数据库 | DB(Signature Database) | 是 | DB数据库是信任链中用于验证所有UEFI启动二进制文件的公有密钥和哈希值的列表。 DB列表包含授权在系统上启动的授权密钥。要修改列表,需要私有KEK。 要更改DB数据库,必须拥有私有PK密钥或私有KEK密钥中的任何一个才能签署更新请求。 |
|
| 禁用签名数据库 | DBX (Forbidden Signatures Database) | 否 | DBX数据库是不受信任的公有密钥和二进制哈希的列表,在信任链中用于吊销文件。 DBX数据库始终优先于所有其他密钥数据库。 要更改DBX数据库,必须拥有私有PK密钥或私有KEK密钥中的任何一个才能签署更新请求。 您可以在UEFI论坛获取公开可用的DBX,请参见Unified Extensible Firmware Interface Forum。 |
|
| 时间戳签名数据库 | DBT ( Timestamp Signatures Database) | 否 | DBT数据库是在时间戳签名数据库中保留代码的签名。 |
|
约束与限制
- 当前支持UEFI安全启动的实例规格,仅包括:C7t、Kc2、aC8。
- 仅支持在制作私有镜像时导入相关密钥,不支持在ECS的BIOS启动界面导入。
- 不支持在ECS中通过mokutil工具导入密钥或相关配置。
- 裸金属类型的实例不支持UEFI安全启动。
- 支持UEFI启动方式的操作系统请参考支持UEFI启动方式的操作系统版本。
- Windows系统镜像用户需要通过操作系统官网下载对应的证书,请参见Keys Required for Secure Boot on all PCs。
操作流程
创建安全启动密钥(Linux)
您需要以UEFI安全启动的标准创建密钥,并为每个密钥创建一个证书,再将每个证书转换为UEFI签名列表(二进制文件),最后使用相关密钥签署每个证书。
创建安全启动密钥的操作依赖如下工具和安装包:
- x86:依赖sbsign、efitools安装包,具体操作,请参见Huawei Cloud EulerOS镜像(x86)的“准备工作”。
- ARM:依赖cert-to-efi-sig-list和sign-efi-sig-list命令行工具、pesign签名工具,具体操作,请参见Huawei Cloud EulerOS镜像(ARM)的“准备工作”。
- 创建全局唯一标识符(GUID)
在创建密钥对之前,请先创建用于密钥生成的全局唯一标识符(GUID)。
- 连接到实例。
- 执行以下命令,创建并进入文件夹。
mkdir -p ~/certs cd ~/certs
- 执行以下命令,创建用于密钥生成的全局唯一标识符(GUID)。
uuidgen --random > GUID.txt
- 创建平台密钥(必选)
平台密钥(PK)是UEFI安全启动实例的信任根。
- 执行以下命令创建密钥,并将变量命名为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)。您可以输入您自己企业的名称而不是平台密钥。
- 创建证书。
openssl x509 -outform DER -in PK.crt -out PK.cer
- 将证书转换为UEFI签名列表。
cert-to-efi-sig-list -g "$(< GUID.txt)" PK.crt PK.esl
- 使用私有PK签署UEFI签名列表。
sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt PK PK.esl PK.auth
- 执行以下命令创建密钥,并将变量命名为PK。
- 创建密钥交换密钥(必选)
私有密钥交换密钥(KEK)用于向签名数据库(DB)添加密钥,该数据库是用于在系统上启动的授权签名列表。
- 创建密钥。
openssl req -newkey rsa:4096 -nodes -keyout KEK.key -new -x509 -sha256 -days 3650 -subj "/CN=Key Exchange Key/" -out KEK.crt
- 创建证书。
openssl x509 -outform DER -in KEK.crt -out KEK.cer
- 将证书转换为UEFI签名列表。
cert-to-efi-sig-list -g "$(< GUID.txt)" KEK.crt KEK.esl
- 使用私有PK签署签名列表。
sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt KEK KEK.esl KEK.auth
- 创建密钥。
- 创建签名数据库(必选)
签名数据库(DB)列表包含授权在系统上启动的授权密钥。要修改签名数据库列表,需要私有密钥交换密钥(KEK)。
开启镜像安全启动时将使用此步骤中创建的私有密钥签名。
- 创建密钥。
openssl req -newkey rsa:4096 -nodes -keyout db.key -new -x509 -sha256 -days 3650 -subj "/CN=Signature Database key/" -out db.crt
- 创建证书。
openssl x509 -outform DER -in db.crt -out db.cer
- 将证书转换为UEFI签名列表。
cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl
- 使用私有密钥交换密钥(KEK)签署签名列表。
sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db db.esl db.auth
- 创建密钥。
- 创建禁用签名数据库(可选)
禁用签名数据库(DBX)的作用是禁用特定的db证书,可以是证书列表或哈希列表。
- 创建时间戳签名数据库(可选)
时间戳签名数据库(DBT)的作用是对签名时间戳进行签名,当db证书在dbx中,且dbx指定了吊销时间,如果签名时间在吊销时间之前,则db证书可以用于验签,否则不能用于验签。
使用密钥对ECS镜像进行签名
该操作需要对ECS镜像的内核文件和引导文件进行签名,不同CPU架构及操作系统存在差异,下面按不同CPU架构及操作系统进行介绍。
准备工作
执行以下命令,下载sbsign、efitools安装包。
mkdir -p ~/certs; cd ~/certs yum install mtools -y wget http://rpmfind.net/linux/almalinux/8.10/devel/x86_64/os/Packages/sbsigntools-0.9.4-11.el8.x86_64.rpm wget http://rpmfind.net/linux/almalinux/8.10/devel/x86_64/os/Packages/efitools-1.9.2-9.el8.x86_64.rpm rpm -ivh ./*.rpm
对内核文件签名
cd ~/certs sudo sbsign --key db.key --cert db.crt --output /boot/vmlinuz-$(uname -r).signed /boot/vmlinuz-$(uname -r) # 替换镜像文件 mv /boot/vmlinuz-$(uname -r).signed /boot/vmlinuz-$(uname -r)
对引导文件签名
cd ~/certs sudo sbsign --key db.key --cert db.crt --output /boot/efi/EFI/hce/grubx64.efi.signed /boot/efi/EFI/hce/grubx64.efi sudo sbsign --key db.key --cert db.crt --output /boot/efi/EFI/hce/shimx64.efi.signed /boot/efi/EFI/hce/shimx64.efi sudo sbsign --key db.key --cert db.crt --output /boot/efi/EFI/hce/mmx64.efi.signed /boot/efi/EFI/hce/mmx64.efi sudo sbsign --key db.key --cert db.crt --output /boot/efi/EFI/hce/fbx64.efi.signed /boot/efi/EFI/hce/fbx64.efi # 替换原文件 sudo mv -f /boot/efi/EFI/hce/grubx64.efi.signed /boot/efi/EFI/hce/grubx64.efi sudo mv -f /boot/efi/EFI/hce/shimx64.efi.signed /boot/efi/EFI/hce/shimx64.efi sudo mv -f /boot/efi/EFI/hce/mmx64.efi.signed /boot/efi/EFI/hce/mmx64.efi sudo mv -f /boot/efi/EFI/hce/fbx64.efi.signed /boot/efi/EFI/hce/fbx64.efi
替换BOOT目录下文件
cp /boot/efi/EFI/hce/shimx64.efi /boot/efi/EFI/BOOT/BOOTX64.EFI cp /boot/efi/EFI/hce/grubx64.efi /boot/efi/EFI/BOOT/grubx64.efi cp /boot/efi/EFI/hce/mmx64.efi /boot/efi/EFI/BOOT//mmx64.efi cp /boot/efi/EFI/hce/fbx64.efi /boot/efi/EFI/BOOT/fbx64.efi
准备工作
通过rpmfind.net网页,获得cert-to-efi-sig-list、sign-efi-sig-list命令行工具。
执行以下命令,下载pesign签名工具。
yum install pesign -y
准备签名环境
鲲鹏架构下,需要使用pesign工具将db.key和db.crt封装进NSS数据库。该操作需要输入密码,假设该密码是`${pwd}`,执行以下命令,将db证书合成PKCS#12文件:
openssl pkcs12 -export -inkey db.key -in db.crt -out db.p12 -name "My-DB-Cert"
# 创建并导入数据库
mkdir ./cert_db
certutil -N -d ./cert_db --empty-password
# 需要输入上一步的密码 ${pwd}
pk12util -i db.p12 -d ./cert_db 对内核文件签名
- 由于鲲鹏架构的Huawei Cloud EulerOS镜像的内核是gzip压缩格式,需要执行以下命令,还原成PE格式:
# 解压hce的vmlinuz文件 zcat /boot/vmlinuz-`uname -r` > /boot/vmlinuz.raw # 检查原vmlinuz文件的签名信息 pesign -i /boot/vmlinuz.raw -S
预期输出:
# pesign -i /boot/vmlinuz.raw -S --------------------------------------------- certificate address is 0xffff98e4c208 Content was not encrypted. Content is detached; signature cannot be verified. The signer's common name is HCE Secure Boot RSA Code-Signing Authority 2 No signer email address. No signing time included. There were certs or crls included. ---------------------------------------------
- 执行以下命令,对内核进行签名。
# 签名内核 pesign -n ./cert_db -c "My-DB-Cert" -s -i /boot/vmlinuz.raw -o /boot/vmlinuz-signed.eif -f
- 执行以下命令,检查签名是否可以验签。
openssl x509 -in db.crt -outform DER -out db.der pesigcheck -v -i /boot/vmlinuz-signed.eif -c db.der -n 1
预期输出:
linux-EjmSNO(AgentVM):~/certs # pesigcheck -v -i /boot/vmlinuz-signed.eif -c db.der -n 1 Searching dbx MokListXRT-605dab50-e046-4300-abb6-3dd810dd8b23 Searching db MokListRT-605dab50-e046-4300-abb6-3dd810dd8b23 Searching db db.der Searching dbx MokListXRT-605dab50-e046-4300-abb6-3dd810dd8b23 Searching db MokListRT-605dab50-e046-4300-abb6-3dd810dd8b23 Searching dbx MokListXRT-605dab50-e046-4300-abb6-3dd810dd8b23 Searching db MokListRT-605dab50-e046-4300-abb6-3dd810dd8b23 Certificate type not approved for application. Searching db db.der Certificate type not approved for application. Whitelist entry: put a breakpoint at pesigcheck.c:179 put a breakpoint at pesigcheck.c:172 cert: 0xaaaad7a5c038 put a breakpoint at pesigcheck.c:172 cert: 0xaaaad7a5c050 pesigcheck: "/boot/vmlinuz-signed" is valid.
对引导文件签名
- 执行以下命令,对原引导文件进行备份。
# 备份引导文件 cp /boot/efi/EFI/hce/shimaa64.efi /boot/efi/EFI/hce/shimaa64.efi.bak cp /boot/efi/EFI/hce/grubaa64.efi /boot/efi/EFI/hce/grubaa64.efi.bak cp /boot/efi/EFI/hce/mmaa64.efi /boot/efi/EFI/hce/mmaa64.efi.bak cp /boot/efi/EFI/hce/fbaa64.efi /boot/efi/EFI/hce/fbaa64.efi.bak
- 执行以下命令,对引导文件进行签名。
# 签名 pesign -n ./cert_db -c "My-DB-Cert" -s -i /boot/efi/EFI/hce/shimaa64.efi -o /boot/efi/EFI/hce/shimaa64.efi.signed -f pesign -n ./cert_db -c "My-DB-Cert" -s -i /boot/efi/EFI/hce/grubaa64.efi -o /boot/efi/EFI/hce/grubaa64.efi.signed -f pesign -n ./cert_db -c "My-DB-Cert" -s -i /boot/efi/EFI/hce/mmaa64.efi -o /boot/efi/EFI/hce/mmaa64.efi.signed -f pesign -n ./cert_db -c "My-DB-Cert" -s -i /boot/efi/EFI/hce/fbaa64.efi -o /boot/efi/EFI/hce/fbaa64.efi.signed -f
- 执行以下命令,确认签名是否成功。
pesign -i /boot/efi/EFI/hce/shimaa64.efi.signed -S pesign -i /boot/efi/EFI/hce/grubaa64.efi.signed -S pesign -i /boot/efi/EFI/hce/mmaa64.efi.signed -S pesign -i /boot/efi/EFI/hce/fbaa64.efi.signed -S
预期输出:
--------------------------------------------- certificate address is 0xffffa37bc008 Content was not encrypted. Content is detached; signature cannot be verified. The signer's common name is HCE Secure Boot RSA Code-Signing Authority 2 No signer email address. No signing time included. There were certs or crls included. --------------------------------------------- certificate address is 0xffffa37bcef8 Content was not encrypted. Content is detached; signature cannot be verified. The signer's common name is Signature Database key No signer email address. Signing time: Sun May 10, 2026 There were certs or crls included. ---------------------------------------------
- 执行以下命令,替换原来的引导文件。
mv /boot/efi/EFI/hce/shimaa64.efi.signed /boot/efi/EFI/hce/shimaa64.efi mv /boot/efi/EFI/hce/grubaa64.efi.signed /boot/efi/EFI/hce/grubaa64.efi mv /boot/efi/EFI/hce/mmaa64.efi.signed /boot/efi/EFI/hce/mmaa64.efi mv /boot/efi/EFI/hce/fbaa64.efi.signed /boot/efi/EFI/hce/fbaa64.efi
替换BOOT目录下文件
cp /boot/efi/EFI/hce/shimaa64.efi /boot/efi/EFI/BOOT/BOOTAA64.EFI cp /boot/efi/EFI/hce/fbaa64.efi /boot/efi/EFI/BOOT/fbaa64.efi cp /boot/efi/EFI/hce/mmaa64.efi /boot/efi/EFI/BOOT/mmaa64.efi
修改grub.cfg文件
- 执行以下命令,确保linux指令指向签名的未压缩内核:
vim /boot/grub2/grub.cfg
- 执行以下命令,将里面的linux路径指向解压后且已签名的内核文件:
linux路径为/vmlinuz-signed.eif,而不是/boot/vmlinuz-signed.eif。
... linux /vmlinuz-signed.eif .... ....
准备工作
执行以下命令,安装必要包。
apt install sbsigntool efitools uuid-runtime -y
mkdir ~/certs cd ~/certs sudo sbsign --key db.key --cert db.crt --output /boot/vmlinuz-$(uname -r).signed /boot/vmlinuz-$(uname -r) # 替换镜像文件 mv /boot/vmlinuz-$(uname -r).signed /boot/vmlinuz-$(uname -r)
cd ~/certs sudo sbsign --key db.key --cert db.crt --output /boot/efi/EFI/ubuntu/grubx64.efi.signed /boot/efi/EFI/ubuntu/grubx64.efi sudo sbsign --key db.key --cert db.crt --output /boot/efi/EFI/ubuntu/shimx64.efi.signed /boot/efi/EFI/ubuntu/shimx64.efi sudo sbsign --key db.key --cert db.crt --output /boot/efi/EFI/ubuntu/mmx64.efi.signed /boot/efi/EFI/ubuntu/mmx64.efi # 替换原文件 sudo mv /boot/efi/EFI/ubuntu/grubx64.efi.signed /boot/efi/EFI/ubuntu/grubx64.efi sudo mv /boot/efi/EFI/ubuntu/shimx64.efi.signed /boot/efi/EFI/ubuntu/shimx64.efi sudo mv /boot/efi/EFI/ubuntu/mmx64.efi.signed /boot/efi/EFI/ubuntu/mmx64.efi
cp /boot/efi/EFI/ubuntu/shimx64.efi /boot/efi/EFI/BOOT/BOOTX64.EFI cp /boot/efi/EFI/ubuntu/grubx64.efi /boot/efi/EFI/BOOT/grubx64.efi cp /boot/efi/EFI/ubuntu/mmx64.efi /boot/efi/EFI/BOOT/mmx64.efi
获取安全启动证书
请联系镜像提供方获取安全启动证书。
安全启动证书转码
- 平台密钥(Platform Key)转码
__platform_key=$(cat PK.cer | base64 -w 0)
- 密钥交换密钥(Key Exchange Key)转码
__key_exchange_key=$(cat KEK.cer | base64 -w 0)
- 签名数据库(Signature Database)转码
__signature_database=$(cat db.cer | base64 -w 0)
- 禁用签名数据库(Forbidden Signatures Database)转码
__forbidden_signatures_database=$(cat dbx.cer | base64 -w 0)
- 时间戳签名数据库(Timestamp Signatures Database)转码
__timestamp_signatures_database=$(cat dbt.cer | base64 -w 0)
- PK.cer为平台密钥(Platform Key)证书。
- KEK.cer为密钥交换密钥(Key Exchange Key)证书。
- db.cer为签名数据库(Signature Database)证书。
- dbx.cer为禁用签名数据库(Forbidden Signatures Database)证书。
- dbt.cer为时间戳签名数据库(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} 开启镜像安全启动
- 登录管理控制台。
- 单击管理控制台左上角的
,选择区域和项目。 - 选择“计算 > 镜像服务”,进入镜像服务页面。
- 单击“私有镜像”页签进入对应的镜像列表。
- 在镜像所在行的“操作”列下,单击“修改”。
- 在弹出的“修改镜像”对话框中,启动方式选择“UEFI”。
- 开启安全启动选项后,在选项下方的密钥数据库后面填写对应的输入内容。
- 单击“确定”。
配置ECS安全启动
- 登录管理控制台。
- 单击管理控制台左上角的
,选择区域和项目。 - 单击“
”,选择“计算 > 弹性云服务器”。 - 单击“购买弹性云服务器”,系统进入创建页。
- 根据业务需要,设置“可信系统”。
- 勾选“安全启动”,开启安全启动。
- 去勾选“安全启动”,关闭安全启动。
购买弹性云服务器的基础配置、网络配置以及高级配置,请参见自定义购买弹性云服务器。
- 单击“确认”,完成安全启动配置。
后续操作
- 验证是否启用了UEFI安全启动(Windows)
- 打开msinfo32工具。
- 检查Secure Boot State(安全启动状态)字段。
若Secure Boot State值为Supported(支持),表示已开启UEFI安全启动。

- 验证是否启用了UEFI安全启动(Linux)
- 在实例上,运行以下命令。
mokutil --sb
- 确认输出结果。
- 如果启用了UEFI安全启动,则输出结果中包含SecureBoot enabled。
- 如果未启用UEFI安全启动,则输出结果中包含SecureBoot disabled或Failed to read SecureBoot。

- 在实例上,运行以下命令。