我已经设置了一个mosquitto MQTT服务器并创建了用于加密通信的所有内容。证书是使用此脚本https://codeply.com/p/mKFXWjc39k创建的。一切正常。证书以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
作为“ ok”签出。
但是我不明白为什么在不同的客户端上会有所不同。
代理在Ubuntu 18服务器上运行。在此处配置:
mosquitto_pub
我可以通过
连接到它问题是:
1。为什么有些客户需要指纹证书,而有些则不需要?
据我所知,TLS / SSL只能使用服务器端的证书来保护连接,但是我不确定。 Android应用程序无需任何证书或指纹即可连接到我的经纪人,而require_certificate false
仅适用于cacert。即使我使用--insecure
配置代理,客户端仍然需要指定cacert。 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);
无法解决此问题。另一方面,我的ESP8266只需要一个短指纹。
2。我所有的连接(尤其是Android连接)是否安全/加密?
ESP8266 / Arduino
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());
}
Android
code .
答案 0 :(得分:2)
假设您没有使用自签名证书。
mosquitto_pub / sub和PubSubClient库都需要CA证书,因为它们在信任库中没有包含证书颁发机构中受信任证书的列表的烤炉。
在Android上有一个烘焙的信任库。
在Linux上,通常可以将mosquitto工具指向/etc/ssl/certs/
,以使用操作系统随附的Trust Store CA证书。
更新:
只要客户端连接时代理提供完整的证书链,证书指纹就足以验证代理证书。客户端可以检查代理证书是否由CA证书签名,并且CA证书指纹与所提供的证书相匹配。
否,您的Android客户端不安全。您已明确要求Android信任经纪人提供的任何证书,这意味着任何人都可以对您的android应用程序进行中间攻击,而您将永远无法知道。