---
title: 远程证明
description: "机密虚拟机已支持远程证明功能，可通过远程证明实现对机密虚拟机运行环境度量和基线值比对，证明应用运行在符合预期、可信任的机密虚拟机环境中。本章节主要介绍远程证明相关组件部署以及远程证明参考示例使用。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/252RC2/confidt/kunpengtee_16_0029.html
sourcePath: /source/zh/kunpengboostkithistory/252RC2/confidt/kunpengtee_16_0029.html
indexId: 4e4f610ace0376cc683fd9f06f48c2e3f4b413f80de62f061130a8085745b94c72
---
# 远程证明

机密虚拟机已支持远程证明功能，可通过远程证明实现对机密虚拟机运行环境度量和基线值比对，证明应用运行在符合预期、可信任的机密虚拟机环境中。本章节主要介绍远程证明相关组件部署以及远程证明参考示例使用。

#### 远程证明SDK部署

参考以下步骤完成远程证明SDK部署，软件包版本、获取方式参见表2。

1. 安装远程证明库。

```
yum install virtCCA_sdk virtCCA_sdk-devel
```


2. 安装编译依赖

```
yum install tar cmake make git gcc gcc-c++ openssl-devel glib2-devel rsync patch
```


3. 编译、安装QCBOR组件。

```
git clone https://github.com/laurencelundblade/QCBOR.git -b v1.2
cd QCBOR
make
make install
cd ..
```


  若git clone失败，可先执行以下命令取消git clone过程中SSL校验后重试。 git config --global http.sslVerify false

4. 编译、安装t_cose组件。

```
git clone https://github.com/laurencelundblade/t_cose.git -b v1.1.2
cd t_cose
cmake -S . -B build -DCRYPTO_PROVIDER=OpenSSL
cmake --build build
cmake --install build
cd ..
```


#### 获取虚拟机基线度量值

参考以下步骤获取机密虚拟机基线度量值。


1. 生成DTB设备树二进制文件。

  a. 编辑cVM的xml配置，增加如下透传QEMU参数。

```
<qemu:arg value='-machine'/>
<qemu:arg value='dumpdtb=/path/to/dump.dtb'/>
```


    其中dumpdtb为指定的DTB生成路径。

  b. 启动cVM虚拟机，将在指定路径下生成dtb文件。

```
virsh define <cvm.xml>
virsh start <cvm>
```


  c. 编辑cVM虚拟机xml配置，删除增加的QEMU透传参数。
2. 基于gen_rim_ref获取cVM基线度量值。gen_rim_ref由virtCCA_sdk软件包提供。

```
gen_rim_ref -f <firmware_path> -d <dtb_path> -v <vcpu_num> -s <sve_vector_length> -m <pmu_counter_num>
```

其中：

  - dtb_path：为cVM的设备树二进制文件。
  - vcpu_num：为cVM虚拟机配置虚拟CPU个数。
  - firmware_path：为cVM配置的UEFI固件路径。
  - sve_vector_length：为cVM配置sve向量长度，不传递默认为0。
  - pmu_counter_num：为cVM配置pmu数量，不传递默认为0。
默认使用的hash算法为SHA256，若需要使用SHA512，可修改gen_rim_ref源码中的hash_algo为1。gen_rim_ref源码位于“virtCCA_sdk/attestation/rim_ref/”下。


#### 远程证明Demo示例

提供远程证明示例Demo，该Demo提供了简单的远程证明流程参考代码，仅用于验证TEE远程证明功能，用户可基于Demo参考实现远程证明。请参考以下步骤完成远程证明示例编译、安装和运行。

1. 编译远程证明报告获取和验证的参考代码。

```
git clone https://gitee.com/openeuler/virtCCA_sdk.git -b 0.1.17
cd virtCCA_sdk/attestation/samples
cmake -S . -B build
cmake --build build
cd -
```


  编译成功后，可在“virtCCA_sdk/attestation/samples/build”目录下查看生成client、server可执行文件。

  server端（二进制）包含了调用远程证明库获取远程证明报告的代码，仅供参考。 client端（二进制）包含了远程证明报告解析和验证的代码，仅供参考。 server和client使用TCP进行数据传递，出于安全考虑，建议优先使用rats-tls。

2. 请参见启动虚拟机完成机密虚拟机的启动，并将server部署到虚拟机任意目录下。
3. 在虚拟机内启动server。

```
./server -i <
ip
> -p <
port
>
```

其中：

  - 可选：ip：服务端配置的IP地址。默认为本地回环。
  - 可选：port：服务端配置的端口。默认为7220。
4. client发起远程证明请求。

