ปิดใช้งาน TLS 1.0 ใน NGINX


22

ฉันมี NGINX ซึ่งทำหน้าที่เป็นพร็อกซีย้อนกลับสำหรับไซต์ของเราและทำงานได้ดีมาก สำหรับเว็บไซต์ที่ต้องการ ssl ฉันติดตามraymii.orgเพื่อให้แน่ใจว่าได้คะแนน SSLLabs ที่แข็งแกร่งที่สุดเท่าที่จะทำได้ หนึ่งในไซต์ต้องเป็นไปตามมาตรฐาน PCI DSS แต่จากการสแกน TrustWave ล่าสุดนั้นล้มเหลวเนื่องจาก TLS 1.0 เปิดใช้งานอยู่

ในระดับ http ใน nginx.conf ฉันมี:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

สำหรับเซิร์ฟเวอร์เฉพาะฉันมี:

ssl_protocols TLSv1.1 TLSv1.2;

ฉันเปลี่ยน ciphers ย้ายสิ่งต่าง ๆ ออกจากระดับ http และไปยังเซิร์ฟเวอร์ไซต์ ssl แต่ละตัว แต่ไม่ว่าจะเกิดอะไรขึ้นเมื่อฉันเรียกใช้:

openssl s_client -connect www.example.com:443 -tls1

ฉันได้รับการเชื่อมต่อที่ถูกต้องสำหรับ TLS 1.0 SSLLabs ทำให้การตั้งค่า nginx สำหรับเว็บไซต์เป็นAแต่ด้วย TLS 1.0 ดังนั้นฉันเชื่อว่าส่วนที่เหลือของการตั้งค่าของฉันถูกต้องมันจะไม่ปิด TLS 1.0

คิดในสิ่งที่ฉันอาจหายไป?

openssl version -a
OpenSSL 1.0.1f 6 Jan 2014
built on: Thu Jun 11 15:28:12 UTC 2015
platform: debian-amd64

nginx -v
nginx version: nginx/1.8.0

1
โปรดทราบว่าไม่จำเป็นต้องลบ TLS 1.0 จนถึง 30 มิถุนายน 2016
Michael Hampton

คำตอบ:


12

ปัญหาที่นี่คือServer name indicationส่วนหนึ่งของการเจรจา TLS เสร็จสิ้นหลังจากการเชื่อมต่อตัวเองได้รับการเจรจา และโปรโตคอลจะถูกเจรจาในระหว่างการเจรจาการเชื่อมต่อ

อาจเป็นไปได้ที่จะไม่บังคับใช้ TLS v1.0 สำหรับโฮสต์เสมือนนั้นหากคุณกำหนดค่าโฮสต์เสมือนนั้นเป็นที่อยู่ IP บนเซิร์ฟเวอร์ที่ไม่มีโฮสต์เสมือนอื่นที่เชื่อมโยงอยู่ ดังนั้น nginx จะรู้ตามที่อยู่ IP ที่ไม่อนุญาต TLS v 1.0


ขอบคุณ ฉันสมมติว่าไม่มีวิธีแก้ปัญหานี้เนื่องจากเราไม่มี IP สำรองในขณะนี้เพื่อทดสอบ
Shawn C.

1
Server Name Indicationเป็นส่วนหนึ่งของ ClientHelloTLS มันอยู่ในข้อความแรกที่ส่งโดยลูกค้าและไม่ได้เจรจาในภายหลัง ฟังดูเหมือน Nginx มีข้อบกพร่องในการออกแบบ ดูเหมือนว่าจะยอมรับการเชื่อมต่อแล้วส่งต่อไปยังโฮสต์เสมือนไม่ว่าจะถูกหรือผิด nginx ควรแยกวิเคราะห์ชื่อเซิร์ฟเวอร์ปรึกษาโฮสต์เสมือนจากนั้นปฏิเสธการเชื่อมต่อหากไม่สามารถปฏิบัติตามข้อกำหนดของโฮสต์เสมือนได้ ข้อบกพร่องของการออกแบบน่าจะเป็น CVE ที่คุ้มค่าเนื่องจาก TLS 1.0 เป็นปัญหาในบางครั้ง เห็นได้ชัดว่าเป็นการละเมิด C&A ในบางสถานการณ์

ขอบคุณสำหรับความคิดเห็น นี่เป็นเรื่องที่น่าสนใจหากเป็นข้อบกพร่องในการออกแบบที่แท้จริง
Tero Kilkanen

1
สิ่งนี้ไม่เปลี่ยนแปลงในปี 2562 เมื่อใช้รุ่น nginx ที่ใหม่กว่าหรือไม่
robsch

18

ไปหาบล็อกเซิร์ฟเวอร์ที่คุณต้องการใช้เป็นแม่แบบการเจรจา SSL "เริ่มต้น" ของคุณ ค้นหาสายการฟังของคุณ

server {
    ...
    listen 443 ssl;
    ssl_protocols TLSv1.1 TLSv1.2;
    ...
}

และเพิ่มdefault_serverที่ส่วนท้ายของบรรทัด

server {
    ...
    listen 443 ssl default_server;
    ssl_protocols TLSv1.1 TLSv1.2;
    ...
}

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


นั่นหมายความว่ามีเพียงสถานที่เดียวที่ ssl_protocolls มีผลหรือไม่ ภายในการกำหนดค่าเซิร์ฟเวอร์ที่มีการประกาศ default_server? เมื่อใช้การกำหนดค่านี้ในระหว่างการเจรจาการตั้งค่า ssl_protocolls ภายในการกำหนดค่าอื่นจะไม่มีผลหรือไม่
robsch

4

ฉันปิดใช้งาน TLSv1 ใน nginx เวอร์ชั่น 1.8.1 คุณต้องอัปเดต openssl เป็นเวอร์ชั่น 1.0.1g หรือ 1.0.1h จากนั้นเพียงลบ 'TLSv1' ออกจากคำสั่ง ssl_protocols:

ssl_protocols TLSv1.1 TLSv1.2

จากนั้นตรวจสอบการเชื่อมต่อผ่าน TLSv1 ตามคำสั่ง:

openssl s_client -tls1 -connect example.com:443 < /dev/null

คุณควรได้รับสิ่งนั้น:

CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : 0000
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1474531027
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---

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