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

ความเป็นมา: iOS 9 แนะนำ App Transport Security

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

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

ผู้ออก DigiCert SHA2 Secure Server CA

อัลกอริธึมลายเซ็น SHA512withRSA

นี่คือข้อกำหนดด้านความปลอดภัยของ App Transport:

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

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

UPDATEหลังจากทำงานกับฝ่ายสนับสนุนของ 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

The first three packets are the classic SYN - SYN-ACK - ACK three way handshake that sets up the TCP connection. The fourth packet is iOS sending your server a TLS Client Hello message, the first step in setting up a TLS connection over that TCP connection. I’ve pulled apart this message and it looks reasonable enough. In the fifth packet the server simply drops the connection (by sending a RST).

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

answer

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

คำตอบสั้น ๆ : คุณไม่ควรใช้ 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_SHA256Microsoft ยังไม่ได้ใช้งานชุดการเข้ารหัสที่ดีมากนอกจากนี้ คุณสามารถพิจารณาเพิ่มอย่างน้อย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 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 (Downgrade โจมตี) ไม่สามารถป้องกันได้ใน IIS จนถึงขณะนี้ซึ่งจะทำให้เป็นไปไม่ได้ที่จะได้รับคะแนน A + ของwww.ssllabs.comฉันเห็นว่ามันเป็นข้อเสีย แต่ปัจจุบันรองรับ TLS 1.2 ได้กว้างมาก โดยวิธีการที่คุณสามารถใช้แต่สำหรับ TLS 1.0 และ TLS 1.1 อาจเป็นประโยชน์หากคุณเรียกใช้ SQL Server 2008/2012 บนคอมพิวเตอร์ เว็บเซิร์ฟเวอร์จะไม่ใช้ TLS 1.0 และ TLS 1.1 แต่ SQL Server จะใช้DisabledByDefault: 1Enabled: 1

ขั้นตอนที่สำคัญที่สุด ซึ่งทำให้ฉันเสียเวลาและปัญหาหลักของคุณคือการกำหนดค่า 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+ และรายการผลการทดสอบต่อไปนี้ของส่วน "การจำลองการจับมือกัน":

ใส่คำอธิบายภาพที่นี่ ใส่คำอธิบายภาพที่นี่ ใส่คำอธิบายภาพที่นี่ ใส่คำอธิบายภาพที่นี่

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

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

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

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

ฉันต่อสู้กับสิ่งนี้มาสองสามวัน โดยเฉพาะอย่างยิ่งฉันกำลังเชื่อมต่อจากแอป 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 บน (โดยติดตั้งใบรับรองจำลอง) แต่ล้มเหลวอย่างอื่น การเพิ่มห้องชุดที่ใช้ในการเจรจาก็ได้ผลดี ปรากฏ (?) ว่าพร็อกซีกำลังเจรจาใหม่กับบริการพักของฉันด้วยบางสิ่งที่เซิร์ฟเวอร์ของฉันรองรับ แต่ไม่ใช่ไคลเอนต์ iOS

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