Nginx 配置为负载均衡器,并安装了服务器证书以终止 MQTT 连接的 TLS 握手。当握手期间 clientHello 中包含 TLS 扩展时,它会起作用,但有其他运行旧代码的客户端不会在 clientHello 中发送任何 TLS 扩展。在这种情况下,我发现 Nginx 会抛出错误,如下所示
SSL_do_handshake() failed (SSL: error:14201044:SSL routines:tls_choose_sigalg:internal error) while SSL handshaking, client: x.x.x.107, server: 0.0.0.0:8883
以下是 Wireshark 捕获的内容
在我看来,Nginx 至少需要签名 alorightms 扩展。我的问题是,当客户端不使用扩展时,是否可以将 Nginx 配置为接受 TLS 握手?
Nginx 流配置在这里(仅显示 TLS 相关):
upstream brokers{
server 127.0.0.1:18831;
server 127.0.0.1:18832;
server 127.0.0.1:18833;
zone tcp_mem 64k;
hash $mqtt_client_id consistent;
}
server {
listen 8883 ssl;
preread_buffer_size 1k;
ssl_certificate /etc/nginx/certs/server.pem;
ssl_certificate_key /etc/nginx/certs/server.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:128m;
ssl_session_tickets on;
ssl_session_timeout 8h;
ssl_verify_client off;
ssl_prefer_server_ciphers off;
proxy_pass brokers;
proxy_connect_timeout 5s;
access_log /var/log/nginx/mqtt_access.log mqtt;
error_log /var/log/nginx/mqtt_error.log debug;
}
以下是客户端在 clientHello 中发送扩展时的 wireshark 捕获: