เราเพิ่งเปลี่ยนการกำหนดค่า nginx เพื่อรองรับ TLSv1.2 รวมถึงการเข้ารหัสที่ปลอดภัยยิ่งขึ้นอีกจำนวนหนึ่ง ตั้งแต่การเปลี่ยนแปลง บันทึกข้อผิดพลาด nginx ของเราก็เต็มไปด้วยข้อผิดพลาดต่อไปนี้:

2015/01/28 23:55:57 [crit] 16898#0: *18712916 SSL_do_handshake() failed (SSL: error:140A1175:SSL routines:SSL_BYTES_TO_CIPHER_LIST:inappropriate fallback) while SSL handshaking, client: ..., server: 0.0.0.0:443

การกำหนดค่า nginx ของเรามีดังนี้:

server {
  root   /var/www/fl/current/public;

  listen              443;
  ssl                 on;
  ssl_certificate     /etc/nginx/ssl/wildcard.pem;
  ssl_certificate_key /etc/nginx/ssl/wildcard.key;
  ssl_session_timeout 5m;
  ssl_session_cache shared:SSL:50m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
  ssl_prefer_server_ciphers on;

เราได้รับอีเมลสองสามฉบับเกี่ยวกับผู้ใช้ที่ไม่สามารถเข้าถึงไซต์ได้ ผู้ใช้รายหนึ่งกล่าวว่านี่เป็นข้อผิดพลาดที่พวกเขาได้รับใน Firefox:

Secure Connection Failed

An error occurred during a connection to ******.com. The server rejected the handshake because the client downgraded to a lower TLS version than the server supports. (Error code: ssl_error_inappropriate_fallback_alert)

The page you are trying to view cannot be shown because the authenticity of the received data could not be verified.

ถ้าฉันเข้าใจถูกต้อง การแจ้งเตือนทางเลือกจะเป็นการป้องกันความปลอดภัยเมื่อไคลเอ็นต์ใช้ TLS เวอร์ชันที่ต่ำกว่าที่ไคลเอ็นต์และเซิร์ฟเวอร์รองรับ ข้อผิดพลาดนี้ดูเหมือนจะสมเหตุสมผลมาก เนื่องจากตอนนี้เรารองรับโปรโตคอลเวอร์ชันที่สูงกว่า สิ่งที่ฉันไม่เข้าใจคือสาเหตุที่การเปลี่ยนแปลงนี้จะทำให้เกิดปัญหากับผู้ใช้บางคนเมื่อเชื่อมต่อกับเว็บไซต์ของเรา นี่เป็นข้อผิดพลาดในการกำหนดค่าหรือเบราว์เซอร์ของเราหรือไม่

ตอนนี้เราได้คะแนน 'A' จากการทดสอบเซิร์ฟเวอร์ Qualys SSL ดังนั้นฉันจึงลังเลที่จะเปลี่ยนกลับไปใช้การกำหนดค่าเก่าของเรา

answer

เบราว์เซอร์มักจะจับมือกัน SSLv23 ด้วยการจับมือกันนี้ พวกเขาได้ประกาศเวอร์ชันโปรโตคอลที่ดีที่สุดที่พวกเขาสนับสนุน (ส่วนใหญ่เป็น TLS1.2 ในปัจจุบัน) แต่ไม่จำกัดเซิร์ฟเวอร์สำหรับเวอร์ชันนี้ ดังนั้นเซิร์ฟเวอร์ซึ่งมี TLS stack ที่ใช้งานและกำหนดค่าอย่างเหมาะสม แต่รองรับ TLS1.0 เท่านั้น จะตอบกลับด้วย TLS1.0 และการเชื่อมต่อจะสำเร็จในการลองครั้งแรก

แต่มีสแต็ค TLS ที่ไม่ดีหรือการกำหนดค่าผิดพลาดหรือกล่องกลางที่ไม่ดี (ตัวโหลดบาลานซ์ ฯลฯ ) ที่ฝั่งเซิร์ฟเวอร์ซึ่งทำให้การจับมือ SSLv23 นี้ล้มเหลว ในกรณีนี้ เบราว์เซอร์จะดาวน์เกรดโปรโตคอลที่ใช้ในการจับมือกัน นั่นคือพวกเขาลองใช้ TLS1.0 handshake อย่างชัดเจน ตามด้วย SSL3.0 handshake อย่างชัดเจน (บางเบราว์เซอร์ได้ปิดการใช้งาน SSL3.0 แล้ว ดังนั้นอย่าลองทำเช่นนี้)

เบราว์เซอร์ที่ใหม่กว่าจะใช้รหัสเทียม TLS_FALLBACK_SCSV หากทำการเชื่อมต่อที่ดาวน์เกรด หากเซิร์ฟเวอร์ที่สามารถใช้ TLS_FALLBACK_SCSV ตรวจพบการเชื่อมต่อที่ดาวน์เกรดด้วยโปรโตคอลเวอร์ชันที่ต่ำกว่า ซึ่งเซิร์ฟเวอร์นั้นรองรับ (เช่น ดาวน์เกรดใช้ TLS1.0 แต่เซิร์ฟเวอร์รองรับ TLS1.2) มากกว่าที่ถือว่ามีการโจมตีแบบ POODLE และจะปิดการเชื่อมต่อ

แต่ทำไมไคลเอนต์อาจดาวน์เกรดตั้งแต่แรกเมื่อติดต่อกับเซิร์ฟเวอร์ของคุณ?

  • คุณอาจมีตัวโหลดบาลานซ์เสียอยู่ข้างหน้า ซึ่งทำให้เกิดปัญหากับบางคำขอ
  • เซิร์ฟเวอร์ของคุณหรืออุปกรณ์ป้องกัน DOS บางส่วนอาจปิดการเชื่อมต่อเมื่อมีภาระงานสูงก่อนที่ SSL handshake จะเสร็จสิ้น ในกรณีนี้ เบราว์เซอร์จะถือว่าเกิดปัญหากับโปรโตคอลและลองอีกครั้งด้วยเวอร์ชันที่ดาวน์เกรด
  • ปัญหาประเภทอื่นๆ เช่น หน่วยความจำไม่เพียงพอ เป็นต้น ซึ่งอาจทำให้เกิดการปิดแบบสุ่มภายใน SSL handshake

เปลี่ยน 318904 มีการอัปโหลดชุดโปรแกรมแก้ไขที่เกี่ยวข้อง (โดย BBlack): non-crit สำหรับไคลเอนต์ handshake SSL_R_VERSION_TOO_LOW

https://gerrit.wikimedia.org/r/318904

https://phabricator.wikimedia.org/T148893