---
title: 容器内远程证明
description: "TEE OS从1.4.0起，为支持容器内的远程证明，新增了QCA daemon、QCA lib-report、QTA-report，其中QCA lib-report和QTA-report可从iTrustee SDK仓中获取源码，qca_daemon可从kunpengsecl仓源码获取。相比于主机侧的远程证明，主要增加容器内组件的部署，和主机侧新增配置。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcctrustzone/trustzone/fg/kunpengtrustzone_20_0054.html
sourcePath: /source/zh/kunpengcctrustzone/trustzone/fg/kunpengtrustzone_20_0054.html
indexId: 970939f57fd11887ecad5d3576bb5fa2a9de21ca4e30d87873ab40aa1c37ea0072
---
# 容器内远程证明

TEE OS从1.4.0起，为支持容器内的远程证明，新增了QCA daemon、QCA lib-report、QTA-report，其中QCA lib-report和QTA-report可从iTrustee SDK仓中获取源码，qca_daemon可从kunpengsecl仓源码获取。相比于主机侧的远程证明，主要增加容器内组件的部署，和主机侧新增配置。

#### host侧组件部署

1. 进入1下载kunpengsecl仓，切换到容器支持的分支。

```
cd
kunpengsecl
git checkout -b container_support origin/feature/container_support
```


2. 将kunpengsecl里新增容器信息删除接口的Patch合入QCA lib和QTA中。

```
cd itrustee_sdk/
git apply ../kunpengsecl/attestation/tee/tverlib/simulator/0001-libqca-qta-add-delete-interface.patch
```


3. 编译host侧支持容器远程证明的QCA lib，并重新部署。

```
cd itrustee_sdk/test/CA/libqca/
make clean; make TARGET_HOST_QCA=y
cp output/libqca.so /usr/lib64/
```


4. 在QTA源码中给qcaserver赋权，修改如下文件。

  a. 打开文件。

```
vim itrustee_sdk/test/TA/qta/src/tee_qta.c
```


  b. 按“i”键进入编辑模式，并增加如下内容。

```
ret = addcaller_ca_exec("/vendor/bin/qcaserver", "root");
if (ret != TEE_SUCCESS)
return ret;
```


  c. 按“Esc”键退出编辑模式，输入:wq!并按“Enter”键保存退出文件。
5. 编译host侧的QTA，将host侧QTA的config和私钥，放到itrustee_sdk/build/signtools/的signed_config和TA_cert目录下，并按申请QTA证书时配置的configs.xml资源文件修改manifest/manifest.txt。

```
cd itrustee_sdk/test/TA/qta/
make clean; make TARGET_HOST_QTA=true
cp e08f7eca-e875-440e-9ab0-5f381136c600.sec /var/itrustee/ta/
```


6. 重新编译演示Demo，并重新部署qcaserver。

```
cd kunpengsecl
make clean && make build
cp
attestation/tee/demo/pkg/qcaserver /vendor/bin/
```


#### 容器内组件部署

容器内支持远程证明，除按机密容器支持部署启动容器外，需新增qca_daemon、QCA lib-report、QTA-report的部署。如果容器操作系统与主机侧有差异，建议在容器内重新编译三者；如果相同，可直接复用编译部署QCA lib和QTA和编译演示Demo下载的源码和编译环境，使用如下命令重新编译后，将三个组件拷贝到容器。以下步骤在容器内操作，编译环境可参考前文host侧的步骤。

1. 编译容器侧的QCA lib-report。

```
cd itrustee_sdk/test/CA/libqca/
make clean; make TARGET_CONTAINER_QCA=y
```


2. 在QTA源码中给qca_daemon赋权，修改如下文件。

  a. 打开文件。

```
vim itrustee_sdk/test/TA/qta/src/tee_qta.c
```


  b. 按“i”键进入编辑模式，并增加如下内容。

```
ret = addcaller_ca_exec("/vendor/bin/qca_daemon", "root");
if (ret != TEE_SUCCESS)
return ret;
```


  c. 按“Esc”键退出编辑模式，输入:wq!并按“Enter”键保存退出文件。
3. 编译容器侧的QTA-report并部署。将QTA-report的config和私钥，放到“itrustee_sdk/build/signtools/的signed_config”和“TA_cert”目录下，并按申请qta-report证书时配置的configs.xml资源文件修改“manifest/manifest-report.txt”。

