Если ваш бэкэнд использует безопасное соединение и вы используете NSURLSession
CFNetwork SSLHandshake failed (-9801)
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9801)
вам необходимо проверить конфигурацию вашего сервера, особенно, чтобы получить версию ATS и сертификат SSL.
Вместо того, чтобы просто разрешить небезопасное соединение путем установки NSExceptionAllowsInsecureHTTPLoads = YES
, вместо этого вам нужно разрешить пониженную безопасность в случае, если ваш сервер не соответствует минимальному требованию (v1.2) для ATS (или лучше исправить на стороне сервера).
Разрешение пониженной безопасности на один сервер
<key>NSExceptionDomains</key>
<dict>
<key>api.yourDomaine.com</key>
<dict>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
используйте клиент openssl для проверки сертификата и получения конфигурации вашего сервера с помощью клиента openssl:
openssl s_client -connect api.yourDomaine.com:port //(you may need to specify port or to try with https://... or www.)
... найти в конце
SSL-Session:
Protocol : TLSv1
Cipher : AES256-SHA
Session-ID: //
Session-ID-ctx:
Master-Key: //
Key-Arg : None
Start Time: 1449693038
Timeout : 300 (sec)
Verify return code: 0 (ok)
Транспортная безопасность приложений (ATS) требует наличия протокола безопасности транспортного уровня (TLS) версии 1.2.
Требования для подключения с использованием ATS:
Требования к соединению веб-службы для использования App Transport Security (ATS) включают сервер, шифры соединений и сертификаты, а именно:
Сертификаты должны быть подписаны одним из следующих типов ключей:
Ключ Secure Hash Algorithm 2 (SHA-2) с длиной дайджеста не менее 256 (то есть SHA-256 или выше)
Ключ Elliptic-Curve Cryptography (ECC) размером не менее 256 бит
Ключ Rivest-Shamir-Adleman (RSA) длиной не менее 2048 битов. Недействительный сертификат приводит к серьезному отказу и отсутствию соединения.
Следующие шифры подключения поддерживают прямую секретность (FS) и работают с 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
Обновление: оказывается, что openssl предоставляет только минимальную версию протокола Protocol: TLSv1 links