快速使用Enclave CLI

本文介绍如何在一个支持阿里云虚拟化Enclave的实例中使用CLI构建并启动一个Enclave,在确认其运行正常后再将其停止运行,以帮助您快速掌握Enclave全生命周期的操作方法。

操作步骤

  1. 创建一个支持Enclave的实例并为Enclave进行资源预分配。

    具体操作,请参见安装Enclave CLI

  2. 构建Enclave镜像文件。

    安装Enclave CLI后,在/usr/share/ali-enclaves/examples/hello目录中包含一个Dockerfile示例,可用于构建Enclave镜像文件。

    1. 执行如下命令,根据Dockerfile示例构建名为hello、标签为latest的Docker镜像。

      sudo docker build /usr/share/ali-enclaves/examples/hello -t hello
    2. 执行如下命令,检查Docker镜像是否已构建成功。

      sudo docker images hello:latest

      当返回信息中有名为hello、标签为latest的Docker镜像的相关信息时,表示Docker镜像已构建成功。

      image.png

    3. 执行如下命令,使用Enclave CLI根据此Docker镜像构建名为hello.eif的Enclave镜像文件。

      sudo enclave-cli build-enclave --docker-uri hello:latest --output-file hello.eif

      若Enclave CLI未报错,则Enclave镜像文件hello.eif构建成功。Enclave CLI输出的PCR值为Enclave的特征哈希值,可用于远程证明。返回示例如下所示:

      Start building the Enclave Image...
      Enclave Image successfully created.
      {
        "Measurements": {
          "HashAlgorithm": "Sha256 { ... }",
          "PCR11": "dc5dcd841f87e2b6c0e65a11b46b25ebe2999a8a5f0318e10c0175b60000****",
          "PCR8": "2c6944f47864f1f8ab276000a9f057fcdf9f56a015c0bc5e2339f24b0000****",
          "PCR9": "8ef5fe53a7709cc1c1a0aa7b5149a55bcd524cccc9f43e7a3baf44ca0000****"
        }
      }
  3. 执行如下命令,启动Enclave。

    您可以使用创建完成的hello.eif镜像文件启动一个Enclave,以下命令会基于此Enclave镜像文件以调试模式启动一个Enclave。该Enclave拥有2 vCPU和1024 MiB内存。更多参数说明,请参见运行Enclave

    sudo enclave-cli run-enclave --cpu-count 2 --memory 1024 --eif-path hello.eif --debug-mode

    以下返回信息表示Enclave启动成功。在以下输出样例中,该Enclave的ID为4f39d839-0f7a-4bee-a09d-93b8b1d6****-enc1,后续使用Enclave CLI管理该Enclave时需指定此ID。

    说明

    该Enclave的CID(context identifier,即vsock地址)为4,为系统自动分配。此CID在vsock通信中类似于标准网络通信中的IP地址,vsock是实例与非调试模式Enclave之间唯一的可用信道。

    Start allocating memory...
    Started enclave with enclave-cid: 4, memory: 1024 MiB, cpu-ids: [2, 3]
    {
        "EnclaveID": "4f39d839-0f7a-4bee-a09d-93b8b1d6****-enc1",
        "ProcessID": 1234,
        "EnclaveCID": 4,
        "NumberOfCPUs": 2,
        "CPUIDs": [
            2,
            3
        ],
        "MemoryMiB": 1024
    }
  4. 执行如下命令,查看Enclave运行状态。

    enclave-cli describe-enclaves

    该命令的返回信息中会展示Enclave ID、vCPU数量、内存大小和状态等信息,其状态为RUNNING,表示Enclave运行正常。

    [
      {
        "EnclaveID": "4f39d839-0f7a-4bee-a09d-93b8b1d6****-enc1",
        "ProcessID": 1234,
        "EnclaveCID": 4,
        "NumberOfCPUs": 2,
        "CPUIDs": [
          2,
          3
        ],
        "MemoryMiB": 1024,
        "State": "RUNNING",
        "Flags": "DEBUG_MODE"
      }
    ]

    此外,由于该Enclave以调试模式运行,您还可以通过如下命令查看Enclave的调试输出。

    enclave-cli console --enclave-id 4f39d839-0f7a-4bee-a09d-93b8b1d6****-enc1

    当Enclave运行正常时,其输出应为如下所示内容。

    [   1] Hello from the enclave side!
    [   2] Hello from the enclave side!
    [   3] Hello from the enclave side!
    ...
    说明

    本示例中Enclave会每五秒打印一句Hello from the enclave side!,方括号中的数字表示打印的当前次数。

  5. 执行如下命令,终止Enclave。

    sudo enclave-cli terminate-enclave --enclave-id 4f39d839-0f7a-4bee-a09d-93b8b1d6****-enc1

    以下返回信息表示终止Enclave成功。

    Successfully terminated enclave 4f39d839-0f7a-4bee-a09d-93b8b1d6****-enc1.
    {
      "EnclaveID": "12345678-1234-5678-1234-12345678****-enc1",
      "Terminated": true
    }