```
cd itrustee_sdk/test/TA/qta/
make clean; make TARGET_QTA_REPORT=true
cp 4f84c0e0-4c3f-422f-97dc-14bfa2314ad1.sec /var/itrustee/ta/
```


  QTA-report和QTA一样，作为远程证明的特权TA，限定QTA-report的uuid为4f84c0e0-4c3f-422f-97dc-14bfa2314ad1，service_name可予以替换。 编译完毕后，在当前目录“hash_4f84c0e0-4c3f-422f-97dc-14bfa2314ad1.txt”中可以查看QTA-report的基准度量值，在后续RA client验证容器内TA度量报告时，需要验证QTA-report的基准度量。

4. 编译qca_daemon并部署，请参见host侧组件部署完成编译后，会在“kunpengsecl/attestation/tee/demo/pkg”生成qca_daemon。

```
cd kunpengsecl
make clean && make build
cp
kunpengsecl/attestation/tee/demo/pkg/qca_daemon /vendor/bin/
```


  如果直接在host上编译然后拷贝到容器，上述三组件依赖的so也需拷贝到容器内。比如libteec_adaptor.so和libboundscheck.so等。


#### 演示Demo

1. 参见窗口1在host侧启动AS服务。
2. 参见窗口2在host侧部署RA Service，为使RA Service能够侦听qca_daemon请求，并建立连接，RA Service需新增一个socket服务。
  a. 为使创建的socket服务对外不可见，只供本机容器使用，可将服务建立在私有IP地址上，可参考如下方法配置服务器。

```
# 创建私有IP地址
ifconfig enp125s0f0:remote 10.10.10.10 netmask 255.255.255.0 up
# 防火墙开放端口
firewall-cmd --zone=public --add-port=9000/tcp
```


  b. 进入RA Service配置文件目录。

```
cd kunpengsecl/attestation/tee/demo/qca_demo/cmd
```


  c. 增加socket服务的配置，打开文件。

```
vim config.yaml
```


  d. 按“i”键进入编辑模式，并按需求修改如下内容。

```
qcaconfig:
virtual:
server: 10.10.10.10:9000  # RA service增加的tcp服务端口，侦听容器里的qca_daemon连接请求
healthcheck: 10           # 检查连接有效性的周期，单位minute, 范围0-7天。
```


  e. 按“Esc”键退出编辑模式，输入:wq!并按“Enter”键保存退出文件。
  f. 在RA Service启动时增加-V命令行参数，表示支持容器和虚拟机。

```
/vendor/bin/qcaserver -V true -C 1
```


3. 参见机密容器支持启动容器，并在容器内启动qca_daemon。启动后会在当前目录生成qca_daemon.log日志文件。

```
/vendor/bin/qca_daemon -H 10.10.10.10:9000
```


4. 在容器内启动待验证TA。

```
/vendor/bin/rsa_demo
```


5. 参见窗口4配置待验证TA信息和AS服务证书。然后增加待验证TA运行的容器信息，并在基准度量文件中增加qta-report的基准度量值。
```
cd kunpengsecl/attestation/tee/demo/attester_demo/cmd
```


  a. 修改配置文件。

```
vim config.yaml
```


  b. 按“i”键进入编辑模式，增加容器信息。

```
attesterconfig:
virtualguest:      # 待验证TA运行的容器信息
id: xxxxx        # 如果是容器，为64位容器ID; 如果为虚拟机,为36位虚拟机uuid
type: docker     # 目前只支持Docker和KVM
```


  c. 按“Esc”键退出编辑模式，输入:wq!并按“Enter”键保存退出文件。
  d. 在基准度量文件中增加QTA-report基准度量值。

```
vim basevalue.txt
```


  e. 按“i”键进入编辑模式，增加QTA-report基准度量值。

```
....
4f84c0e0-4c3f-422f-97dc-14bfa2314ad1 <img_hash> <mem_hash>
```


  f. 按“Esc”键退出编辑模式，输入:wq!并按“Enter”键保存退出文件。
6. RA client发起度量请求。

```
go run main.go -M 1
```


  当前机密计算不支持mem-hash度量。
