Проблема: Наше мобильное приложение больше не может устанавливать безопасное соединение с нашим веб-сервисом, поскольку 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
Алгоритм подписи SHA512withRSA
Это требования к безопасности транспорта приложений:
Сервер должен поддерживать протокол TLS версии не ниже 1.2. Шифры подключения ограничены теми, которые обеспечивают прямую секретность (см. Список шифров ниже). Сертификаты должны быть подписаны с использованием алгоритма хэширования подписи 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
Что пробовали:
Полученные результаты: Всегда одинаковые, оценки 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 Client, первый шаг в настройке TLS-соединения через это TCP-соединение. Я разобрал это сообщение, и оно выглядит достаточно разумным. В пятом пакете сервер просто разрывает соединение (отправляя RST).
Кто-нибудь знает, почему IIS 7.5 будет делать RST?
Вопрос старый, но будет найден при поиске. Я потратил некоторое время, чтобы найти решение той же проблемы. Поэтому я решаю написать ответ, чтобы поделиться своими результатами с другими.
Краткий ответ: не следует использовать IIS Crypto для указания порядка наборов шифров. Я рекомендую вам нажать кнопку «По умолчанию», чтобы удалить ранее установленный порядок, а затем использовать групповую политику («Конфигурация компьютера» \ «Административные шаблоны» \ «Сеть» \ «Параметры конфигурации SSL») для настройки наборов шифров с помощью локальной политики.
Причина ошибки «несоответствие протокола или шифровального кода» может быть указана ниже.:
Точный черный список может отличаться в разных системах. Вы можете найти в Интернете какой-то черный список. Например, Приложение RFC 7540 (протокол передачи гипертекста версии 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_SHA256
еще не реализован Microsoft. Кроме того, вы можете добавить по крайней мере 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 с ключом RSA 2048 и бесплатным сертификатом SSL от Let's Encrypt.
Я отключил 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, многопротокольный унифицированный 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 (атака на понижение версии) не может быть предотвращена в IIS до сих пор, что делает невозможным получение рейтинга A + www.ssllabs.com. Я считаю это недостатком, но TLS 1.2 сейчас очень широко поддерживается. Кстати, вы можете использовать DisabledByDefault: 1
, но Enabled: 1
для TLS 1.0 и TLS 1.1. Было бы полезно запустить на компьютере SQL Server 2008/2012. Веб-сервер не будет использовать TLS 1.0 и TLS 1.1, но SQL Server использует.
Самым важным шагом, на который я потратил много времени и который является вашей основной проблемой, была настройка Cipher Suite. Я сделал это используя 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, теперь кажутся мне не столь важными, и я думаю, что приведенная выше конфигурация является хорошим компромиссом между поддержкой устаревших клиентов и использованием безопасных протоколов.
Я боролся с этим несколько дней. В частности, я подключался из приложения 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.
Обратите внимание, что многие комплекты шифров были получены из спецификации ssllabs предпочтительных комплектов для различных устройств iOS / OSX. Приведенное выше значение должно соответствовать всем, кроме IE 6 в XP. согласно ssllabs, с рейтингом А.
Если ваш образ IIS Crypto является недавним, сохраните настройки без изменений, но включите SHA, Diffie-Hellman и PKCS. Это даст вам рейтинг A, но позволит подключаться iOS 8 и ниже.