Nginx настроен как балансировщик нагрузки и имеет сертификат сервера, установленный для завершения рукопожатия TLS для соединений MQTT. Это работает, когда расширения TLS включаются в clientHello во время рукопожатия, но есть другие клиенты, работающие со старым кодом, которые не отправляют расширения TLS в clientHello. В этом случае я обнаружил, что Nginx будет выдавать ошибки, как в
Ошибка SSL_do_handshake() (SSL: ошибка: 14201044: подпрограммы SSL: tls_choose_sigalg: внутренняя ошибка) при квитировании SSL, клиент: x.x.x.107, сервер: 0.0.0.0:8883
Вот захват Wireshark
Мне кажется, Nginx ожидает, по крайней мере, расширение подписи alorightms. Мой вопрос: можно ли настроить Nginx для принятия рукопожатия TLS, когда клиент не использует расширения?
Конфигурация потока Nginx находится здесь (показывать только связанные с TLS):
апстрим-брокеры{
сервер 127.0.0.1:18831;
сервер 127.0.0.1:18832;
сервер 127.0.0.1:18833;
зона tcp_mem 64k;
хэш $mqtt_client_id согласован;
}
сервер {
слушать 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: SSL: 128 м;
ssl_session_tickets включен;
ssl_session_timeout 8 часов;
ssl_verify_client выключен;
ssl_prefer_server_ciphers выключен;
брокеры proxy_pass;
proxy_connect_timeout 5 с;
журнал_доступа /var/log/nginx/mqtt_access.log mqtt;
error_log /var/log/nginx/mqtt_error.log отладка;
}
Вот захват wireshark, когда клиенты отправляют расширения в clientHello: