有时仅需要TLS(v1.2)客户端证书。为什么?

时间:2020-10-07 12:16:30

标签: ssl ssl-certificate mqtt tls1.2 mosquitto

我已经设置了一个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

我可以通过

连接到它
  • mosquitto_sub / _pub(需要ca.cert文件)
  • 带有AsyncMqttCliet的基于Arduino的ESP8266(需要使用从证书中的openssl导出的指纹)
  • 一个定制的Android应用程序(不需要什么???) (下面的所有代码)。

问题是:

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 .

1 个答案:

答案 0 :(得分:2)

假设您没有使用自签名证书。

mosquitto_pub / sub和PubSubClient库都需要CA证书,因为它们在信任库中没有包含证书颁发机构中受信任证书的列表的烤炉。

在Android上有一个烘焙的信任库。

在Linux上,通常可以将mosquitto工具指向/etc/ssl/certs/,以使用操作系统随附的Trust Store CA证书。

更新:

  1. 只要客户端连接时代理提供完整的证书链,证书指纹就足以验证代理证书。客户端可以检查代理证书是否由CA证书签名,并且CA证书指纹与所提供的证书相匹配。

  2. 否,您的Android客户端不安全。您已明确要求Android信任经纪人提供的任何证书,这意味着任何人都可以对您的android应用程序进行中间攻击,而您将永远无法知道。