阿里云上启动enclave 并与宿主机通信
首先创建阿里云可信执行环境
可以选择的 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 mainimport ("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.eifsudo enclave-cli run-enclave --cpu-count 2 --memory 1024 --eif-path vsock-server.eif
client 运行在宿主机中
package mainimport ("fmt"// "io""log""github.com/mdlayher/vsock"
)func main() {// 替换成 describe-enclaves 查到的 EnclaveCIDconst cid = 4const port = 5005conn, 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
参考代码