我正在使用 mosquitto 库测试 C 代码。
首先,下面是与TLS相关的brokerconf。
per_listener_settings true
listener 1883 0.0.0.0
allow_anonymous true
listener 8883 0.0.0.0
max_connections -1
certfile /home/.../server.crt
keyfile /home/.../server.key
#crlfile /mosquitto/config/certificates/ca.crl
require_certificate true
tls_version tlsv1.2
cafile /home/.../ca.crt
allow_anonymous false
以下是客户端代码。
mqtt = mosquitto_new(NULL, true, this);
mosquitto_tls_set(mqtt, ca_path, client_cert_path, client_private_key_path, NULL);
mosquitto_tls_opts_set(mqtt, 1, "tlsv1.2", NULL);
mosquitto_connect(mqtt, broker_address, 8883, 61);
mosquitto_loop_start(mqtt);
客户端没有报错。以下是经纪人错误。
1733809961: New connection from 112.122.223.234 on port 8883.
1733809961: OpenSSL Error[0]: error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error
1733809961: Socket error on client <unknown>, disconnecting.
有什么想法吗?
您遇到的错误(tlsv1 警报内部错误)通常表示客户端和代理之间的 TLS 握手存在问题。首先,确保代理和客户端都针对 TLS 1.2 进行了正确配置,因为您已经指定了 tls_version tlsv1.2 和 mosquitto_tls_opts_set(mqtt, 1, "tlsv1.2", NULL)。仔细检查证书的路径(server.crt、server.key、ca.crt),并确保它们正确且可由客户端和代理访问。代理设置为需要客户端证书 (require_certificate true),因此请确保客户端提供有效的证书。证书文件的权限也应该正确,因为不正确的文件访问可能会导致问题。为了帮助调试,请增加代理上的日志记录详细程度以收集更详细的错误消息,并考虑测试与 OpenSSL 的 s_client 的连接以进一步调查 SSL/TLS 握手。如果仍然存在问题,请验证客户端和代理上的 OpenSSL 版本是否支持 TLS 1.2 并且密码套件兼容。