Заменить устаревший SecTrustGetCertificateAtIndex в iOS 15?
Я получаю предупреждение об устаревании через
iOS 15
SDK, но предлагаемая замена не является однозначной заменой. Вот что у меня есть для оценки цепочки доверия 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 =&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 }
)
}