App Transport Security iOS9 утверждает, что соединения, не соответствующие определенным требованиям, будут невозможны. Ниже приведены требования, процитированные из документа Apple (https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/index.html)
- Сервер должен поддерживать как минимум протокол Transport Layer Security (TLS) версии 1.2.
- Шифры соединений ограничены теми, которые обеспечивают прямую секретность (см. список шифров ниже).
- Сертификаты должны быть подписаны с использованием алгоритма хэширования подписи SHA256 или выше, с использованием ключа RSA длиной 2048 бит или более или ключа эллиптической кривой (ECC) длиной 256 бит или более.
Я проверил, что мой сервер действительно использует сертификат с 2048-битным ключом RSA и подписан с использованием алгоритма хэширования SHA256. Так или иначе, мое приложение, созданное на Xcode7, не смогло подключиться к моему серверу с настройкой ATS по умолчанию. Однако после того, как я установил NSExceptionRequiresForwardSecrecy
в NO
приложении Info.plist
, соединение удалось. Так что, похоже, мой сервер неправильно настроен с шифрами прямой секретности. Ниже приведены мои текущие настройки в nginx.conf:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
Мой сертификат выдан Comodo, а настройки, которые я использовал выше, также взяты из справочного документа Comodo (https://support.comodo.com/index.php?/Default/Knowledgebase/Article/View/789/37/certificate-installation-nginx).
Согласно документу Apple, при настройках ATS по умолчанию допустимыми шифрами являются:
- 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_ciphers моего nginx.)
А если в настройках приложения NSExceptionRequiresForwardSecrecy
установлено значение , то также будут приниматься следующие шифры:NO
- LS_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
При установке этого параметра NO
на мое приложение успешно подключается к моему серверу, хотя причина мне остается неизвестной.
Итак, мой вопрос: как мне настроить nginx для шифрования прямой секретности, чтобы приложение iOS9 (Xcode7) с настройками ATS по умолчанию могло успешно подключиться?
ОБНОВЛЕНО:
Я перенастроил свой сервер, следуя руководству отhttps://weakdh.org/sysadmin.htmlЯ регенерирую новую группу DH с помощью следующей команды:
openssl dhparam -out dhparams.pem 2048
и добавил его в конфигурацию nginx:
ssl_dhparam dhparams.pem;
Но подключение из моего приложения все еще не работает. nsurl --ats-diagnostics
Инструмент все еще указывает, что проблема вызвана прямой секретностью.
Для целей диагностики ниже приведеноssltestскриншот страницы результатов моего сервера предоставленssllabs: