В iOS9 App Transport Security говорится, что соединения, не соответствующие определенным требованиям, не будут выполнены. Ниже приведены требования, приведенные в документе Apple (https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/index.html)
Я проверил, что мой сервер действительно использует сертификат с 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 по умолчанию, принятые шифры включают:
(Кажется, что в моей настройке ssl_ciphers моего nginx есть эти шифры.)
И если NSExceptionRequiresForwardSecrecy
установлен на NO
в настройках приложения также будут приняты следующие шифры:
С этим набором 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: