Проблема: наше мобильное приложение больше не может устанавливать безопасное соединение с нашим веб-сервисом, поскольку 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
Алгоритм подписи SHA512 с RSA
Это требования безопасности транспорта приложения:
Сервер должен поддерживать по крайней мере версию 1.2 протокола TLS. Шифры подключения ограничиваются теми, которые обеспечивают прямую секретность (см. Список шифров ниже.) Сертификаты должны быть подписаны с использованием алгоритма хеширования сигнатуры SHA256 или более высокого, с ключом RSA 2048 бит или более, или эллиптической кривой 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 Labs (после очистки кеша). Мне удалось перейти с F-рейтинга на A и даже A-, но это только привело к тому, что iOS 8 и 9 не смогли установить безопасные соединения. (NSURLErrorDomain Code = -1200 и _kCFStreamErrorCodeKey = -9806)
- Восстановил виртуальную машину и попробовал сценарий powershell. Настройте IIS для SSL Perfect Forward Secrecy и TLS 1.2. Я даже предпринял вторую попытку, когда отредактировал шифры из сценария power для получения минимального списка того, что требуется.
Результаты: всегда одинаковые, оценки 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, отправляющая вашему серверу сообщение Hello TLS Client, первый шаг в настройке соединения TLS через это соединение TCP. Я разобрал это сообщение, и оно выглядит достаточно разумным. В пятом пакете сервер просто сбрасывает соединение (отправляя RST).
Кто-нибудь знает, почему IIS 7.5 будет делать RST?