设备用私有CA签发的X.509证书接入IoT物联网平台

简介: X.509证书接入IoT物联网平台

1.创建产品和注册设备



1.1 创建产品(用私有CA认证)

  • 登录IoT物联网平台控制台
  • 在左侧导航栏,选择设备管理 > 产品
  • 在产品管理页,单击创建产品
  • 选择直连设备,认证方式选择X.509证书, 使用私有CA证书勾选

image.png
产品创建完成后,如下图:
image.png

注册设备

基于已创建的空气净化器产品,添加设备,输入设备deviceName。
image.png
注册完成后,设备处于未激活状态,其中X.509证书为空
image.png

制作设备证书

我们使用已经在IoT物联网平台注册的私有CA证书,来签发设备证书。
openssl的操作指令如下,其中CN可以填写deviceName。

# 生成pem的私有key
openssl genrsa -out device-1.key 2048
# 生成设备证书CSR
openssl req -new -key device-1.key -out device-1.csr -newkey -subj \
"/C=CN/ST=Shanghai/L=Shanghai/O=IoT/OU=iot/CN=dn3023842"
# -set_serial 指定序列号

# 用私有CA签发设备证书CRT
openssl x509 -req -in device-1.csr -CA myIoTCARoot.crt -CAkey myIoTCARoot.key -CAcreateserial -out device-1.crt -days 3650 -sha512
# 查看设备证书SN
openssl x509 -noout -text -in device-1.crt

证书生成后,我们可以查看设备证书的SN码。
image.png

绑定设备证书

绑定设备与设备证书

IoT物联网平台需要用户上传设备ProductKey,DeviceName和设备证书SN的映射关系的csv文件,内容格式如下:

ProductKey,DeviceName,CertSN
a15GiUoOzAL,dn032836,dd3dc180a02768d7


IoT物联网平台控制台证书详情页面,上传CSV文件,完成绑定。
image.png
绑定成功后,我们可以点击查看绑定结果:
image.png

设备激活

我们以Java设备为例,介绍设备以私有证书接入过程。

  • Java原生代码只能使用PKCS#8格式,我们需要用OpenSSL来进行转换,命令如下:
# 转换格式PKCS#8
openssl pkcs8 -topk8 -inform PEM -in device-1.key -out device-1_pkcs8.key -nocrypt


  • 使用TLS方式(securemode=2)将设备接入物联网平台,需使用物联网平台根证书。

请下载根证书,然后将根证书放置到resource目录下。

  • 使用iot_root.crt、设备证书、设备证书私钥来构造 SSLSocketFactory实例。
protected SSLSocketFactory createSSLSocket() throws Exception {

        // 物联网平台根证书,可以从官网文档中下载https://help.aliyun.com/document_detail/73742.html
        // 设备X.509证书,可以从控制台设备信息中下载。
        // 用来验证IoT平台的CA证书
        InputStream in = IotMqttClientWithAuthByX509.class.getResourceAsStream("/iot_root.crt");
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        Certificate ca = cf.generateCertificate(in);
        in.close();
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(keyStore);

        // 传入设备证书、证书证书私钥
        InputStream certIn = IotMqttClientWithAuthByX509.class.getResourceAsStream(certPath);
        CertificateFactory certCf = CertificateFactory.getInstance("X.509");
        Certificate certCa = certCf.generateCertificate(certIn);
        certIn.close();
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        ks.load(null, null);
        ks.setCertificateEntry("certificate", certCa);
        
        PrivateKey privateKey = getPrivateKey(privateKeyPath);
        ks.setKeyEntry("private-key", privateKey, privateKeyPassword.toCharArray(), new Certificate[] { certCa });
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(ks, privateKeyPassword.toCharArray());
        
        // 构造socketFactory
        SSLContext context = SSLContext.getInstance("TLSV1.2");
        context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
        SSLSocketFactory socketFactory = context.getSocketFactory();
        return socketFactory;
    }


  • 设备发起MQTT的CONNECT,此时username和password无需设置
