วิธีปิดการใช้งาน TLS 1.1 & 1.2 ใน Apache


13

ฉันมีเซิร์ฟเวอร์ Ubuntu 12.04.2 LTS ที่ใช้ Apache 2.2.22 พร้อม mod_ssl และ OpenSSL v1.0.1

ใน vhosts การตั้งค่าของฉัน (ทุกสิ่งทุกอย่างภายในซึ่งทำงานเป็นผมจะคาดหวัง) ผมมีความสอดคล้องกับSSLProtocol-all +SSLv3

ด้วยการกำหนดค่านั้น TLS 1.1 & 1.2 เปิดใช้งานและทำงานอย่างถูกต้องซึ่งเป็นสิ่งที่ขัดกับฉันอย่างที่ฉันคาดหวังว่าจะเปิดใช้งาน SSLv3 เท่านั้นเนื่องจากการกำหนดค่านั้น

ฉันสามารถเปิด / ปิดใช้งาน TLSv1 ได้ดี-/+TSLv1และทำงานได้ตามที่คาดไว้ แต่+/-TLSv1.1และ+/-TLSv1.2ไม่ใช่ตัวเลือกการกำหนดค่าที่ถูกต้อง - ดังนั้นฉันจึงไม่สามารถปิดใช้งานวิธีนั้นได้

สำหรับสาเหตุที่ฉันต้องการทำเช่นนี้ - ฉันกำลังจัดการกับแอปพลิเคชันของบุคคลที่สาม (ซึ่งฉันไม่สามารถควบคุมได้) ที่มีพฤติกรรมบั๊กกี้กับเซิร์ฟเวอร์ที่เปิดใช้งาน TLS และฉันต้องปิดการใช้งานโดยสมบูรณ์


เพิ่งจะอยากรู้อยากเห็น - ฉันอาจถามว่าทำไมคุณต้องการที่จะปิดการใช้งาน TSL ในสถานที่แรก? จากสิ่งที่ฉันรวบรวมมันควรจะปลอดภัยกว่า SSLv1 / 2/3 ดังนั้นฉันสามารถจินตนาการได้ว่าเหตุผลที่ต้องการอนุญาต v1.2 เท่านั้นไม่ใช่ v1.1 (นั่นคือสิ่งที่นำฉันมาที่นี่) แต่ไม่ใช่เพื่อปิดการใช้งาน ในความโปรดปรานของ SSL ยกเว้นบางปัญหาความเข้ากันได้กับซอฟต์แวร์รุ่นเก่า
codeling

@codeling การทำงานกับซอฟต์แวร์เก่าที่มีบุคคลที่สามซึ่งมีข้อบกพร่องกับ TLS
Kyle Lowry

คำตอบ:


23

ด้วยข้อผิดพลาดนี้ (และใช่ฉันสามารถทำซ้ำได้) ฉันดูที่ซอร์สโค้ดสำหรับเวอร์ชันเสถียรล่าสุดmod_sslและพบคำอธิบาย อดทนกับฉันนี่จะเป็นมือสมัครเล่นมากเกินไป:

เมื่อSSLProtocolแยกวิเคราะห์แล้วจะส่งผลให้มีcharลักษณะดังนี้:

0 1 0 0
^ ^ ^ ^
| | | SSLv1
| | SSLv2
| SSLv3
TLSv1

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

OpenSSL รองรับการตั้งค่าโพรโทคอลสำหรับ TLSv1.1 แต่เนื่องจากSSLProtocolไม่มีบัญชีสำหรับตัวเลือกนี้จึงไม่เคยถูกปิดใช้งาน OpenSSL v1.0.1 มีปัญหาที่ทราบบางอย่างเกี่ยวกับ TLSv1.2 แต่ถ้ารองรับฉันคิดว่ามันจะเป็นแบบนั้นสำหรับ TLSv1.1; มันไม่ได้รู้จัก / จัดการโดย mod_ssl จึงไม่เคยปิดการใช้งาน

การอ้างอิงซอร์สโค้ดสำหรับ mod_ssl:

SSLProtocolได้รับการแยกวิเคราะห์ที่บรรทัด 925 ในpkg.sslmod/ssl_engine_config.c
ตัวเลือกที่ใช้ในฟังก์ชั่นดังกล่าวข้างต้นจะถูกกำหนดที่บรรทัด 444 ในpkg.sslmod/mod_ssl.h
โปรโตคอลทั้งหมดได้รับการเปิดใช้งานที่บรรทัด 586 ในpkg.sslmod/ssl_engine_init.cหลังจากนั้นโปรโตคอลที่เฉพาะเจาะจงได้รับการปิดการใช้งานในบรรทัดต่อมา

วิธีการปิดการใช้งานแล้ว?

