2

Я пытаюсь включить флаг NSRequiresCertificateTransparency из приложения Transport Security для моего приложения ios для обеспечения лучшей безопасности. Я тестировал, и он отлично работает на моем устройстве с iOS 10 и в симуляторе с iOS 10. Но это приводит к сбоям https в симуляторе с iOS 9.3. Если я просто отключу этот конкретный флаг, он снова станет работать.NSRequiresCertificateTransparency = YES делает сбой https в симуляторе iOS 9

Проблема не в сервере, к которому я подключаюсь, потому что я смог воспроизвести его даже с www.apple.com. Вот настройки из Info.plist, которые я использую:

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSExceptionDomains</key> 
    <dict> 
     <key>www.apple.com</key> 
     <dict> 
      <key>NSRequiresCertificateTransparency</key> 
      <true/> 
     </dict> 
    </dict> 
</dict> 

А вот код:

NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com/"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
    if (error) { 
     NSLog(@"fail"); 
    } 
}]; 
[task resume]; 

Ошибка Я вижу в журнале является: NSURLSession/NSURLConnection HTTP загрузка не удалась (kCFStreamErrorDomainSSL , -9802)

Возможно, это происходит только в симуляторе с iOS 9? К сожалению, у меня нет устройства с iOS 9 под рукой, чтобы проверить его.

UPDATE:

Я не вижу ничего полезного в журнале после установки CFNETWORK_DIAGNOSTICS = 3 переменной ENV. Вот часть, где он говорит об ошибке:

Response Error 
    Request: <CFURLRequest 0x7f8d0f668d00 [0x108314a40]> {url = https://www.apple.com/, cs = 0x0} 
     Error: Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x7f8d0f590a80>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=<CFArray 0x7f8d0f50dfb0 [0x108314a40]>{type = immutable, count = 2, values = (
       0 : <cert(0x7f8d0f66ef10) s: www.apple.com i: Symantec Class 3 EV SSL CA - G3> 
       1 : <cert(0x7f8d0f637e60) s: Symantec Class 3 EV SSL CA - G3 i: VeriSign Class 3 Public Primary Certification Authority - G5> 
      )}} 
    } [3:22] 
Jan 31 17:09:13 test2[34612] <Notice>: CFNetwork Diagnostics [3:23] 17:09:13.125 { 
       Did Fail 
       Loader: <CFURLRequest 0x7f8d0f737670 [0x108314a40]> {url = https://www.apple.com/, cs = 0x0} 
        Error: Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x7f8d0f590a80>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=<CFArray 0x7f8d0f50dfb0 [0x108314a40]>{type = immutable, count = 2, values = (
          0 : <cert(0x7f8d0f66ef10) s: www.apple.com i: Symantec Class 3 EV SSL CA - G3> 
          1 : <cert(0x7f8d0f637e60) s: Symantec Class 3 EV SSL CA - G3 i: VeriSign Class 3 Public Primary Certification Authority - G5> 
         )}} 
    init to origin load: 0.00299901s 
      total time: 0.156503s 
      total bytes: 0 
    } [3:23] 

UPDATE 2:

Вот вид объекта ошибки в отладчике.

enter image description here

+0

Я вижу то же самое. –

ответ

2

NSRequiresCertificateTransparency ключ был введен в 10 прошивкой, так что я не знаю, почему это будет провал. Это определенно не терпит неудачу из-за прозрачности сертификата, так как iOS9 не проверял его, но iOS 10 (так как iOS 10 понимает ключ NSRequiresCertificateTransparency).

Я действительно подтвердил, что это не удается на физических устройствах, работающих под управлением iOS 9. Но это не сбой для всех серверов. Например, www.google.com работает на iOS 9 в симуляторе и физических устройствах.

Я бы рекомендовал включить ведомую регистрацию в сети ATS, чтобы определить, вызвана ли ошибка SSL из-за конфигурации ATS или если что-то еще не работает. Подробнее о том, как включить подробное ведение журнала here. Я подозреваю, что есть еще одна ошибка, вызывающая ошибку SSL.

Кроме того, удалите все свои записи, связанные с безопасностью транспорта приложений из вашего info.plist, и посмотрите, работает ли он в iOS 9. По крайней мере, устраните настройку в качестве основной причины.

Единственное, что я могу думать, это то, что iOS9 смущен тем фактом, что у вас есть домен исключений без действительных (насколько это касается iOS 9) ключей под ним, хотя я сомневаюсь, что это все. Возможно, добавьте ключ NSAllowsArbitraryLoads со значением false в соответствии с вашей записью домена исключения apple.com.

Я бы порекомендовал выключить флаг, пока вам не нужно будет поддерживать устройства iOS 9.

+0

О, я пропустил, что он доступен только с iOS 10. Спасибо за это.Тогда это действительно странно. Как я уже сказал, если я просто изменил его значение с YES на NO, соединение будет успешным в симуляторе iOS 9. Я также просто попытался изменить имя параметра (оставив его со значением YES), и соединение также будет успешным в этом случае. Так кажется, что он каким-то образом понимает флаг NSRequiresCertificateTransparency. Добавление NSAllowsArbitraryLoads также не помогло. Сервер www.apple.com. – jesse

+0

Я уже пытался включить диагностику. Я ничего там не видел. Я обновил свой вопрос с некоторыми результатами, которые я вижу там. – jesse

+1

Я проверил, что он не работает на физическом устройстве. Я считаю, что это ошибка. Не так уж много можно сделать с этим, так как кажется, что у Apple есть некоторая обработка ключа 'NSRequiresCertificateTransparency' в iOS9, но, похоже, она не выполняется правильно. Я бы не стал добавлять этот ключ к вашему Info.plist, пока вы больше не будете поддерживать iOS9 в своих приложениях. Я бы также сообщил об этом Apple. – wottle

 Смежные вопросы

  • Нет связанных вопросов^_^