HTTPS ไม่ทำงานกับ Safari


16

ฉันมีอินสแตนซ์ EC2 ที่มี Apache เป็นเว็บเซิร์ฟเวอร์ (และ Wildfly เป็นแอปเซิร์ฟเวอร์แม้ว่าฉันไม่แน่ใจว่ามีส่วนเกี่ยวข้องกับปัญหานี้) หน้า EC2 ฉันมี load balancer ซึ่งจะยกเลิก HTTPS และใช้ใบรับรอง SSL

ทั้ง HTTP และ HTTPS ทำงานได้ดีใน Chrome แต่น่าเสียดายที่ไม่ใช่ใน Safari การเข้าถึงhttp://test.papereed.comทำงานได้ดี แต่การเข้าถึงhttps://test.papereed.comจะทำให้เกิดข้อผิดพลาด

"Safari can't open the page. The error is "The operation couldn't be completed. Protocol error" (NSPOSIXErrorDomain:100)"

ฉันได้ดูใน / etc / httpd / logs / error_log และ / etc / httpd / logs / access_log และในคอนโซล Safari โดยไม่พบคำแนะนำใด ๆ ในการแก้ปัญหา และนั่นก็คือความรู้ของฉันไปไกลแค่ไหน :-( คำใบ้ใด ๆ ที่จะติดตามปัญหานี้จะได้รับการชื่นชมมาก

คำตอบ:


22

curl (ถ้ารวบรวมด้วยการสนับสนุน HTTP / 2) แสดงปัญหาเดียวกัน แต่แสดงเหตุผล:

ข้อผิดพลาด http2: ได้รับฟิลด์ส่วนหัว HTTP ไม่ถูกต้อง: ประเภทเฟรม: 1, สตรีม: 1, ชื่อ: [อัพเกรด], ค่า: [h2, h2c]

ดูเหมือนว่าเซิร์ฟเวอร์ของคุณกำลังเสนอการอัปเกรดเป็น HTTP / 2 แม้ว่าการเชื่อมต่อจะเสร็จสิ้นด้วย HTTP / 2 ซึ่งไม่สมเหตุสมผล ไม่เพียงเท่านั้นมันถูกห้ามอย่างชัดเจน จากRFC 7540 ส่วน 8.1.2.2 :

จุดสิ้นสุดต้องไม่สร้างข้อความ HTTP / 2 ที่มีฟิลด์ส่วนหัวเฉพาะการเชื่อมต่อ ข้อความใด ๆ ที่มีฟิลด์ส่วนหัวเฉพาะการเชื่อมต่อต้องถือว่าเป็นรูปแบบที่ไม่ถูกต้อง (ส่วน 8.1.2.6) .... ฟิลด์ส่วนหัวเฉพาะการเชื่อมต่อเช่น Keep-Alive, Proxy-Connection, การเข้ารหัสการโอนและอัพเกรด

ดูเหมือนว่าฉันมีข้อผิดพลาดเนื่องจาก Apache ไม่ควรส่งส่วนหัวนี้ด้วย HTTP / 2

ฉันเดาว่าคุณมีการกำหนดค่าเช่นนี้

Protocols h2 h2c http/1.1

ระบุว่าเบราว์เซอร์ไม่สนับสนุน HTTP / 2 ที่ไม่มี TLS อยู่แล้วและไม่จำเป็นต้องอัปเกรดส่วนหัวด้วย HTTP / 2 ผ่าน TLS ฉันขอแนะนำให้คุณแทนที่การกำหนดค่านี้ด้วย

Protocols h2 http/1.1

สิ่งนี้ปิดใช้งานการสนับสนุน HTTP / 2 ที่ไม่จำเป็นโดยไม่มี TLS แต่หวังว่าควรกำจัดส่วนหัวอัปเกรดด้วยวิธีนี้เนื่องจากจำเป็นสำหรับการอัพเกรดจาก HTTP ธรรมดาเป็น HTTP / 2 ธรรมดาเท่านั้น

แก้ไข: ตามความคิดเห็นโดย OP การเปลี่ยนแปลงการProtocolsกำหนดค่าไม่ได้ช่วย จำเป็นต้องหลีกเลี่ยงพฤติกรรมนี้ (เช่นบั๊ก) ของmod_http2โดยการลบUpgradeส่วนหัวอย่างชัดเจน:

Header unset Upgrade

3
ขอขอบคุณ! ฉันมีการกำหนดค่าต่อไปนี้: การปฏิบัติ # Enable HTTP/2 by default # https://httpd.apache.org/docs/2.4/mod/core.html#protocols <IfModule mod_http2.c> Protocols h2 h2c http/1.1 </IfModule> ตามคำแนะนำของคุณและการเปลี่ยนเป็นProtocols h2 http/1.1ไม่ได้ลบส่วนหัวของการอัพเกรดดังนั้นฉันจึงเก็บบรรทัดโปรโตคอลตามเดิมและเพิ่มรายการต่อไปนี้: Header unset Upgradeเพื่อลบส่วนหัว ไม่สามารถบอกว่าฉัน 100% ด้านบนของสิ่ง / เหตุผลที่เกิดขึ้นที่นี่ แต่ตอนนี้มันทำงานได้ดีใน Safari เกินไป :-)
Jola

@ jola: ขอบคุณสำหรับความคิดเห็น ฉันรวมมันไว้ในคำตอบ
Steffen Ullrich

3

ฉันคิดว่านี่เป็นปัญหา Safari แทนที่จะเป็นปัญหา AWS / SSL การค้นหาข้อผิดพลาดนั้นได้ผลลัพธ์จำนวนมากบน Google

ตรวจสอบทุกอย่างออกมาพร้อมกับเว็บไซต์ให้เป็นไปตามการทดสอบ SSL ShopperและSSL Labs ทดสอบ

ผมพบว่าวิธีการแก้ปัญหานี้เป็นไปได้ในการแก้ไขปัญหา

วิธีแก้ไขคือเข้าไปที่การตั้งค่า Safari ภายใต้ความเป็นส่วนตัวและรายการรายละเอียดทั้งหมด นี่เป็นบันทึกของเว็บไซต์ทั้งหมดที่มีการใช้คุกกี้และอื่น ๆ ฉันพบหน้าโดเมนเครือข่ายสภาพอากาศและลบเนื้อหาทั้งหมดจากหน้านั้น ฉันสามารถโหลดหน้า Weather Network อีกครั้งโดยไม่มีปัญหา ฉันคิดว่าสิ่งนี้จะใช้ได้กับไซต์เอกพจน์อื่นที่คล้ายคลึงกัน

นอกจากนี้ยังมีสิ่งนี้ซึ่งสามารถทำได้กับ Apache


ใช่ฉันทำแบบนี้แล้ว แต่ไม่พบสิ่งใดที่เกี่ยวข้องโดยตรง (afaiu) ฉันได้อ่านวิธีแก้ปัญหาที่เสนอสำหรับ nginx แล้ว แต่ฉันไม่แน่ใจว่าจะใช้ได้กับ apache อย่างไร
jola

Apache ไม่ต้องสงสัยเลยว่าจะสามารถลบส่วนหัว "อัปเกรด"ซึ่งเป็นสิ่งที่ Nginx กำลังทำอยู่
ทิม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.