Nginx được định cấu hình làm bộ cân bằng tải và có chứng chỉ máy chủ được cài đặt để chấm dứt quá trình bắt tay TLS cho các kết nối MQTT. Nó hoạt động khi các phần mở rộng TLS được bao gồm trong clientHello trong quá trình bắt tay nhưng có những ứng dụng khách khác đang chạy mã cũ không gửi bất kỳ phần mở rộng TLS nào trong clientHello. Trong trường hợp đó, tôi thấy Nginx sẽ đưa ra lỗi như trong
SSL_do_handshake() không thành công (SSL: error:14201044:SSL routines:tls_choose_sigalg:internal error) trong khi SSL bắt tay, máy khách: x.x.x.107, máy chủ: 0.0.0.0:8883
Đây là chụp Wireshark
Đối với tôi, có vẻ như Nginx đang mong đợi ít nhất là phần mở rộng chữ ký alorightms. Câu hỏi của tôi là liệu Nginx có thể được cấu hình để chấp nhận bắt tay TLS khi máy khách không sử dụng tiện ích mở rộng không?
Cấu hình luồng Nginx ở đây (chỉ hiển thị TLS liên quan):
nhà môi giới ngược dòng{
máy chủ 127.0.0.1:18831;
máy chủ 127.0.0.1:18832;
máy chủ 127.0.0.1:18833;
vùng tcp_mem 64k;
hàm băm $mqtt_client_id nhất quán;
}
người phục vụ {
nghe 8883 ssl;
kích_thước_đệm_đọc_trước 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 CAO:!aNULL:!MD5;
ssl_session_cache được chia sẻ:SSL:128m;
bật ssl_session_tickets;
ssl_session_timeout 8h;
tắt ssl_verify_client;
tắt ssl_prefer_server_ciphers;
nhà môi giới proxy_pass;
proxy_connect_timeout 5s;
access_log /var/log/nginx/mqtt_access.log mqtt;
error_log /var/log/nginx/mqtt_error.log gỡ lỗi;
}
Đây là quá trình chụp Wireshark khi khách hàng gửi tiện ích mở rộng trong clientHello: