
Проблема:Наше мобильное приложение больше не может устанавливать безопасное соединение с нашим веб-сервисом, поскольку 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
Алгоритм подписи SHA512withRSA
Требования к безопасности передачи данных приложения:
Сервер должен поддерживать протокол Transport Layer Security (TLS) версии не ниже 1.2. Шифры соединения ограничены теми, которые обеспечивают прямую секретность (см. список шифров ниже). Сертификаты должны быть подписаны с использованием алгоритма хэширования подписи SHA256 или лучше, либо с ключом RSA длиной 2048 бит или больше, либо с ключом Elliptic-Curve (ECC) длиной 256 бит или больше. Недействительные сертификаты приводят к жесткому сбою и отсутствию соединения. Вот принятые шифры:
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 Криптоиспользовать 'best practice', пробовал 'pci' и пользовательские настройки. Даже пробовал изменять криптографический набор только на список выше и переупорядочивать. После каждой попытки сервер перезагружается, и иSSL-лабораториибыл запущен (после очистки кэша). Мне удалось перейти от оценки F к A и даже к A-, но это привело только к тому, что iOS 8 и 9 не смогли установить защищенные соединения. (NSURLErrorDomain Code=-1200 и _kCFStreamErrorCodeKey=-9806)
- Восстановил ВМ и попробовал скрипт PowerShellНастройте 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 - SYN-ACK - ACK, устанавливающее TCP-соединение. Четвертый пакет — это отправка iOS на ваш сервер сообщения TLS Client Hello, первый шаг в установке TLS-соединения через TCP-соединение. Я разобрал это сообщение, и оно выглядит достаточно разумным. В пятом пакете сервер просто разрывает соединение (отправляя RST).
Кто-нибудь знает, зачем IIS 7.5 выполняет RST?
решение1
Вопрос старый, но он будет найден при поиске. Я потратил некоторое время, чтобы найти решение той же проблемы. Поэтому я решил написать ответ, чтобы поделиться своими результатами с другими.
Короткий ответ: вам не следует использовать IIS Crypto для указания порядка наборов шифров. Я рекомендую вам нажать на кнопки «По умолчанию», чтобы удалить ранее установленный порядок, а затем использовать групповую политику («Конфигурация компьютера» \ «Административные шаблоны» \ «Сеть» \ «Параметры конфигурации SSL») для настройки наборов шифров через локальную политику.
Причиной ошибки «несоответствие протокола или набора шифров» может быть одна из следующих::
- ваш сервер поддерживает некоторые "плохие наборы шифров"
- Ваш сервер не поддерживает некоторые наборы шифров, которые ДОЛЖНЫ поддерживаться в соответствии со спецификацией TLS.
- Ваш сервер поддерживает HTTP/2 и имеет некоторые протоколы изчерный список вышедругие протоколы, которых нет в списке. Обычно для устранения проблемы достаточно изменить порядок наборов шифров.
Точный черный список может быть разным в разных системах. Вы можете найти в Интернете некоторые черные списки. Например,Приложениеиз RFC 7540 (Hypertext Transfer Protocol Version 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, Multi-Protocol Unified Hello, PCT 1.0, SSL 2.0, SSL 3.0 и TLS 1.0/1.1вручную в реестре(видетьКБ245030). Я отключил протоколы 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 использует.
Самым важным шагом, который отнял у меня много времени и который является вашей главной проблемой, была настройка наборов шифров.Я сделал это с помощью 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.
В любом случае, после настройки вышеуказанных параметров в групповой политике иперезагрузка компьютера( 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, кажутся мне теперь не столь важными, и я думаю, что приведенная выше конфигурация является хорошим компромиссом между поддержкой устаревших клиентов и использованием безопасных протоколов.
решение2
Если ваш образ IIS Crypto недавний, оставьте настройки такими, какие они есть, но включите SHA, Diffie-Hellman и PKCS. Это даст вам рейтинг A, но позволит подключаться iOS 8 и ниже.
решение3
Я боролся с этим несколько дней. В частности, я подключался из приложения iOS с помощью Xamarin Forms PCL для подключения к rest-сервису ASP.NET Web Api 2 с аутентификацией OAuth2 Bearer Token.
В конце концов, мне помогло использование IIS Crypto's Best practices. Затем отредактируйте ключ реестра, который он установил для порядка набора шифров:
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_ECDH E_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_SHA_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_CB C_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_SH A256_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_WI TH_AES_256_GCM_SHA384,TLS_DHE_RSA_С_AES_128_GCM_SHA256,TLS_DHE_DSS_С_AES_256_CBC_SHA256,TLS_DHE_DSS_С_AES_256_CBC_SHA,TLS_DHE_DSS_С_AES_128_CBC_SHA256,TLS_DHE_DSS_С_AES_128_CBC_SHA,TLS_DHE_DSS_С_3DES_EDE_CBC_SHA,TLS_RSA_С_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 (с установленными сертификатами симулятора), но в противном случае терпели неудачу. Добавление набора, который он использовал при согласовании, помогло. Похоже(?), что прокси повторно согласовывал с моей службой REST что-то, что поддерживалось моим сервером, но не клиентом iOS.
Обратите внимание, что многие наборы шифров были получены из спецификации ssllabs по предпочтительным наборам для различных устройств iOS/OSX. Значение выше должно согласовываться со всеми браузерами, кроме IE 6 на XP.по данным ssllabs, имеет рейтинг A.