替换 iOS 15 中已弃用的“SecTrustGetCertificateAtIndex”?

Tru*_*an1 7 ssl ios swift ios15

我在 SDK 中收到弃用警告iOS 15,但建议的替换不是一对一的替换。这是我评估 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)
}
Run Code Online (Sandbox Code Playgroud)

我在 Xcode 13 beta 中收到的警告是:

'SecTrustGetCertificateAtIndex' was deprecated in iOS 15.0: renamed to 'SecTrustCopyCertificateChain(_:)'. 
Use 'SecTrustCopyCertificateChain(_:)' instead.
Run Code Online (Sandbox Code Playgroud)

但是,SecTrustGetCertificateAtIndex( docs ) 返回SecCertificate,而SecTrustCopyCertificateChain( docs ) 返回CFArray. 如何在我提供的用法中正确更新它?

Tar*_*agi 10

iOS 14.5 => iOS 15 SDK Diff表明唯一的添加内容是这些(从 Xcode 13 Beta 1 开始

SecBase.h
Added errSecInvalidCRLAuthority
Added errSecInvalidTupleCredentials
Added errSecCertificateDuplicateExtension

SecTrust.h
Added SecTrustCopyCertificateChain()
Run Code Online (Sandbox Code Playgroud)

他们没有向 中添加任何新的同级类型SecCertificate。正如您已经注意到的,它返回一个CFArray.

func SecTrustCopyCertificateChain(_ trust: SecTrust) -> CFArray?
Run Code Online (Sandbox Code Playgroud)

所以对于你的代码的这一部分 -

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

似乎值得一试,SecTrustCopyCertificateChain可能会返回CFArray实例SecCertificate?不幸的是我现在无法调试这个。

也许尝试这样的事情 -

if let certificates = SecTrustCopyCertificateChain(trust) as? [SecCertificate] {
    let serverCertificatesData = Set(
        certificates.map { SecCertificateCopyData($0) as Data }
    )
}
Run Code Online (Sandbox Code Playgroud)

  • 你是对的,“CFArray”确实是“[SecCertificate]”。谢谢你!! (2认同)