คุณมีตัวเลือกน้อย:

  1. ปิดการใช้งานในไฟล์กำหนดค่า OpenSSL ด้วย:
    Protocols All,-TLSv1.1,-TLSv1.2
  2. เขียนซ้ำmod_ssl;-)

ดูเหมือนคำตอบที่สมบูรณ์แบบเพียงแค่ต้องการตรวจสอบ: ไฟล์กำหนดค่าใด / อะไร / ที่ไหน OpenSSL
Kyle Lowry

openssl.cnf- ตำแหน่งขึ้นอยู่กับการติดตั้ง ใน Debian บีบผมพบว่ามันอยู่ที่/etc/ssl/openssl.cnfใน OS X ที่/System/Library/OpenSSL/openssl.cnfและ Windows %systemdrive%\openssl\openssl.cnf7
Mathias R. Jessen

1
ตอนนี้ฉันกำลังดูไฟล์ปรับแต่งอยู่ ไวยากรณ์ดูเหมือนแตกต่างจากที่ฉันคาดไว้ตามคำตอบของคุณและฉันไม่สามารถหาอะไรทางออนไลน์ที่ระบุชัดเจนว่าคุณสามารถควบคุมโปรโตคอลที่เปิด / ปิดการใช้งานจากไฟล์ปรับแต่งนั้น คุณมีการอ้างอิงสำหรับสิ่งนั้นหรือไม่? ขอบคุณ
Kyle Lowry

ตัวเลือกอื่น - การใช้: SSLProtocolในลักษณะเดียวกันข้างต้น ( SSLProtocol All -TLSv1.1 -TLSv1.2(ไม่จำเป็นต้องใช้เครื่องหมายจุลภาค)) แต่ภายใต้การกำหนดค่า Apache ทั่วโลกหรือเฉพาะเจาะจงเพื่อ 'แทนที่' การกำหนดค่า SSL ทั่วโลกที่กล่าวถึงข้างต้น (หากคุณไม่ต้องการเปลี่ยน ciphers SSL ทั้งหมด -> เนื่องจากรหัสที่คุณต้องการนั้นถือว่าอ่อนแอ)
bshea

2

ปัญหานี้ยังแก้ไขได้ที่ความคิดเห็นในหน้า mod_ssl Apache: http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#comment_1136

หาก Ubuntu 12.04 มี Apache 2.2.23 ปัญหาจะไม่เกิดขึ้น ตามความคิดเห็นเป็นไปได้ที่จะเปิดใช้งาน TLSv1.1 และ TLSv1.2 แต่เปิดใช้งาน TLSv1.0 แล้วเช่นกัน:

SSLProtocol All -SSLv2 -SSLv3

1

ก่อนอื่นคุณต้องระบุvhost เริ่มต้นสำหรับพอร์ต 443ในเซิร์ฟเวอร์ของคุณ (SSL vhost ตัวแรกที่ Apache โหลด) และแก้ไขไฟล์กำหนดค่า ผู้ใช้ส่วนใหญ่มีไฟล์ssl.confในเซิร์ฟเวอร์โดยมี vhost สำหรับพอร์ต 443 ที่กำหนดค่าไว้ที่นั่น เนื่องจากชื่อของไฟล์นี้ขึ้นต้นด้วย "s" มันจะโหลดก่อน vhosts ที่กำหนดค่าใน vhosts.conf (ซึ่งเริ่มต้นด้วย "v") ดังนั้นตรวจสอบว่านี่เป็นกรณีของคุณหรือไม่ (คำตอบคือ "ใช่" สำหรับทุกคน) และเปลี่ยนโปรโตคอลในไฟล์นั้น พอแล้ว!

มีการโพสต์ปัญหาที่คล้ายกันที่นี่: วิธีปิดใช้งาน TLS 1.1 & 1.2 ใน Apache ได้อย่างไร . ตาม HBruijn:

ยกเว้นว่าคุณมี IP VirtualHosts ในทางปฏิบัติการตั้งค่าจากการเกิดขึ้นครั้งแรกของคำสั่ง SSLProtocol จะใช้สำหรับเซิร์ฟเวอร์ทั้งหมดและ / หรือ VirtualHosts ที่ใช้ชื่อทั้งหมดที่สนับสนุน TLS

และอีกอันที่นี่: เป็นไปได้ไหมที่จะตั้งค่า SSLProtocol ใน Apache สำหรับ VirtualHost (พุดเดิ้ล) เดียว? . ตาม vallismortis:

คุณสามารถตั้งค่า SSLProtocol สำหรับ VirtualHost แรกในไฟล์กำหนดค่าเท่านั้น รายการ VirtualHost ที่ตามมาทั้งหมดจะรับช่วงการตั้งค่านั้นจากรายการแรกและไม่สนใจการตั้งค่าของตนเองเนื่องจากข้อบกพร่อง OpenSSL

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

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