Vấn đề: Ứng dụng di động của chúng tôi không còn có thể thiết lập kết nối an toàn với dịch vụ web của chúng tôi vì iOS 9 hiện sử dụng ATS.
Bối cảnh: iOS 9 giới thiệu App Transport Security
Cài đặt máy chủ: Windows Server 2008 R2 SP1 (VM) IIS 7.5, SSL certs từ digicert. Tường lửa Windows tắt.
Khóa RSA 2048 bit (e 65537)
Nhà phát hành DigiCert SHA2 Máy chủ bảo mật CA
Thuật toán chữ ký SHA512withRSA
Đây là các yêu cầu Bảo mật Vận chuyển Ứng dụng:
Máy chủ phải hỗ trợ ít nhất phiên bản giao thức TLS (Transport Layer Security) phiên bản 1.2. Các mật mã kết nối được giới hạn ở các mật mã cung cấp bảo mật chuyển tiếp (xem danh sách các mật mã bên dưới.) Chứng chỉ phải được ký bằng thuật toán băm chữ ký SHA256 hoặc tốt hơn, với khóa RSA 2048 bit hoặc lớn hơn hoặc đường cong Elliptic 256 bit hoặc lớn hơn (ECC) phím. Chứng chỉ không hợp lệ dẫn đến lỗi cứng và không có kết nối. Đây là những mật mã được chấp nhận:
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
Những gì đã được thử:
- Thêm ngoại lệ trong ứng dụng di động để cho phép tên miền của chúng tôi hoạt động, nhưng tôi không muốn sử dụng phương pháp không bảo mật này, tôi muốn sửa SSL của chúng tôi.
- Sử dụng IIS Crypto để sử dụng 'thực hành tốt nhất, cố gắng 'pci', và các thiết lập tùy chỉnh. Thậm chí đã thử sửa đổi bộ tiền điện tử thành danh sách trên và sắp xếp lại. Sau mỗi lần thử, máy chủ được khởi động lại và SSL Labs đã được chạy (sau khi xóa bộ nhớ cache). Tôi đã thành công khi chuyển từ xếp hạng F sang A và thậm chí A-, nhưng điều này chỉ dẫn đến iOS 8 và 9 không thể thiết lập kết nối an toàn. (Mã NSURLErrorDomain = -1200 và _kCFStreamErrorCodeKey = -9806)
- Đã khôi phục VM và thử tập lệnh powershell Thiết lập IIS cho SSL Perfect Forward Secrecy và TLS 1.2 Tôi thậm chí đã thực hiện lần thử thứ hai trong đó tôi đã chỉnh sửa các cyphers từ tập lệnh power thành một danh sách tối thiểu những gì được yêu cầu.
Kết quả: Luôn giống nhau, xếp hạng của A hoặc A-. iOS8 và iOS9 không thể đàm phán kết nối an toàn. Bắt tay Mô phỏng kết quả trong "Giao thức hoặc bộ mật mã không khớp" cho các sản phẩm Safari và iOS.
CẬP NHẬT Sau khi làm việc với bộ phận hỗ trợ của Apple, chúng tôi đã thực hiện một số thao tác truy tìm gói:
$ 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
Ba gói đầu tiên là bắt tay ba cách cổ điển SYN - SYN-ACK - ACK để thiết lập kết nối TCP. Gói thứ tư là iOS gửi cho máy chủ của bạn một tin nhắn Xin chào khách hàng TLS, bước đầu tiên trong việc thiết lập kết nối TLS qua kết nối TCP đó. Tôi đã tách tin nhắn này ra và nó có vẻ hợp lý. Trong gói thứ năm, máy chủ chỉ cần ngắt kết nối (bằng cách gửi RST).
Có ai biết tại sao IIS 7.5 sẽ thực hiện RST không?