421 คำขอผิดพลาด


11

ฉันได้รับข้อผิดพลาด 421 ต่อไปนี้เป็นบางครั้ง:

คำขอผิดกฎหมาย

ไคลเอ็นต์ต้องการการเชื่อมต่อใหม่สำหรับคำขอนี้เนื่องจากชื่อโฮสต์ที่ร้องขอไม่ตรงกับชื่อเซิร์ฟเวอร์ (SNI) ที่ใช้ในการเชื่อมต่อนี้

อย่างไรก็ตามการรีเฟรชเบราว์เซอร์จะล้างข้อผิดพลาดและโหลดหน้าเว็บตามปกติ การโหลดหน้าครั้งต่อไปจะไม่เกิดข้อผิดพลาดและรูปแบบดังกล่าวดูจะค่อนข้างสุ่ม รูปแบบเดียวที่ฉันเห็นคืออาจเกิดขึ้นเมื่อฉันเปลี่ยนเส้นทางหน้าโดยใช้ส่วนหัว ("ตำแหน่ง:". $ url);

ฉันมีใบรับรอง PositiveSSL Multi-Domain จาก Comodo เซิร์ฟเวอร์ของฉันคือ Apache บนบริการเว็บโฮสติ้งที่ใช้ร่วมกันดังนั้นฉันจึงไม่สามารถเข้าถึงการกำหนดค่าได้

ฉันโหลดหน้าเว็บจากหนึ่งโดเมนและภายในหน้านั้นเป็นลิงค์ไปยังโดเมนที่สองในใบรับรอง

ทุกสิ่งที่ฉันได้อ่านเกี่ยวกับข้อผิดพลาดนี้ดูเหมือนว่าจะชี้ให้เห็นว่าปัญหานี้เกี่ยวข้องกับการเป็นใบรับรองหลายโดเมน

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

บริการโฮสติ้งของฉันยังไม่สามารถให้บริการอะไรและขอโทรกลับด้วยเวลาที่แน่นอนที่เกิดขึ้นต่อไปเพื่อให้พวกเขาสามารถค้นคว้าได้ ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมในขณะที่ฉันไม่มั่นใจมากเกินไปที่พวกเขาสามารถคิดออก

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

ผมทำวิจัยมากขึ้นและมาข้ามบทความอื่นที่พูดคุยเกี่ยวกับเรื่องนี้ที่นี่ สิ่งที่ @ เควินอธิบายไว้อย่างชัดเจน บทความยืนยันว่ามันเกิดขึ้นใน Safari ดังนั้นตามคำแนะนำฉันตั้งค่าเกี่ยวกับการรับใบรับรองแยกสำหรับแต่ละโดเมน ฉันอยู่ในโฮสต์ที่ใช้ร่วมกัน (Webhostinghub) และค้นพบว่าตอนนี้พวกเขาเสนอ SSL (AutoSSL) ฟรีที่ต่ออายุอัตโนมัติ มันฟังดูดีจริง พวกเขาตั้งฉันด้วยใบรับรองฟรี 5 ใบ จนถึงตอนนี้ดีมาก ฉันอาจลองเปิดใช้งานโดเมนสแตติกเพื่อทดสอบอีกครั้ง หากสิ่งนี้ใช้ได้ผลฉันจะประหยัด $ เพื่อบูตเป็นโบนัสและให้ใบรับรอง Comodo ของฉันหมดอายุในเดือนกรกฎาคม


คุณโฮสต์หลายเว็บไซต์บนเซิร์ฟเวอร์ Apache ตัวเดียวกันและใช้ใบรับรอง SSL เดียวกันและเกิดข้อผิดพลาดเมื่อสลับระหว่างชื่อโดเมนเหล่านี้หรือไม่
John Hanley

