【发布时间】:2020-10-07 12:16:30
【问题描述】:
我已经设置了一个 mosquitto MQTT 服务器并创建了所有内容来加密通信。证书是使用此脚本here 创建的。一切正常。证书以 openssl verify -CAfile ca.crt cool-server.crt 签出为“ok”。
但我不明白为什么在不同的客户端上会有不同。
代理在 Ubuntu 18 服务器上运行。在这里配置:
root@cool-server:~# cat /etc/mosquitto/conf.d/default.conf
allow_anonymous false
password_file /etc/mosquitto/passwd
listener 1883 localhost
listener 8883
cafile /etc/mosquitto/ca_certificates/ca.crt
certfile /etc/mosquitto/certs/cool-server.crt
keyfile /etc/mosquitto/certs/cool-server.key
require_certificate true
#require_certificate false # tried this too
tls_version tlsv1.2
root@cool-server:~# cat /etc/mosquitto/mosquitto.conf
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example
pid_file /var/run/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
log_type all
log_dest file /var/log/mosquitto/mosquitto.log
include_dir /etc/mosquitto/conf.d
我可以通过它连接到它
- mosquitto_sub / _pub(需要 ca.cert 文件)
- 带有 AsyncMqttCliet 的基于 Arduino 的 ESP8266(需要从证书中使用 openssl 派生的指纹)
- 自定义 Android 应用程序(什么都不需要???) (以下所有代码)。
问题是:
1.为什么有些客户需要指纹证书而有些则不需要?
据我所知,TLS/SSL 可以只在服务器端使用证书来保护连接,但我不确定。 Android 应用程序无需任何证书或指纹即可连接到我的代理,而 mosquitto_pub 仅适用于 cacert。即使我使用require_certificate false 配置代理,客户端仍然需要指定cacert。 --insecure 不能解决这个问题。另一方面,我的 ESP8266 只需要一个短指纹。
2。我的所有连接(尤其是 Android 连接)都是安全/加密的吗?
ESP8266 / Arduino
const uint8_t mqttCertFingerprint[] = {0xA6, 0x4D, 0x9F, 0x43B, 0x80, 0xB7, 0xB2, 0x9A, 0x9D, 0xCB, 0xC9, 0xF7, 0xAA, 0xCC, 0x30, 0xEF, 0xF4, 0xFC, 0xD3, 0x31};
mqttClient_.setSecure(true);
mqttClient_.addServerFingerprint(mqttCertFingerprint);
重击
mosquitto_pub -h cool-server.com -p 8883 -u user -P Password -t "topic/name" -m "hello" --cafile path/to/ca.crt
安卓
if (serverUri.contains("ssl")) {
class TrustEveryoneManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] arg0, String arg1){}
public void checkServerTrusted(X509Certificate[] arg0, String arg1){}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
SSLContext sslContext = SSLContext.getInstance("tls");
sslContext.init(null, new TrustManager[]{new TrustEveryoneManager()}, new SecureRandom());
mqttConnectOptions.setSocketFactory(sslContext.getSocketFactory());
}
【问题讨论】:
-
谁为经纪人提供了您的证书?
-
我用raw.githubusercontent.com/owntracks/tools/master/TLS/… 创建了它们(并更新了我的问题),
-
更新了答案以涵盖所有选项
标签: ssl ssl-certificate mqtt tls1.2 mosquitto