Назад | Перейти на главную страницу

Как настроить IIS 7.5 SSL \ TLS для работы с iOS 9 ATS

Проблема: Наше мобильное приложение больше не может устанавливать безопасное соединение с нашим веб-сервисом, поскольку 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

Что пробовали:

  1. Добавление исключений в мобильное приложение, чтобы наш домен работал, но я не хочу использовать этот незащищенный метод, я хочу исправить наш SSL.
  2. Используемый IIS Crypto чтобы использовать «лучшие практики», попробовали «pci» и пользовательские настройки. Даже попытался модифицировать криптографический набор только до указанного выше списка и переупорядочить. После каждой попытки сервер перезагружается, и SSL Labs был запущен (после очистки кеша). Мне удалось перейти от рейтинга F к A и даже A-, но это привело только к тому, что iOS 8 и 9 не смогли установить безопасные соединения. (Код NSURLErrorDomain = -1200 и _kCFStreamErrorCodeKey = -9806)
  3. Восстановил виртуальную машину и попробовал сценарий 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, первый шаг в настройке TLS-соединения через это TCP-соединение. Я разобрал это сообщение, и оно выглядит достаточно разумным. В пятом пакете сервер просто разрывает соединение (отправляя RST).

Кто-нибудь знает, почему IIS 7.5 будет делать RST?

Вопрос старый, но будет найден при поиске. Я потратил некоторое время, чтобы найти решение той же проблемы. Поэтому я решаю написать ответ, чтобы поделиться своими результатами с другими.

Краткий ответ: не следует использовать IIS Crypto для указания порядка наборов шифров. Я рекомендую вам нажать кнопку «По умолчанию», чтобы удалить ранее установленный порядок, а затем использовать групповую политику («Конфигурация компьютера» \ «Административные шаблоны» \ «Сеть» \ «Параметры конфигурации SSL») для настройки наборов шифров с помощью локальной политики.

Причина ошибки «несоответствие протокола или шифровального кода» может быть указана ниже.:

  • ваш сервер поддерживает "плохой набор шифров"
  • ваш сервер не поддерживает набор шифров, который ДОЛЖЕН поддерживаться в соответствии со спецификацией TLS.
  • ваш сервер поддерживает HTTP / 2 и имеет некоторые протоколы из черный список выше другие протоколы, которых нет в списке. Обычно достаточно изменить порядок комплектов шифров, чтобы решить проблему.

Точный черный список может отличаться в разных системах. Вы можете найти в Интернете какой-то черный список. Например, Приложение 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 и ниже.