【问题标题】:Java mqtt client SSL config with self signed certificate带有自签名证书的 Java mqtt 客户端 SSL 配置
【发布时间】:2021-11-17 15:15:41
【问题描述】:

这是我想要实现的一个例子:

MqttClient client = new MqttClient("ssl://127.0.0.1:8883", "randomId");
client.setCallback(new MyCallback());
MqttConnectOptions options = new MqttConnectOptions();
options.setConnectionTimeout(60);
options.setKeepAliveInterval(60);
//Something like this
//options.setSSLProperties(sslProperties());
client.connect(options);
client.subscribe("topic", 0);
    private Properties sslProperties() {
        Properties properties = new Properties();
        properties.put(SSLSocketFactoryFactory.CA, "/home/ca.crt");
    }

我正在使用一个名为 MQTTfx 的工具。我只需要指向我的 ca.crt 文件,它就会连接到我的 mosquitto 代理。如何在 Java 中指定我的证书文件?

这就是我的 mosquitto 配置的样子:

port 8883

cafile /etc/mosquitto/ca_certificates/ca.crt
keyfile /etc/mosquitto/certs/server.key
certfile /etc/mosquitto/certs/server.crt

【问题讨论】:

    标签: java ssl-certificate mqtt paho


    【解决方案1】:

    不幸的是,事情没那么简单。 您将需要创建一个 SSLSocketFactory 的实例,该实例具有指向您的 CA 证书的自定义 TrustStore。然后你将这个SSLSocketFactory 传递给MqttClientMqttConnectOptions 的一部分。

    有点像(这没有异常处理,需要包装在适当的 try/catch 块中)

    Keystore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
    trustStore.load(null,null);
    trustStore.setCertificateEntry("Custom CA", (X509Certificate) CertificateFactory.getInstance("X509").generateCertificate(new FileInputStream("/home/ca.crt"));
    
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(trustStore);
    TrustManager[] trustManagers = tmf.getTrustManagers();
    
    SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(null, trustManagers, null);
    SSLSocketFactory sslSocketFactory =  sslContext.getSocketFactory();
    
    //where options is the MqttConnectOptions object
    options.setSocketFactory(sslSocketFactory)
    

    【讨论】:

    • 您好,非常感谢您的回复!不幸的是,我收到以下错误:Caused by: java.security.cert.CertificateException: No subject alternative names present.MqttException (0) - javax.net.ssl.SSLHandshakeException: No subject alternative names present 这是我从蚊子经纪人那里得到的信息:OpenSSL Error[0]: error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown 客户端 上的套接字错误,正在断开连接。你知道我做错了什么吗?
    • 这意味着您的服务器证书没有与您用于连接的服务器名称相匹配的 CN 或 SAN 条目 (127.0.0.1)。这与信任您的 CA 不同。使用带有 IP 地址的证书通常是个坏主意,因为它只会增加复杂性。
    • 我用“localhost”创建了我的证书。我现在将代码中的连接切换到本地主机而不是使用 IP 地址,我得到no name matching localhost found。我想还是同样的问题。我真的不知道是什么导致了这个问题。
    • 正如我所说,这是一个不同的问题(所以新问题有很多关于你所做的事情的更多细节)。 p.s.再次删除并重新发布相同的评论以触发通知是粗鲁的,让我不想再帮忙了。
    • 我对我的评论做了一些修改,因为我找不到编辑选项,所以我重新发布了它。抱歉双重通知。我会尝试稍微玩一下配置,看看会发生什么。感谢您的宝贵时间和见解!
    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2020-11-23
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多