Как настроить прямую секретность в nginx, чтобы приложение iOS9 (Xcode7) с настройками ATS по умолчанию могло подключиться к моему серверу?

Как настроить прямую секретность в nginx, чтобы приложение iOS9 (Xcode7) с настройками ATS по умолчанию могло подключиться к моему серверу?

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:

введите описание изображения здесь

Связанный контент