You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用AWS GoLang SDK V2实现IoT Core Fleet Provisioning设备端流程

AWS Go 设备端Fleet Provisioning实现方案

问题背景

已通过AWS Go SDK V2完成通用声明凭证的创建,现在需要在Linux设备上实现Fleet Provisioning流程,将通用声明凭证交换为设备专属的唯一凭证。已知Python SDK通过MQTT连接IoT Core端点,调用CreateKeysAndCertificate和RegisterThing完成该流程,但不清楚Go语言中如何通过通用声明凭证建立连接并执行这些操作。

核心思路

设备端的Fleet Provisioning需通过MQTT协议与AWS IoT Core交互,而非服务端SDK的HTTP客户端。需使用AWS IoT Device SDK for Go V2来建立MQTT连接,并通过预定义的MQTT主题调用Fleet Provisioning相关操作。

实现步骤与代码示例

1. 依赖准备

确保项目引入AWS IoT Device SDK for Go V2的相关模块:

go get github.com/aws/aws-iot-device-sdk-go-v2
go get github.com/aws/aws-iot-device-sdk-go-v2/pkg/iotfleetprovisioning
go get github.com/aws/aws-iot-device-sdk-go-v2/pkg/iotidentity

2. 设备端实现代码

package main

import (
	"context"
	"crypto/tls"
	"crypto/x509"
	"fmt"
	"io/ioutil"
	"log"
	"time"

	"github.com/aws/aws-iot-device-sdk-go-v2/pkg/iotfleetprovisioning"
	"github.com/aws/aws-iot-device-sdk-go-v2/pkg/iotidentity"
	"github.com/aws/aws-iot-device-sdk-go-v2/pkg/mqtt"
)

const (
	// IoT Core端点,可通过AWS控制台或CLI获取
	iotEndpoint = "your-iot-core-endpoint-ats.iot.region.amazonaws.com"
	// 通用声明凭证路径
	genericClaimCertPath = "./generic-claim-cert.pem"
	genericClaimKeyPath  = "./generic-claim-private.key"
	// AWS根CA证书路径
	rootCAPath = "./AmazonRootCA1.pem"
	// 预创建的Provisioning模板名称
	templateName = "your-provisioning-template-name"
	// 设备唯一标识(比如序列号、MAC地址等)
	deviceSerial = "device-001"
)

func main() {
	ctx := context.Background()

	// 1. 加载通用声明凭证和根CA
	genericCert, err := tls.LoadX509KeyPair(genericClaimCertPath, genericClaimKeyPath)
	if err != nil {
		log.Fatalf("加载通用凭证失败: %v", err)
	}

	rootCA, err := ioutil.ReadFile(rootCAPath)
	if err != nil {
		log.Fatalf("读取根CA失败: %v", err)
	}

	certPool := x509.NewCertPool()
	certPool.AppendCertsFromPEM(rootCA)

	// 2. 配置MQTT客户端
	config := mqtt.NewClientConfig()
	config.WithEndpoint(iotEndpoint)
	config.WithTLSConfig(&tls.Config{
		Certificates: []tls.Certificate{genericCert},
		RootCAs:      certPool,
	})
	config.WithClientID(fmt.Sprintf("fleet-provisioning-client-%d", time.Now().Unix()))

	client := mqtt.NewClient(config)

	// 3. 建立MQTT连接
	connAck, err := client.Connect(ctx)
	if err != nil {
		log.Fatalf("MQTT连接失败: %v", err)
	}
	log.Printf("MQTT连接成功,ConnAck: %v", connAck)
	defer client.Disconnect(ctx)

	// 4. 创建设备专属证书和密钥
	createCertReq := &iotidentity.CreateKeysAndCertificateRequest{}
	createCertResp, err := iotidentity.NewCreateKeysAndCertificateOperation(client).Call(ctx, createCertReq)
	if err != nil {
		log.Fatalf("调用CreateKeysAndCertificate失败: %v", err)
	}
	log.Printf("获取设备专属凭证成功: 证书ARN: %s", *createCertResp.CertificateArn)

	// 5. 注册设备(关联证书与Thing)
	registerReq := &iotfleetprovisioning.RegisterThingRequest{
		TemplateName: templateName,
		Parameters: map[string]string{
			"SerialNumber": deviceSerial, // 对应模板中的参数
		},
		CertificateOwnershipToken: createCertResp.CertificateOwnershipToken,
	}

	registerResp, err := iotfleetprovisioning.NewRegisterThingOperation(client).Call(ctx, registerReq)
	if err != nil {
		log.Fatalf("调用RegisterThing失败: %v", err)
	}
	log.Printf("设备注册成功: Thing名称: %s", *registerResp.ThingName)

	// 6. 保存设备专属凭证到本地
	err = ioutil.WriteFile("./device-cert.pem", []byte(*createCertResp.CertificatePem), 0600)
	if err != nil {
		log.Fatalf("保存设备证书失败: %v", err)
	}

	err = ioutil.WriteFile("./device-private.key", []byte(*createCertResp.KeyPair.PrivateKey), 0600)
	if err != nil {
		log.Fatalf("保存设备私钥失败: %v", err)
	}

	log.Println("设备端Fleet Provisioning流程完成")
}

关键说明

  • MQTT连接:使用通用声明凭证建立TLS连接,这是设备端调用Fleet Provisioning操作的基础。
  • 封装操作:iotidentity.CreateKeysAndCertificateOperation和iotfleetprovisioning.RegisterThingOperation已封装了对应的MQTT主题,无需手动构造主题路径。
  • 参数匹配:Parameters中的字段需与Provisioning模板中定义的参数一致,用于生成唯一的Thing名称或其他资源。
  • 凭证存储:设备专属凭证需妥善保存,后续设备连接IoT Core时将使用该凭证完成身份认证。

内容的提问来源于stack exchange,提问作者PhilBot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:01:10