Ошибка SSL возникает при обратном вызове задачи данных сеанса URL-адреса только на определенных устройствах

Для некоторых пользователей наше приложение выдает NSError при попытке вызвать API защищенного сервера с помощью задачи данных URLSession. Ниже подробная информация об ошибке:

error-domain: NSURLErrorDomain
nserror-code: -1202

NSErrorPeerCertificateChainKey: ( "<cert(0x10a086200) s: wifisignon.shaw.ca i: DigiCert SHA2 Secure Server CA>", "<cert(0x10a04f600) s: DigiCert SHA2 Secure Server CA i: DigiCert Global Root CA>" )

NSLocalizedDescription: The certificate for this server is invalid. You might be connecting to a server that is pretending to be “abc.xyz.net” which could put your confidential information at risk.

NSUnderlyingError: Error Domain=kCFErrorDomainCFNetwork Code=-1202 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x282498240>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9843, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9843, kCFStreamPropertySSLPeerCertificates=( "<cert(0x10a086200) s: wifisignon.shaw.ca i: DigiCert SHA2 Secure Server CA>", "<cert(0x10a04f600) s: DigiCert SHA2 Secure Server CA i: DigiCert Global Root CA>" )}

Мы используем URLSession.shared.dataTask для этого вызова GET API. Проблема в том, что эта ошибка возникает только на нескольких пользовательских устройствах (300 пользователей из 5000). Поскольку мы не можем воспроизвести проблему на наших устройствах, ее трудно отладить и найти правильное решение. Если это проблема с сертификатом сервера, то почему она не возникает на всех устройствах с одинаковой моделью и версией ОС?


person med    schedule 22.01.2020    source источник
comment
Какая минимальная версия iOS требуется для вашего приложения (может быть, это связано со старыми версиями iOS)? В качестве альтернативы это может быть атака на сетевом уровне.   -  person Robert    schedule 22.01.2020
comment
Проверьте свой plist: stackoverflow.com/questions/32755674/   -  person Rob    schedule 22.01.2020
comment
@Robert Минимальная версия iOS нашего приложения — 10.0. Мы рассматриваем ручную аутентификацию доверия к серверу с использованием делегата.   -  person med    schedule 23.01.2020
comment
@Rob В этой ссылке есть полезная информация, но она предлагает, как загрузить URL-адрес http без TLS. Наша проблема в том, что мы пытаемся связаться с защищенным сервером с https, для которого необходимо выполнить требуемую проверку безопасности. Проверьте это: developer.apple.com/documentation/foundation/url_loading_system/ Вопрос в том, почему лишь немногие пользователи сталкиваются с ошибкой проверки сертификата.   -  person med    schedule 23.01.2020
comment
@ Роберт, что вы предлагаете нам делать, если это атака на сетевом уровне для этих 300 пользователей?   -  person med    schedule 23.01.2020
comment
Единственный правильный способ справиться с такими ситуациями — отобразить сообщение об ошибке, описывающее ситуацию (особенно о том, что есть какой-то дефект на сетевом уровне), и поэтому приложение не сможет использовать Интернет. Попросите пользователя переключиться на другую сеть. НЕ ПОЗВОЛЯЙТЕ ПОЛЬЗОВАТЕЛЮ ПРОДОЛЖАТЬ!   -  person Robert    schedule 23.01.2020


Ответы (1)


Вы можете использовать объект URLSession с конфигурацией, делегировать, а не использовать объект URLSession.shared. Затем выполните ручное доверие. вы можете найти руководство здесь https://developer.apple.com/documentation/foundation/url_loading_system/handling_an_authentication_challenge/performing_manual_server_trust_authentication

person shadow24    schedule 23.01.2020
comment
Теоретически вы правы, но практически, что вы должны реализовать в этом делегате, чтобы вручную доверять чему-то, если у вас нет доступа к затронутой среде и, кроме того, не зная, знает ли пользователь о посреднике ( и принимает его) или злонамеренный хакер. - person Robert; 23.01.2020