// 接入域名
String broker = "ssl://x509.itls." + regionId + ".aliyuncs.com:1883";
// MQTT的clientId
String mqttClientId = System.currentTimeMillis()+"|securemode=2|";
MemoryPersistence persistence = new MemoryPersistence();
mqttClient = new MqttClient(serverURL, mqttClientId, persistence);
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setMqttVersion(4);// MQTT 3.1.1
// 使用TLS,需要下载根证书root.crt,mqttClientId中设置securemode=2。
connOpts.setSocketFactory(createSSLSocket()); 
connOpts.setCleanSession(false); 
connOpts.setAutomaticReconnect(true); 
connOpts.setKeepAliveInterval(300);
// 设置connect回调
mqttClient.setCallback(new MqttCallback() {

    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {

        // 只处理X.509认证返回信息
        if ("/ext/auth/identity/response".equals(topic)) {
            JSONObject json = JSONObject.parseObject(new String(message.getPayload(), StandardCharsets.UTF_8));
            // 获取到设备的productKey和deviceName
            String productKey = json.getString("productKey");
            String deviceName = json.getString("deviceName");
        } else {
            // 处理其他下行消息,强烈建议另起线程处理,以免回调堵塞。
        }
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
    }

    @Override
    public void connectionLost(Throwable cause) {
    }
});

mqttClient.connect(connOpts);

设备启动,联网后,我们可以在IoT物联网平台控制台查看设备当前状态为在线,X.509证书栏为绑定设备证书的序列号,如下图。
image.png

【往期回顾】

1.自建MQTT集群迁移阿里云IoT平台
2.IoT时代:WiFi配网技术剖析
3.微信小程序和IoT智能家居实践
4.IoT云端通用数据解析脚本实践

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
2月前
|
安全 物联网 物联网安全
揭秘区块链技术在物联网(IoT)安全中的革新应用
揭秘区块链技术在物联网(IoT)安全中的革新应用
|
2月前
|
传感器 存储 物联网
在物联网(IoT)快速发展的今天,C语言作为物联网开发中的关键工具,以其高效、灵活、可移植的特点
在物联网(IoT)快速发展的今天,C语言作为物联网开发中的关键工具,以其高效、灵活、可移植的特点,广泛应用于嵌入式系统开发、通信协议实现及后端服务构建等领域,成为推动物联网技术进步的重要力量。
43 1
|
2月前
|
存储 安全 物联网
C# 在物联网 (IoT) 应用中的应用
本文介绍了C#在物联网(IoT)应用中的应用,涵盖基础概念、优势、常见问题及其解决方法。重点讨论了网络通信、数据处理和安全问题,并提供了相应的代码示例,旨在帮助开发者更好地利用C#进行IoT开发。
68 3
|
2月前
|
安全 物联网 网络安全
智能设备的安全隐患:物联网(IoT)安全指南
智能设备的安全隐患:物联网(IoT)安全指南
109 12
|
2月前
|
Web App开发 网络协议 安全
基于Web攻击的方式发现并攻击物联网设备介绍
基于Web攻击的方式发现并攻击物联网设备介绍
45 4
|
2月前
|
传感器 监控 安全
物联网(IoT):定义、影响与未来
物联网(IoT):定义、影响与未来
103 3
|
2月前
|
SQL 监控 物联网
ClickHouse在物联网(IoT)中的应用:实时监控与分析
【10月更文挑战第27天】随着物联网(IoT)技术的快速发展,越来越多的设备被连接到互联网上,产生了海量的数据。这些数据不仅包含了设备的状态信息,还包括用户的使用习惯、环境参数等。如何高效地处理和分析这些数据,成为了一个重要的挑战。作为一位数据工程师,我在一个物联网项目中深入使用了ClickHouse,以下是我的经验和思考。
114 0
|
2月前
|
存储 安全 物联网
政府在推动物联网技术标准和规范的统一方面可以发挥哪些作用?
政府在推动物联网技术标准和规范的统一方面可以发挥哪些作用?
107 50
|
2月前
|
安全 物联网 物联网安全
制定统一的物联网技术标准和规范的难点有哪些?
制定统一的物联网技术标准和规范的难点有哪些?
65 2
|
2月前
|
供应链 物联网 区块链
探索未来技术潮流:区块链、物联网、虚拟现实的融合与创新
【10月更文挑战第41天】随着科技的不断进步,新技术如区块链、物联网、虚拟现实等正在逐步渗透到我们的日常生活中。本文将深入探讨这些技术的发展趋势和应用场景,以及它们如何相互融合,共同推动社会的进步。我们将通过具体的代码示例,展示这些技术在实际应用中的潜力和价值。无论你是科技爱好者,还是对未来充满好奇的探索者,这篇文章都将为你打开一扇通往未来的窗口。
102 56

热门文章

最新文章

相关产品

  • 物联网平台