确保 Mosquitto 中的 TLS 通信安全

确保 Mosquitto 中的 TLS 通信安全

我有一个简单的 MQTT Mosquitto 服务器,我正在努力确保其安全。

蚊子.conf:

log_type all
password_file /etc/mosquitto/mosquitto_users.txt
pid_file /var/run/mosquitto.pid

persistence true
persistence_location /var/lib/mosquitto/

port 8883

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

在当前服务器上我生成:

CA证书

openssl genrsa -des3 -out ca.key 2048
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

服务器证书:

openssl genrsa -out server.key 2048
openssl req -new -out server.csr -key server.key

自签名服务器证书:

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 720

根据msoquitto.conf配置放置所有必需的文件。

我正在使用以下命令通过ca.crt证书订阅和发布消息。

mosquitto_sub -h 192.168.1.8 -t sensor --cafile ca.crt -p 8883 -d
mosquitto_pub -h 192.168.1.8 -t sensor --cafile ca.crt -m "test" -p 8883 -d

一切正常。但人与人之间的沟通是否安全?我是否应该将服务器放在互联网上而没有人会获取信息?

答案1

当它只是这样工作时,总是有点可怕。

如果你想测试它,你可能想尝试让它失败。如果有人试图欺骗您的服务器,他们将无法使用您的(自签名)CA 证书签名的证书来实现这一目的。因此,您可能想看看如果客户端使用的 CA 证书与用于签署服务器证书的证书不匹配会发生什么情况。

因此,要测试您的客户端是否mosquitto_sub正确mosquitto_pub检查证书,您可以尝试生成一个全新的“虚拟”CA 证书。 将其安装在服务器上。但尝试将它与您的mosquitto_submosquitto_pub命令一起使用:

mosquitto_sub -h 192.168.1.8 -t sensor --cafile dummy_ca.crt -p 8883 -d
mosquitto_pub -h 192.168.1.8 -t sensor --cafile dummy_ca.crt -m "test" -p 8883 -d

如果您的客户端与服务器安全通信,那么这应该会失败。这是因为您的服务器证书不会使用客户端期望的 CA 证书进行签名。如果它适用于虚拟证书,那么您就有问题了,您需要调查原因。


公钥加密使用密钥对(公钥和私钥)进行工作。私钥被隐藏并且永远不会与他人共享任何人。任何使用公钥加密的内容都只能使用私钥解密。甚至公钥也不能用来解密用公钥加密的内容……并且您无法从公钥中算出私钥。

因此,要通过加密通道进行通信,两个设备(客户端和服务器)都会将自己的公钥发送给对方,同时将自己的私钥保密。黑客是否能够获得这些并不重要,因为它们无法用于解密任何内容。然后说话,客户端使用服务器的公钥加密所有内容,服务器使用客户端的公钥加密所有内容。只有服务器可以解密它收到的消息,因为它是唯一拥有其私钥可以解密消息的服务器。同样,客户端是唯一可以解密发送给它的消息的客户端。


证书仅用于确保黑客无法冒充服务器进行“中间人攻击”。证书包含三个关键信息:

  1. 服务器的名称(即域名)
  2. 服务器的公钥
  3. CA 的签名证明该证书是真实的。

这样黑客就无法冒充您的服务器,因为他们必须:

  • 有权访问服务器的私钥来解密您发送的所有内容。 他们无法获得此信息,因为它始终由服务器保密并且从未透露给任何人
  • 向您发送一份证书,表明他们自己的(假)公钥对于服务器来说是正确的。 他们无法创建假证书,因为他们无法获得 CA 签名

相关内容