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

问题描述

我在 iOS 15 SDK 中收到弃用警告,但建议的替换不是一对一的替换。这是我用于评估 SSL 信任链的内容

func valid(_ trust: SecTrust,forHost host: String) -> Bool {
    guard valid(trust,for: [SecPolicyCreateSSL(true,nil)]),valid(trust,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 beta 中得到的警告是:

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

但是,SecTrustGetCertificateAtIndex (docs) 返回 SecCertificate,其中 SecTrustcopyCertificateChain (docs) 返回 CFArray。如何在我提供的用法中正确更新?

解决方法

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

SecBase.h
Added errSecInvalidCRLAuthority
Added errSecInvalidTupleCredentials
Added errSecCertificateDuplicateExtension

SecTrust.h
Added SecTrustCopyCertificateChain()

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

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 }
    )
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...