```
./client -i <ip> -p <port> -m <measurement> [-e] -f </path/image_reference_measurement.json> -P </path/software_components.json>
```


  - 可选：ip：要连接的服务端IP地址。默认为本地回环。
  - 可选：port：要连接的服务端端口。默认为7220。
  - measurement：cVM初始度量基线值。
  - 可选：-e：打印机密虚拟机ACPI table和Event Log相关信息。（UEFI ONLY）
  - image_reference_measurement.json：文件包含了qcow2镜像中各个组件的Hash值，用于验证qcow2镜像中各个组件的完整性，此处的json文件为    制作机密虚拟机qcow2镜像
生成的image_reference_measurement.json。
    software_components.json : 用于验证platform_token中涉及的各个底层组件。随BIOS发行版本出包带入。

    示例:

```
{
"header": {
"timestamp": "2025-01-14",
"copyright": "Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.",
"version": "2.0",
"description": "Platform reference values for CCA token verification"
},
"hostBios": [
{
"biosVersion": "21.21.0",
"biosVendor": "Huawei Corp.",
"pcrs": [
{
"pcrIndex": "0",
"description": "BIOS",
"sha256": "fa4caa9e3c17efbf3aa9d40a5316dd31cae54cdbee74bb1df666e0ce8d5c82e2"
},
{
"pcrIndex": "0",
"description": "BIOS",
"sm3": "6c9bbf28432f525519aadfc1d635e96980e66b1d7aa5b67cbdb0acb6ab014fd2"
}
],
"measure_value": [
{
"firware_name": "ipu",
"measurement": "1d018904e20291089280073eb1abcbedbff9334f916ba725daa8474d524ee1c0",
"firware_version": "21.21.0",
"hash_algorithm": "sha256"
},
{
"firware_name": "imu",
"measurement": "a7311708162e6336cf765527345953e54fb18d7ee0960ca34465404e21ebf288",
"firware_version": "21.21.0",
"hash_algorithm": "sha256"
},
{
"firware_name": "imf_ap",
"measurement": "4de464130279547206a15ee2f7ecc1357daecf5e24091fc0a08dab28e0c4bf2f",
"firware_version": "21.21.0",
"hash_algorithm": "sha256"
},
{
"firware_name": "tf_bl2",
"measurement": "b32c4018835b6c637f7841526adf2b6f2c5589f38872f11a9acd3a07bb30e96c",
"firware_version": "21.21.0",
"hash_algorithm": "sha256"
},
{
"firware_name": "uefi",
"measurement": "afe614b7be8ad6e0aceb9c0a2d3d2ebfa13bfb0bafd72f8522c3674945b62b17",
"firware_version": "21.21.0",
"hash_algorithm": "sha256"
},
{
"firware_name": "tee",
"measurement": "c96ce76d3a6953ba7fa476bbe6ffef3a5d0881753bf63bc63d19a8ebaa2c8fc2",
"firware_version": "1.27",
"hash_algorithm": "sha256"
}
]
}
]
}
```


    client侧远程证明报告验签成功运行截图：


#### rats-tls适配示例

rats-tls是一种支持异构硬件可执行环境的双向传输层安全性协议，提供更为安全的数据传输。TEE套件完成了rats-tls的适配支持，并提供简单的demo样例，仅用于验证rats-tls的双向验证功能，客户可基于此demo开发自己的远程证明应用。

1. rats-tls编译依赖安装。

```
git clone https://github.com/PJK/libcbor.git
cd libcbor
cmake -S . -B build
cmake --build build
cmake --install build
cd -
```


2. 准备rats-tls源码，基于指定commit点合入rats-tls支持TEE套件的patch。

```
git clone https://github.com/inclavare-containers/rats-tls.git
cd rats-tls
git reset --hard 40f7b78403d75d13b1a372c769b2600f62b02692
git apply ../virtCCA_sdk/attestation/rats-tls/*.patch
```


  要求rats-tls源码目录与virtCCA_sdk源码目录平级。

3. 编译rats-tls样例代码和依赖库。

```
bash build.sh -s -r -c -v gcc
```


  检查“bin”目录下是否已生成软件包。

4. 远程证明服务端部署。将编译好的rats-tls.tar.gz拷贝到cVM内，解压后拷贝到系统目录。

```
tar xvf rats-tls.tar.gz
cp -rf lib/rats-tls /usr/lib/
cp -rfL lib/rats-tls/librats_tls.so.0 /lib64/
```


5. 启动rats-tls的服务端Demo。

```
./virtcca-server -i <ip>
```


  可选参数同rats-tls原始提供的样例，可执行以下命令查看。 ./virtcca-server -h

6. 请参见4在证明客户端完成rats-tls库的部署，并启动rats-tls的客户端demo。
```
./virtcca-client -i
<ip
> -r <
measurement
> -f </path/image_reference_measurement.json>
```

其中：

  - 可选：ip：服务端的IP地址，默认为本地回环。
  - measurement：cVM的基线度量，请参见    获取虚拟机基线度量值
。
  - image_reference_measurement.json：验证qcow2镜像中各个组件的HASH值json文件，    制作机密虚拟机qcow2镜像
生成的image_reference_measurement.json。
