Nginx ได้รับการกำหนดค่าเป็นโหลดบาลานเซอร์และมีใบรับรองเซิร์ฟเวอร์ติดตั้งเพื่อยุติแฮนด์เชค TLS สำหรับการเชื่อมต่อ MQTT ใช้งานได้เมื่อส่วนขยาย TLS รวมอยู่ใน clientHello ในระหว่างการจับมือกัน แต่มีไคลเอนต์อื่นที่ใช้โค้ดเก่าที่ไม่ได้ส่งส่วนขยาย TLS ใด ๆ ใน clientHello ในกรณีนั้นฉันพบว่า Nginx จะส่งข้อผิดพลาดเหมือนใน
SSL_do_handshake() ล้มเหลว (SSL: error:14201044:SSL Routines:tls_choose_sigalg:internal error) ในขณะที่ SSL handshaking, ไคลเอ็นต์: x.x.x.107, เซิร์ฟเวอร์: 0.0.0.0:8883
นี่คือการจับภาพ Wireshark
สำหรับฉันแล้ว ดูเหมือนว่า Nginx คาดหวังว่าจะมีส่วนขยาย alorightms ที่เป็นลายเซ็นเป็นอย่างน้อย คำถามของฉันคือถ้าเป็นไปได้ สามารถกำหนดค่า Nginx ให้ยอมรับ TLS handshake เมื่อไคลเอนต์ไม่ได้ใช้ส่วนขยาย
การกำหนดค่าสตรีม 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 สูง:!aNULL:!MD5;
ssl_session_cache ที่ใช้ร่วมกัน: SSL:128m;
เปิด ssl_session_tickets;
ssl_session_timeout 8 ชม.
ปิด ssl_verify_client;
ปิด ssl_prefer_server_ciphers;
โบรกเกอร์ proxy_pass;
proxy_connect_timeout 5 วินาที;
access_log /var/log/nginx/mqtt_access.log mqtt;
error_log /var/log/nginx/mqtt_error.log ดีบัก;
}
นี่คือการจับ wireshark เมื่อลูกค้าส่งส่วนขยายใน clientHello: