当客户端未发送 TLS 扩展时,Nginx 无法接受 TLS 握手

当客户端未发送 TLS 扩展时,Nginx 无法接受 TLS 握手

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 捕获的内容

不带扩展的 clientHello

在我看来,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 捕获:

clienHello 包含扩展

相关内容