ถ้าคำตอบคือใช่ตรวจสอบว่าที่อยู่ IP สำหรับแต่ละโดเมนแมปกับเซิร์ฟเวอร์เสมือนเดียวกัน ถ้าใช่คุณมีสองทางเลือก (ที่ฉันนึกถึง): 1) ออกใบรับรอง SSL แยกต่างหากสำหรับแต่ละชื่อโดเมน 2) ย้ายเว็บเซิร์ฟเวอร์สำหรับแต่ละโดเมนให้อยู่ในเซิร์ฟเวอร์ที่แตกต่างกัน (ที่อยู่ IP ที่ต่างกัน) เมื่อพิจารณาว่าคุณอยู่บนโฮสติ้งที่ใช้ร่วมกันตัวเลือกที่ 1 น่าจะเป็นทางออกที่ดีที่สุด คุณสามารถทดสอบวิธีนี้โดยใช้ Let's Encrypt เพื่อออกใบรับรองฟรีจำนวนมากเพื่อติดตั้งบนเว็บเซิร์ฟเวอร์อื่น
John Hanley

สอบถามผู้ให้บริการโฮสต์ของคุณว่าพวกเขาสามารถปิดการใช้งาน mod_http2
John Hanley

@JohnHanley - # 1 อีกครั้งใช่มันเป็น SSL เดียวกันกับ 6 โดเมนในนั้น มันไม่ง่ายเลยที่จะบอกได้อย่างแม่นยำเมื่อเกิดข้อผิดพลาด สถานการณ์หลักคือฉันกำลังดึงเนื้อหา (รูปภาพและ js) จากโดเมนอื่นสองโดเมน # 2 อีกครั้ง: ที่อยู่ IP เหมือนกันแน่นอน - ฉันรวบรวมการออกใบรับรองแยกต่างหากแต่ละชื่อโดเมนจะค่อนข้างแพงกว่า ฉันค้นหา Let's Encrypt แต่ผู้ให้บริการของฉันไม่รองรับ ผู้ให้บริการของฉันมีใบรับรองฟรีในช่วง 6 เดือนที่ผ่านมาดังนั้นเมื่อต่ออายุใหม่ในเดือนนี้ฉันจะเปลี่ยนและดูว่าเกิดอะไรขึ้น Re # 3 - พวกเขาไม่สามารถปิดการใช้งาน mod_http2 ขอบคุณ
mseifert

ที่จริงแล้วผู้ให้บริการทั้งหมดรองรับ Let's Encrypt เว้นแต่พวกเขาจะปิดกั้นเฉพาะ ใบรับรอง SSL เหมือนกันไม่ว่าคุณจะได้รับจากที่ใด ข้อแตกต่างคือประเภทของการตรวจสอบความถูกต้อง (DV, OV, EV) และรูปแบบไฟล์ / การบรรจุ Apache เป็นที่นิยมมากที่ทุกคนให้การสนับสนุน ตราบใดที่ผู้ขายของคุณสนับสนุนคุณอัปโหลดใบรับรองของคุณเอง (ใบรับรองและรหัสส่วนตัว) คุณสามารถใช้การตรวจสอบความถูกต้อง DNS เพื่อแก้ไขปัญหาเหล่านั้น หากพวกเขาไม่สนับสนุนการอัปโหลดใบรับรองของคุณเองฉันก็จะเปลี่ยนผู้ขาย
John Hanley

คำตอบ:


14

