物联网实战|spring-boot4 + hiveMQ|集成tls 物联网实战|spring-boot4 hiveMQ|集成tls源码如下(mqtt-simulator-hivemq-01)SAN是什么问题点ca证书生成window系统安装openssl将下面命名文件server.cnf,生成ca证书(包含subjectAltName-san)生成CA私钥(进入openssl目录bin下)生成CA证书生成结果ca证书转换jks借助keytools(进入jdk目录bin下)将server.crt拷贝过来spring-boot4 hiveMQ集成pom依赖代码如下结果如下如果ca缺失san证书基于spring-boot4 下面错误物联网实战|spring-boot4 hiveMQ|集成tls源码如下(mqtt-simulator-hivemq-01)https://gitee.com/kcnf-iot/mqtt-simulator/tree/master/mqtt-simulator-hivemq-01SAN是什么Subject DN主体名称旧标准里证书域名写在 CNCommon Name通用名字段只能填1 个域名 例CNshturl.cc/Y只能匹配这一个网址SAN主题备用名称是 X.509 证书标准扩展字段可以填写多个域名、IP、主机名支持 多个独立域名a.com、b.com 泛域名*.shturl. IP 地址192.168.1.1、IPv6 本地主机名、邮箱等问题点ca证书转换jksspring-boot4开启san强校验问题ca证书生成window系统安装opensslhttps://slproweb.com/products/Win32OpenSSL.html将下面命名文件server.cnf,生成ca证书(包含subjectAltName-san)[req] distinguished_name req_distinguished_name x509_extensions v3_req prompt no [req_distinguished_name] CN emqx.local [v3_req] keyUsage keyEncipherment, dataEncipherment, digitalSignature extendedKeyUsage serverAuth subjectAltName alt_names [alt_names] DNS.1 localhost IP.1 127.0.0.1 IP.2 192.168.0.20生成CA私钥(进入openssl目录bin下)openssl genrsa -out server.key 2048生成CA证书openssl req -x509 -new -nodes -key server.key -sha256 -days 3650 -out server.crt -config server.cnf生成结果ca证书转换jks借助keytools(进入jdk目录bin下)将server.crt拷贝过来keytool -importcert -alias server -file server.crt -keystore truststore.jks -storepass 123456 -nopromptspring-boot4 hiveMQ集成pom依赖dependencyManagement dependencies !-- Spring Boot Starter -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-dependencies/artifactId version4.0.6/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement!-- HiveMQ MQTT5 客户端同时兼容 MQTT3.1.1 -- dependency groupIdcom.hivemq/groupId artifactIdhivemq-mqtt-client/artifactId version1.3.15/version /dependency代码如下package com.jysemel.iot; import com.hivemq.client.mqtt.MqttClientSslConfig; import com.hivemq.client.mqtt.mqtt5.Mqtt5AsyncClient; import com.hivemq.client.mqtt.mqtt5.Mqtt5Client; import com.hivemq.client.mqtt.mqtt5.message.auth.Mqtt5SimpleAuth; import com.hivemq.client.mqtt.mqtt5.message.connect.Mqtt5Connect; import javax.net.ssl.TrustManagerFactory; import java.io.InputStream; import java.security.KeyStore; import java.util.UUID; public class HiveMQTLSClientExample { private static final String MQTT_HOST 192.168.0.20; private static final int MQTT_TLS_PORT 8085; private static final String MQTT_USER test; private static final String MQTT_PWD 123456; private static final int KEEP_ALIVE 30; public static void main(String[] args) { mqtt5AsyncClient(); } public static Mqtt5AsyncClient mqtt5AsyncClient() { // 1. 加载CA根证书构建SSL信任配置 MqttClientSslConfig sslConfig buildSslConfig(); // 2. 构建MQTT TLS客户端 String clientId server_ UUID.randomUUID().toString().substring(0, 16); Mqtt5AsyncClient client Mqtt5Client.builder() .identifier(clientId) .serverHost(MQTT_HOST) .serverPort(MQTT_TLS_PORT) .sslConfig(sslConfig) .buildAsync(); // 3. 构建连接报文 Mqtt5SimpleAuth simpleAuth Mqtt5SimpleAuth.builder() .username(MQTT_USER) .password(MQTT_PWD.getBytes()) .build(); Mqtt5Connect connectMsg Mqtt5Connect.builder() .cleanStart(true) .simpleAuth(simpleAuth) .keepAlive(KEEP_ALIVE) .build(); // 4. 发起异步连接 client.connect(connectMsg) .whenComplete((connAck, throwable) - { if (throwable ! null) { throwable.printStackTrace(); System.out.println(MQTT TLS连接失败 ); return; } System.out.println(MQTT TLS连接成功clientId ); }); return client; } private static MqttClientSslConfig buildSslConfig() { try { KeyStore trustStore KeyStore.getInstance(KeyStore.getDefaultType()); try (InputStream is HiveMQTLSClientExample.class.getResourceAsStream(/cert/emqx.jks)) { if (is null) { throw new RuntimeException(信任库文件未找到: /cert/emqx.jks); } String trustStorePassword 123456; trustStore.load(is, trustStorePassword.toCharArray()); } TrustManagerFactory tmf TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(trustStore); return MqttClientSslConfig.builder() .trustManagerFactory(tmf) // 关键自定义 HostnameVerifier总是验证通过仅测试用 .hostnameVerifier((hostname, session) - true) .build(); } catch (Exception e) { throw new RuntimeException(SSL 初始化失败, e); } } }结果如下如果ca缺失san证书基于spring-boot4 下面错误avax.net.ssl.SSLHandshakeException: No subject alternative names present com.hivemq.client.mqtt.exceptions.ConnectionFailedException: javax.net.ssl.SSLHandshakeException: No subject alternative names present Caused by: javax.net.ssl.SSLHandshakeException: No subject alternative names present at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:130) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:383) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:326) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:321) at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.check

