วิธีกำหนดค่า IIS 7.5 SSL \ TLS ให้ทำงานกับ iOS 9 ATS


11

ปัญหา:แอพมือถือของเราไม่สามารถสร้างการเชื่อมต่อที่ปลอดภัยกับบริการบนเว็บของเราได้อีกต่อไปเนื่องจาก iOS 9 ตอนนี้ใช้ ATS

พื้นหลัง: iOS 9 แนะนำแอพ Transport Security

การตั้งค่าเซิร์ฟเวอร์: IIS Server 7.5 R2 SP1 (VM) IIS 7.5, SSL certs จาก digicert ปิดไฟร์วอลล์ Windows

คีย์ RSA 2048 บิต (e 65537)

ผู้ออก DigiCert SHA2 Secure Server CA

อัลกอริทึมลายมือชื่อ SHA512withRSA

นี่คือข้อกำหนดด้านความปลอดภัยของการขนส่งแอพ:

เซิร์ฟเวอร์ต้องรองรับโปรโตคอล Transport Layer Security (TLS) อย่างน้อย 1.2 เวอร์ชัน การเชื่อมต่อรหัสถูก จำกัด ให้ผู้ที่ให้ความลับไปข้างหน้า (ดูรายการของรหัสด้านล่าง) ใบรับรองจะต้องลงนามโดยใช้ SHA256 หรืออัลกอริทึมแฮชลายเซ็นที่ดีกว่าด้วยคีย์ RSA 2048 บิตหรือมากกว่าหรือ 256 Elliptic-Curve คีย์ (ECC) ใบรับรองที่ไม่ถูกต้องส่งผลให้เกิดความล้มเหลวอย่างหนักและไม่มีการเชื่อมต่อ เหล่านี้เป็นยันต์ที่ยอมรับได้:

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

สิ่งที่ได้ลอง:

  1. การเพิ่มข้อยกเว้นในแอพมือถือเพื่อให้โดเมนของเราทำงานได้ แต่ฉันไม่ต้องการใช้วิธีที่ไม่มีหลักประกันนี้ฉันต้องการแก้ไข SSL ของเรา
  2. ใช้IIS Cryptoเพื่อใช้ 'แนวปฏิบัติที่ดีที่สุด' ลอง 'pci' และการตั้งค่าแบบกำหนดเอง แม้แต่ลองปรับเปลี่ยนชุด crypto เป็นเพียงรายการด้านบนและทำการเรียงลำดับใหม่ หลังจากพยายามแต่ละครั้งเซิร์ฟเวอร์จะเริ่มระบบใหม่และSSL Labsทำงาน (หลังจากล้างแคช) ฉันประสบความสำเร็จในการเปลี่ยนจากการจัดอันดับ F เป็น A และแม้แต่ A- แต่สิ่งนี้ทำให้ iOS 8 และ 9 ไม่สามารถสร้างการเชื่อมต่อที่ปลอดภัยได้ (รหัส NSURLErrorDomain = -1200 และ _kCFStreamErrorCodeKey = -9806) ป้อนคำอธิบายรูปภาพที่นี่
  3. เรียกคืน VM และลองใช้สคริปต์ powershell ตั้งค่า IIS ของคุณสำหรับ SSL Perfect Forward Secrecy และ TLS 1.2ฉันได้ลองครั้งที่สองที่ฉันแก้ไข cyphers จาก power script ไปยังรายการที่จำเป็นน้อยที่สุด

ผลลัพธ์:คะแนนที่คล้ายกันเสมอของ A หรือ A- iOS8 และ iOS9 ไม่สามารถต่อรองการเชื่อมต่อที่ปลอดภัยได้ ผลการจำลองการจับมือกันใน "โปรโตคอลหรือชุดรหัสไม่ตรงกัน" สำหรับผลิตภัณฑ์ Safari และ iOS ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