เหตุการณ์นี้เกิดจากลำดับเหตุการณ์ต่อไปนี้:

  1. เซิร์ฟเวอร์และไคลเอ็นต์รองรับและใช้ HTTP / 2
  2. foo.example.comลูกค้าร้องขอหน้า
  3. ระหว่างการเจรจา TLS เซิร์ฟเวอร์จะแสดงใบรับรองที่ถูกต้องสำหรับทั้งสองfoo.example.comและbar.example.com(และลูกค้ายอมรับ) ซึ่งสามารถทำได้ด้วยใบรับรองไวด์การ์ดหรือใบรับรอง SAN
  4. ลูกค้า reuses bar.example.comการเชื่อมต่อที่จะขอให้
  5. เซิร์ฟเวอร์ไม่สามารถหรือไม่ต้องการสนับสนุนการเชื่อมต่อข้ามโดเมนซ้ำ (ตัวอย่างเช่นเนื่องจากคุณกำหนดค่า SSL ของพวกเขาแตกต่างกันและ Apache ต้องการบังคับให้มีการเจรจาใหม่ TLS) และให้บริการ HTTP 421
  6. ลูกค้าไม่ได้ลองเชื่อมต่อใหม่โดยอัตโนมัติ (ดูตัวอย่างข้อบกพร่องของ Chrome # 546991ซึ่งได้รับการแก้ไขแล้ว) เกี่ยวข้อง RFCบอกว่าลูกค้าอาจลองใหม่อีกครั้งไม่ว่ามันควรจะหรือต้อง ความล้มเหลวในการลองอีกครั้งไม่ได้ใช้ง่ายโดยเฉพาะอย่างยิ่ง แต่อาจเป็นที่ต้องการสำหรับเครื่องมือการดีบักหรือไลบรารี HTTP

เหตุการณ์ # 6 อยู่นอกเหนือการควบคุมของคุณ แต่ขึ้นอยู่กับซอฟต์แวร์ของเซิร์ฟเวอร์ # 5 อาจแก้ไขได้ ศึกษาเอกสาร HTTP / 2 ของเซิร์ฟเวอร์ของคุณสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีและเวลาที่ส่ง HTTP 421 หรือมิฉะนั้นคุณสามารถออกใบรับรองแยกต่างหากสำหรับแต่ละโดเมนได้ นอกจากนี้คุณยังสามารถปิด HTTP / 2 ได้โดยสิ้นเชิง แต่อาจเป็นเพราะ overkill ในกรณีส่วนใหญ่


ฉันมีใบรับรอง Multi-Domain Comodo PositiveSSL ซึ่งเป็นใบรับรอง SSL เดียว การแยกใบรับรองเป็นความพยายามและ / หรือค่าใช้จ่ายที่สำคัญ ณ จุดนี้ ปัญหาหลักมาจากการพยายามที่จะมีโดเมนที่ไม่คงที่เพื่อแสดงภาพของฉัน ไม่คุ้มกับจำนวน 421s ที่ฉันได้รับ ในขณะนี้ฉันได้ปิดใช้งานโดเมนแบบคงที่ ฉันยังคงมีการแชร์ทรัพยากรระหว่างโดเมน แต่จำนวน 421s ลดลงอย่างมาก ปัจจุบันไม่คุ้มกับประสิทธิภาพที่ควรจะเป็น สักวันฉันจะทดสอบข้อเสนอแนะของคุณเมื่อฉันมีเวลามากขึ้น
mseifert

ขอบคุณสำหรับคำอธิบายโดยละเอียด แม้ว่านี่จะเป็นปัญหาที่น่ารำคาญ (และคุณสังเกตได้เมื่อใช้ Safari เป็นส่วนใหญ่) ฉันพบว่ามีเหตุการณ์ที่ทำให้เกิดปัญหานี้น่าสนใจมาก :)
30419

1

บางทีนี่อาจจะเป็นประโยชน์กับใครบางคน

ฉันได้รับข้อผิดพลาดนี้เมื่อฉันพยายามเปลี่ยนการกำหนดค่าโฮสต์เสมือน apache เป็น HTTPS แต่เปลี่ยนพอร์ตจาก 80 เป็น 443 เท่านั้นและลืมเพิ่ม

   SSLEngine on
   SSLCertificateFile "/opt/lampp/htdocs/localhost.crt"
   SSLCertificateKeyFile "/opt/lampp/htdocs/localhost.key"

การกำหนดค่าทำให้เกิดข้อผิดพลาด 421:

