ปัญหา:แอพมือถือของเราไม่สามารถสร้างการเชื่อมต่อที่ปลอดภัยกับบริการบนเว็บของเราได้อีกต่อไปเนื่องจาก 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
สิ่งที่ได้ลอง:
- การเพิ่มข้อยกเว้นในแอพมือถือเพื่อให้โดเมนของเราทำงานได้ แต่ฉันไม่ต้องการใช้วิธีที่ไม่มีหลักประกันนี้ฉันต้องการแก้ไข SSL ของเรา
- ใช้IIS Cryptoเพื่อใช้ 'แนวปฏิบัติที่ดีที่สุด' ลอง 'pci' และการตั้งค่าแบบกำหนดเอง แม้แต่ลองปรับเปลี่ยนชุด crypto เป็นเพียงรายการด้านบนและทำการเรียงลำดับใหม่ หลังจากพยายามแต่ละครั้งเซิร์ฟเวอร์จะเริ่มระบบใหม่และSSL Labsทำงาน (หลังจากล้างแคช) ฉันประสบความสำเร็จในการเปลี่ยนจากการจัดอันดับ F เป็น A และแม้แต่ A- แต่สิ่งนี้ทำให้ iOS 8 และ 9 ไม่สามารถสร้างการเชื่อมต่อที่ปลอดภัยได้ (รหัส NSURLErrorDomain = -1200 และ _kCFStreamErrorCodeKey = -9806)
- เรียกคืน 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 หรือไม่?