Заменить устаревший SecTrustGetCertificateAtIndex в iOS 15?

Я получаю предупреждение об устаревании через iOS 15SDK, но предлагаемая замена не является однозначной заменой. Вот что у меня есть для оценки цепочки доверия SSL:

      func valid(_ trust: SecTrust, forHost host: String) -> Bool {
    guard valid(trust, for: [SecPolicyCreateSSL(true, nil)]),
        valid(trust, for: [SecPolicyCreateSSL(true, host as CFString)]) else {
            return false
    }

    let serverCertificatesData = Set(
        (0..<SecTrustGetCertificateCount(trust))
            .compactMap { SecTrustGetCertificateAtIndex(trust, $0) }
            .map { SecCertificateCopyData($0) as Data }
    )

    let pinnedCertificatesData = Set(
        certificates.map { SecCertificateCopyData($0) as Data }
    )

    return !serverCertificatesData.isDisjoint(with: pinnedCertificatesData)
}

Предупреждение, которое я получаю в бета-версии Xcode 13:

      'SecTrustGetCertificateAtIndex' was deprecated in iOS 15.0: renamed to 'SecTrustCopyCertificateChain(_:)'. 
Use 'SecTrustCopyCertificateChain(_:)' instead.

Тем не мение, SecTrustGetCertificateAtIndex(документы ) возвращает SecCertificate где SecTrustCopyCertificateChain(docs) возвращает CFArray. Как это можно правильно обновить при использовании, которое я предоставил?

1 ответ

iOS 14.5 =&amp;gt; iOS 15 SDK Diff указывает, что единственными дополнениями являются следующие (начиная с Xcode 13 Beta 1)

      SecBase.h
Added errSecInvalidCRLAuthority
Added errSecInvalidTupleCredentials
Added errSecCertificateDuplicateExtension

SecTrust.h
Added SecTrustCopyCertificateChain()

Они не добавили в. Как вы уже заметили, он возвращает.

      func SecTrustCopyCertificateChain(_ trust: SecTrust) -> CFArray?

Итак, для этой части вашего кода -

      let serverCertificatesData = Set(
    (0..<SecTrustGetCertificateCount(trust))
        .compactMap { SecTrustGetCertificateAtIndex(trust, $0) }
        .map { SecCertificateCopyData($0) as Data }
)

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

Может, попробуем что-нибудь вроде этого -

      if let certificates = SecTrustCopyCertificateChain(trust) as? [SecCertificate] {
    let serverCertificatesData = Set(
        certificates.map { SecCertificateCopyData($0) as Data }
    )
}
Другие вопросы по тегам