<VirtualHost mydoamin.local:443>   <-- fistly I 
       DocumentRoot "/opt/lampp/htdocs/mydomain/"
       ServerName www.mydomain.local
</VirtualHost>

การกำหนดค่าที่ถูกต้อง:

<VirtualHost mydoamin.local:443>
       DocumentRoot "/opt/lampp/htdocs/mydomain/"
       ServerName www.mydomain.local
       SSLEngine on
       SSLCertificateFile "/opt/lampp/htdocs/localhost.crt"
       SSLCertificateKeyFile "/opt/lampp/htdocs/localhost.key"
</VirtualHost>

0

เราสังเกตเห็นปัญหาเดียวกันกับ Safari (เดสก์ท็อปและ iPhone) ในบางเว็บไซต์ที่ใช้ Debian 10 กับ Apache

ซอฟต์แวร์:

  • เดเบียน 10
  • Apache2 2.4.38-3 + deb10u3 พร้อม HTTP / 2
  • PHP 7.3.14-1 ~ deb10u1 พร้อม php-fpm

โดเมน:

  • www.example.com
  • a.example.com
  • b.example.com
  • โดเมนทั้งหมดชี้ไปที่ DocumentRoot เดียวกัน

รับรอง:

  • หนึ่งใบรับรองสำหรับโดเมนที่ใช้ทั้งหมด
  • ผู้ออกคือDFN PKI

วิธีแก้ปัญหานั้นค่อนข้างง่าย แต่ก็ต้องใช้ความพยายามมากในการค้นหา ในตอนท้ายมันเป็นการทดลองที่ผิดพลาด

การกำหนดค่าทำให้เกิดข้อผิดพลาด 421:

    # in /etc/apache2/site-enabled/www.example.com.conf
    SSLCertificateFile      /etc/apache2/ssl/www.example.com/cert-123.pem
    SSLCertificateKeyFile   /etc/apache2/ssl/www.example.com/www.example.com.key

    # in /etc/apache2/site-enabled/a.example.com.conf
    SSLCertificateFile      /etc/apache2/ssl/a.example.com/cert-123.pem
    SSLCertificateKeyFile   /etc/apache2/ssl/a.example.com/www.example.com.key

    # in /etc/apache2/site-enabled/b.example.com.conf
    SSLCertificateFile      /etc/apache2/ssl/b.example.com/cert-123.pem
    SSLCertificateKeyFile   /etc/apache2/ssl/b.example.com/www.example.com.key

การกำหนดค่าการทำงาน:

    # in /etc/apache2/site-enabled/www.example.com.conf
    SSLCertificateFile      /etc/apache2/ssl/www.example.com/cert-123.pem
    SSLCertificateKeyFile   /etc/apache2/ssl/www.example.com/www.example.com.key

    # in /etc/apache2/site-enabled/a.example.com.conf
    SSLCertificateFile      /etc/apache2/ssl/www.example.com/cert-123.pem
    SSLCertificateKeyFile   /etc/apache2/ssl/www.example.com/www.example.com.key

    # in /etc/apache2/site-enabled/b.example.com.conf
    SSLCertificateFile      /etc/apache2/ssl/www.example.com/cert-123.pem
    SSLCertificateKeyFile   /etc/apache2/ssl/www.example.com/www.example.com.key

วิธีแก้ไข (ในกรณีของเรา): ไม่อนุญาตให้คัดลอกใบรับรองและรหัสส่วนตัวไปยังสถานที่ต่างกัน

ก่อนที่เราจะคัดลอกใบรับรองไปยังไดเรกทอรีเฉพาะ VirtualHost สิ่งนี้ส่งผลให้เกิดพฤติกรรมการร้องขอ Misdirectedกับ Safari เท่านั้น

น่าเสียดายที่ฉันไม่สามารถอธิบายให้คุณได้ทำไม :-( (ข้อผิดพลาด Apache2 ข้อผิดพลาด Safari หรือไม่คุณสมบัติ Safari?)


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