QEMU 安全协议与数据模型(SPDM)支持

SPDM 提供认证、证明和密钥交换,帮助实现基础设施安全,是 DMTF 发布的标准。

QEMU 支持连接 SPDM 响应端实现,使外部应用能够仿真设备的响应逻辑。

设置 SPDM 服务器

使用 SPDM 设备时,QEMU 连接实现 SPDM 功能的服务器。

SPDM-Utils

可用 SPDM Utils 仿真响应端,这是最简单的方法。

SPDM-Utils 是管理、测试和开发 DMTF SPDM 设备的 Linux 应用, 以 Rust 编写,使用 libspdm。

使用 SPDM-Utils 需完成以下步骤,详情见其 README。

spdm-emu

可用 spdm emu 建模 SPDM 响应端。

$ cd spdm-emu
$ git submodule init; git submodule update --recursive
$ mkdir build; cd build
$ cmake -DARCH=x64 -DTOOLCHAIN=GCC -DTARGET=Debug -DCRYPTO=openssl ..
$ make -j32
$ make copy_sample_key # Build certificates, required for SPDM authentication.

证书应符合 PCIe r6.1 第 6.31.3 节,因此需向 openssl.cnf 添加以下内容:

subjectAltName = otherName:2.23.147;UTF8:Vendor=1b36:Device=0010:CC=010802:REV=02:SSVID=1af4:SSID=1100
2.23.147 = ASN1:OID:2.23.147

然后手动重新生成部分证书:

$ openssl req -nodes -newkey ec:param.pem -keyout end_responder.key \
    -out end_responder.req -sha384 -batch \
    -subj "/CN=DMTF libspdm ECP384 responder cert"

$ openssl x509 -req -in end_responder.req -out end_responder.cert \
    -CA inter.cert -CAkey inter.key -sha384 -days 3650 -set_serial 3 \
    -extensions v3_end -extfile ../openssl.cnf

$ openssl asn1parse -in end_responder.cert -out end_responder.cert.der

$ cat ca.cert.der inter.cert.der end_responder.cert.der > bundle_responder.certchain.der

也可改用 SPDM-Utils,它会自动生成正确的证书。

随后可启动响应端:

$ cd bin
$ ./spdm_responder_emu --trans PCI_DOE

连接 SPDM NVMe 设备

SPDM 服务器运行后,即可启动 QEMU 并连接。

对于 NVMe 设备,先准备块存储:

$ cd qemu-spdm/linux/image
$ dd if=/dev/zero of=blknvme bs=1M count=2096 # 2GB NNMe Drive

然后向 QEMU 命令行添加:

-drive file=blknvme,if=none,id=mynvme,format=raw \
    -device nvme,drive=mynvme,serial=deadbeef,spdm_port=2323,spdm_trans=doe

此时 QEMU 会尝试连接 SPDM 服务器。

x86_64 应使用 q35 而非默认机器,因此完整命令可能如下:

qemu-system-x86_64 -M q35 \
    --kernel bzImage \
    -drive file=rootfs.ext2,if=virtio,format=raw \
    -append "root=/dev/vda console=ttyS0" \
    -net none -nographic \
    -drive file=blknvme,if=none,id=mynvme,format=raw \
    -device nvme,drive=mynvme,serial=deadbeef,spdm_port=2323,spdm_trans=doe

spdm_trans 指定 QEMU 仿真的底层传输类型。PCIe NVMe 控制器支持 doe 和 nvme。 doe 通过 PCIe 扩展能力 Data Object Exchange(DOE)传输 SPDM; nvme 则使用 NVMe 管理命令 Security Send/Receive。