NSRequiresCertificateTransparency = YES приводит к сбою https в симуляторе iOS 9

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

Проблема не в сервере, к которому я подключаюсь, потому что я смог воспроизвести его даже с 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];

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

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

ОБНОВИТЬ:

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

    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]

ОБНОВЛЕНИЕ 2:

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

1 ответ

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

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

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

Кроме того, удалите все записи, относящиеся к App Transport Security, из своего info.plist и посмотрите, работает ли он в iOS 9. По крайней мере, удалите этот параметр как основную причину.

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

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

Другие вопросы по тегам