อัปเดตหลังจากทำงานกับฝ่ายสนับสนุนของ Apple เราได้ทำการจับแพ็คเก็ตการติดตาม

$ tcpdump -n -r trace.pcap
reading from file trace.pcap, link-type EN10MB (Ethernet)
client > server [S], seq 1750839998, win 65535, length 0
server > client [S.], seq 2461151276, ack 1750839999, win 8192, length 0
client > server [.], ack 1, win 4104, length 0
client > server [P.], seq 1:175, ack 1, win 4104, length 174
server > client [R.], seq 1, ack 175, win 0, length 0

สามแพ็กเก็ตแรกคือการจับมือสามทางแบบคลาสสิกของ SYN - SYN-ACK - ACK ที่ตั้งค่าการเชื่อมต่อ TCP แพ็กเก็ตที่สี่คือ iOS ส่งข้อความ TLS ไคลเอ็นต์ Hello เซิร์ฟเวอร์ของคุณขั้นตอนแรกในการตั้งค่าการเชื่อมต่อ TLS ผ่านการเชื่อมต่อ TCP นั้น ฉันแยกข้อความนี้ออกแล้วและมันก็ดูสมเหตุสมผลแล้ว ในแพ็กเก็ตที่ห้าเซิร์ฟเวอร์จะทำการตัดการเชื่อมต่อ (โดยการส่ง RST)

ไม่มีใครรู้ว่าทำไม IIS 7.5 จะทำ RST หรือไม่?


ฉันได้ติดต่อ Digicert อีกครั้งเราเปลี่ยนใบรับรอง RSA ของฉันสำหรับใบรับรอง ECC ตอนนี้ฉันใช้งาน iOS 9 ได้อย่างปลอดภัยแล้ว แต่ตอนนี้ iOS 8 จะไม่เชื่อมต่อภายใต้การกำหนดค่าหลายครั้ง
RobDigital

คำตอบ:


5

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

คำตอบสั้น ๆ : คุณไม่ควรใช้ IIS Crypto เพื่อระบุลำดับของ Cipher Suites ฉันขอแนะนำให้คุณคลิกที่ปุ่ม "ค่าเริ่มต้น" เพื่อลบคำสั่งซื้อที่ตั้งไว้ก่อนหน้านี้แล้วใช้นโยบายกลุ่ม ("การกำหนดค่าคอมพิวเตอร์" \ "เทมเพลตการดูแล" "เครือข่าย" \ "การตั้งค่าการกำหนดค่า SSL") เพื่อกำหนดค่า Cipher Suites ผ่านนโยบายท้องถิ่น

สาเหตุของข้อผิดพลาด "โปรโตคอลหรือชุดรหัสไม่ตรงกัน" อาจเป็นหนึ่งในด้านล่าง :

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

บัญชีดำที่แน่นอนอาจแตกต่างกันไปในแต่ละระบบ คุณสามารถค้นหาในบัญชีดำบางรายการในอินเทอร์เน็ต ตัวอย่างเช่นภาคผนวก Aของ RFC 7540 (Hypertext Transfer Protocol เวอร์ชั่น 2 (HTTP / 2)) มีหนึ่งรายการ ชุดรหัสTLS_RSA_WITH_AES_128_CBC_SHAสำหรับ TLS 1.2 (ดูที่นี่ ) TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256และTLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256สำหรับ TLS 1.3 (ดูที่นี่ ) TLS_ECDHE_ECDSA_*มีความสำคัญเพียงอย่างเดียวคือคุณใช้ใบรับรองที่มีเส้นโค้งรูปไข่ ชุดรหัสที่ดีอื่น ๆTLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256ยังไม่ได้นำมาใช้โดย Microsoft นอกจากนี้คุณสามารถพิจารณาเพิ่มอย่างน้อยTLS_ECDHE_RSA_WITH_AES_256_CBC_SHAเพื่อรองรับการเชื่อมต่อจากระบบเก่าและTLS_RSA_WITH_AES_128_CBC_SHAรองรับระบบเก่ามาก (Android 2.3.7, Java 6u45, OpenSSL 0.9.8y) และTLS_RSA_WITH_3DES_EDE_CBC_SHAเฉพาะในกรณีที่คุณต้องการรองรับ IE 8 / XP ตัวอย่างเช่นคุณสามารถใช้วันนี้

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA

ด้วย TLS 1.0 ที่ปิดใช้งาน TLS 1.1จะมีความปลอดภัยมากกว่าหรือดีกว่า

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

หากคุณต้องการความปลอดภัยที่ดีและประสิทธิภาพที่ดีที่สุด

คุณสามารถตั้งค่าชุดรหัสสั้น ๆ ดังต่อไปนี้เพื่อแก้ปัญหาของคุณ:

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

ด้านล่างนี้ผมมีตัวอย่างของการกำหนดค่าบน Windows 10 ฉันกำหนดค่า IIS 10 ที่จะมีการให้คะแนน A + จาก Qualys SSL Labs กับอาร์เอส 2048 ที่สำคัญและใบรับรอง SSL ฟรีจาก Let 's เข้ารหัส

ป้อนคำอธิบายรูปภาพที่นี่

ฉันปิดการใช้งาน DES 56/56, RC2 128/128, RC2 40/128, RC2 56/128, RC4 128/128, RC4 40/128, RC4 56/128, RC4 56/128, RC4 64/128, Triple DES 168/168, NULL, MD5, Multi-Protocol Unified Hello, PCT 1.0, SSL 2.0, SSL 3.0 และ TLS 1.0 / 1.1 ด้วยตนเองในรีจิสทรี (ดูKB245030 ) ฉันปิดใช้งานโปรโตคอล TLS 1.0 และ TLS 1.1 เท่านั้นเนื่องจาก TLS_FALLBACK_SCSV (การโจมตีที่ลดระดับ) ไม่สามารถป้องกันได้ใน IIS จนถึงขณะนี้ซึ่งทำให้ไม่สามารถรับคะแนน A + ของwww.ssllabs.comได้ ฉันเห็นว่ามันเป็นข้อเสีย แต่ปัจจุบันรองรับ TLS 1.2 กว้างมาก ตามวิธีที่คุณสามารถใช้ได้DisabledByDefault: 1แต่Enabled: 1สำหรับ TLS 1.0 และ TLS 1.1 มันจะมีประโยชน์ถ้าคุณจะเรียกใช้ SQL Server 2008/2012 บนคอมพิวเตอร์ เว็บเซิร์ฟเวอร์จะไม่ใช้ TLS 1.0 และ TLS 1.1 แต่ใช้งาน SQL Server

ขั้นตอนที่สำคัญที่สุดซึ่งใช้เวลาของฉันมากและปัญหาหลักของคุณคือการกำหนดค่าของ Cipher Suites gpedit.mscฉันทำมันโดยใช้ ฉันเลือก "การกำหนดค่าคอมพิวเตอร์" \ "เทมเพลตการดูแล" \ "เครือข่าย" \ "การตั้งค่าการกำหนดค่า SSL" และกำหนดค่า "ลำดับของชุดรหัส SSL" เป็นค่าต่อไปนี้

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

ลำดับข้างต้นอาจไม่เหมาะสมและฉันไม่แน่ใจว่าโปรโตคอลข้างต้นทั้งหมดได้รับการสนับสนุนใน IIS 7.5 (ฉันใช้ IIS 10.0 จาก Windows 10) อย่างไรก็ตามฉันแน่ใจว่าปัญหาของคุณเกี่ยวข้องกับรายการ Cipher Suite เพราะฉันมีปัญหาเช่นเดียวกับที่คุณอธิบายระหว่างการทดลองกับรายการ Cipher Suite

