Проблема: Наш мобільний додаток більше не може встановити захищене з'єднання з нашою веб-службою, оскільки iOS 9 зараз використовує ATS.
Передумови: iOS 9 представляє безпеку транспорту додатків
Налаштування сервера: Windows Server 2008 R2 SP1 (VM) IIS 7.5, сертифікати SSL від digicert. Брандмауер Windows вимкнено.
Ключові біти RSA 2048 (e 65537)
Емітент DigiCert SHA2 Secure Server CA
Алгоритм підпису SHA512зRSA
Ось такі вимоги щодо безпеки транспорту додатків:
Сервер повинен підтримувати принаймні протокол протоколу безпеки транспортного рівня (TLS) версії 1.2. Шифри підключення обмежуються тими, які забезпечують таємницю прямого перегляду (див. Перелік шифрів нижче.) Сертифікати повинні бути підписані за допомогою SHA256 або кращого алгоритму хешування підпису, або 2048 бітовим або більшим ключем RSA, або 256-бітовою або більшою еліптичною кривою (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" та власні налаштування. Навіть спробував змінити набір криптовалют лише до переліку, наведеного вище, і переупорядкувати. Після кожної спроби сервер перезавантажується, і запускалися лабораторії SSL (після очищення кеша). Я мав успіх у переході від рейтингу F до рівня A і навіть A-, але це призвело лише до того, що iOS 8 і 9 не змогли встановити безпечні з'єднання. (NSURLErrorDomain Code = -1200 та _kCFStreamErrorCodeKey = -9806)
- Відновлено VM та спробував скрипт повноважень. Налаштуйте свій IIS для SSL Perfect Forward Secrecy та TLS 1.2. Я навіть зробив другу спробу, коли я відредагував циферблатів із скрипту живлення до мінімального списку необхідного.
Результати: Завжди схожі, рейтинги 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-ACK - ACK, яке встановлює TCP-з'єднання. Четвертий пакет - iOS, що надсилає вашому серверу повідомлення клієнта TLS Привіт, перший крок у налаштуванні TLS-з'єднання через це TCP-з'єднання. Я розірвав це повідомлення, і воно виглядає досить розумно. У п'ятому пакеті сервер просто припиняє з'єднання (надсилаючи RST).
Хтось знає, чому IIS 7.5 буде робити RST?