阿里云上启动enclave 并与宿主机通信

发布于:2025-09-09 ⋅ 阅读:(13) ⋅ 点赞:(0)

首先创建阿里云可信执行环境

可以选择的 c8i 4vCPU 及以上的机型。 因为至少两个CPU。

阿里云的每台ECS实例只允许创建一个Enclave。
创建实例参考
在这里插入图片描述
在实例中安装docker,并安装 Enclave CLI ,同样参考阿里云构建Enclave机密环境。

成功安装enclave 环境后,实现如下效果:
在这里插入图片描述

在这里插入图片描述

至此,enclave 的环境准备完成。

构建enclave 镜像

我们将要在tee中执行的程序打包成docker,并创建enclave 镜像。
在enclave 中运行 eif 镜像。 官方教程

enclave 与 宿主机通信

enclave 中的程序只能通过 vsock 与宿主机进行通信。安装完 enclave cli之后就有了 vsock 环境

我们常见的 tcp udp 的程序是无法直接通信的,必须要使用vsock 的sdk 来编写程序实现通信。
我使用了"github.com/mdlayher/vsock" 实现通信过程。

server 运行在 enclave 中

package main


import (
    "fmt"
    "io"
    "log"
    "github.com/mdlayher/vsock"
)

func main() {
    const port = 5005

    // 监听所有 CID 的 vsock 端口
    l, err := vsock.Listen(port, nil)
    if err != nil {
        log.Fatalf("listen error: %v", err)
    }
    defer l.Close()

    fmt.Printf("Enclave listening on vsock port %d...\n", port)

    for {
        conn, err := l.Accept()
        if err != nil {
            log.Fatalf("accept error: %v", err)
        }
        go func(c io.ReadWriteCloser) {
            defer c.Close()
            buf := make([]byte, 1024)
            n, _ := c.Read(buf)
            fmt.Printf("Enclave got: %s\n", string(buf[:n]))
            c.Write([]byte("Hello from Enclave"))
        }(conn)
    }
}

我们构建一个docker镜像,将server 程序打包进去。

# Dockerfile
FROM golang:1.23.7 AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
# 动态链接二进制
RUN go build -trimpath -ldflags="-s -w" -o /out/server .

# 运行层:带 glibc 的 distroless
FROM gcr.io/distroless/base-debian12
COPY --from=build /out/server /server
ENTRYPOINT ["/server"]

运行server

docker build -t vsock-server:1.0 .

sudo enclave-cli build-enclave --docker-uri vsock-server:1.0 --output-file vsock-server.eif

sudo enclave-cli run-enclave --cpu-count 2 --memory 1024 --eif-path  vsock-server.eif

client 运行在宿主机中

package main

import (
    "fmt"
    // "io"
    "log"
    "github.com/mdlayher/vsock"
)

func main() {
    // 替换成 describe-enclaves 查到的 EnclaveCID
    const cid = 4
    const port = 5005

    conn, err := vsock.Dial(cid, port, nil)
    if err != nil {
        log.Fatalf("dial error: %v", err)
    }
    defer conn.Close()

    conn.Write([]byte("Ping from Host"))
    buf := make([]byte, 1024)
    n, _ := conn.Read(buf)
    fmt.Printf("Host got: %s\n", string(buf[:n]))
}

运行client
在这里插入图片描述

参考代码


网站公告

今日签到

点亮在社区的每一天
去签到