相关新闻

最新新闻

单文件狂吞 503 GB!微软确认 Windows 11 存储漏洞

单文件狂吞 503 GB!微软确认 Windows 11 存储漏洞

根据简鹿办公了解微软近日正式确认,Windows 11 系统中存在一个严重的存储 Bug,可导致系统盘空间被异常占用高达数百 GB。目前,用户可通过安装可选更新 KB5095093 来缓解该问题,而微软计划于 2026 年 7 月 14 日的例行补丁日&#…

2026/7/8 2:48:48
Claude global workspace 研究给智能体测试提了一个醒

Claude global workspace 研究给智能体测试提了一个醒

Anthropic 2026-07-06 的研究讨论的是 Claude 内部的 J-space,也就是一种不会直接出现在输出里的内部工作区,这里要先划清边界:它是可解释性研究,不是 Claude 已经推出的新产品功能,也不是多个 Claude 实例共享同一块外…

2026/7/8 2:48:48
事业的最小单位是什么?

事业的最小单位是什么?

事业到底是什么? 很多人会说: 年薪百万、创业成功、上市公司、高管…… 但这些都不是最小单位。 第一层:什么叫事业? 很多人脑海里的事业: CEO创业上市财富自由这些其实都是: 事业发展的结果。 不是&am…

2026/7/8 2:48:48
离散制造MES系统怎么选?四化信息科技的产品架构与适配场景

离散制造MES系统怎么选?四化信息科技的产品架构与适配场景

科技的MES系统在上述维度上均有对应的产品设计。全流程覆盖能力。 四化信息科技的SH-MOM智能制造系统集成了PLM、MES、QMS、WMS等功能模块,创造性将进销存、工程管理、生产管理、质量管理及工业互联网技术融合到实际制造中。系统从业务接单开始,覆盖项目…

2026/7/8 2:48:48
像设计产品一样设计品牌:资深UI/UX眼中的“品牌设计”全链路解析

像设计产品一样设计品牌:资深UI/UX眼中的“品牌设计”全链路解析

**摘要: 很多人误以为品牌设计就是画个Logo。**本文将从产品与技术的视角,深度拆解品牌设计的完整链路,涵盖用户画像构建、视觉语言落地、以及设计系统维护。适合想要建立个人IP的开发者、创业团队产品经理以及对设计思维感兴趣的技术人阅读。…

2026/7/8 2:48:48
family_face(人脸信息)

family_face(人脸信息)

2026/7/8 2:43:47

月新闻