ไม่ว่าด้วยวิธีใดหลังจากกำหนดค่าการตั้งค่าข้างต้นใน Group Polity และรีบูตคอมพิวเตอร์ ( gpupdate /force /target:computerไม่เพียงพอในการทดสอบของฉัน) ฉันได้รับคะแนน A + และรายการผลการทดสอบของส่วน "Handshake Simulation" ต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

จะเห็นได้ว่า iOS ได้รับการสนับสนุนสำหรับไคลเอ็นต์ต่อไปนี้:

Safari 6 / iOS 6.0.1
Safari 7 / iOS 7.1
Safari 8 / iOS 8.4
Safari 9 / iOS 9

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


+1 สำหรับการรับชมด้วย IISCrypto ฉันเห็นการตั้งค่า 112ES 3DES ปิดการใช้งานคีย์บน Windows ไม่ถูกต้อง ... ไม่ชัดเจนเมื่อใช้เครื่องมือนี้
felickz

0

หากรูปภาพ IIS Crypto ของคุณเป็นรุ่นล่าสุดให้ตั้งค่าตามที่เป็น แต่จะเปิดใช้งาน SHA, Diffie-Hellman และ PKCS สิ่งนี้จะทำให้คุณได้รับคะแนน A แต่อนุญาตให้ iOS 8 หรือต่ำกว่าเชื่อมต่อได้


ฉันเปิดใช้งาน SHA, Diffie-Hellman และ PKCS ตามที่คุณแนะนำ เซิร์ฟเวอร์ที่รีสตาร์ทแล้วและทดสอบ ssl labs อีกครั้ง ไม่มีโชค. ยังคงไม่สามารถเชื่อมต่อกับ iOS 9 และยังคงได้รับ "โปรโตคอลหรือชุดรหัสไม่ตรงกัน" ใน SSL Labs
RobDigital

0

ฉันดิ้นรนกับสิ่งนี้สองสามวัน โดยเฉพาะอย่างยิ่งฉันกำลังเชื่อมต่อจากแอพ iOS โดยใช้ Xamarin Forms PCL เพื่อเชื่อมต่อกับบริการที่พัก ASP.NET Web Api 2 ด้วยการตรวจสอบสิทธิ์ OAuth2 Bearer Token

สิ่งที่ใช้ได้ผลสำหรับฉันในที่สุดคือการใช้แนวทางปฏิบัติที่ดีที่สุดของ IIS Crypto จากนั้นแก้ไขรีจิสตรีคีย์ที่ตั้งค่าไว้สำหรับลำดับของชุดรหัส:

KEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002\Function

ฉันประสบความสำเร็จด้วยค่าต่อไปนี้:

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P521, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P521, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P521, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P521,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P521, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P521, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P521, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P521, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P521, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, TLS_DHE_DSS_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_RC4_128_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_RC4_128_MD5, TLS_RSA_WITH_DES_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

พบล่าสุดโดยใช้ Charles Proxy ซึ่งเจรจา TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 โดยอัตโนมัติ สิ่งที่ทำให้ฉันเป็นเช่นนี้ก็คือการเชื่อมต่อประสบความสำเร็จกับ Charles Proxy on (เมื่อติดตั้งใบรับรองตัวจำลอง) แต่ล้มเหลวเป็นอย่างอื่น การเพิ่มชุดที่ใช้ในการเจรจาทำได้เคล็ดลับ ดูเหมือนว่า (?) ว่าพร็อกซีกำลังทำการเจรจาใหม่กับบริการที่เหลือของฉันกับบางสิ่งที่เซิร์ฟเวอร์ของฉันรองรับ แต่ไม่ใช่ไคลเอ็นต์ iOS

หมายเหตุชุดรหัสจำนวนมากได้มาจากข้อกำหนดคุณสมบัติของ ssllabs ที่ต้องการสำหรับอุปกรณ์ iOS / OSX ต่างๆ ค่าข้างต้นควรจับมือกับทุกอย่างยกเว้น IE 6 บน XPตาม ssllabs พร้อมอันดับ A

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