从iOS 10.3之前的SecCertificate获取SecKey

时间:2019-07-01 09:16:04

标签: ios swift pinning public-key-pinning

我需要从证书中获取公钥

我已经找到了在iOS 12+和iOS 10.3+上实现此目标的方法,但是如何在iOS 10.0+上实现它?

    func publicKey(for certificate: SecCertificate) -> SecKey? {
        if #available(iOS 12.0, *) {
            return SecCertificateCopyKey(certificate)
        } else if #available(iOS 10.3, *) {
            return SecCertificateCopyPublicKey(certificate)
        } else {
            // ???
            return nil
        }
    }

1 个答案:

答案 0 :(得分:0)

我找到了解决方法

func publicKey(for certificate: SecCertificate) -> SecKey? {
    if #available(iOS 12.0, *) {
        return SecCertificateCopyKey(certificate)
    } else if #available(iOS 10.3, *) {
        return SecCertificateCopyPublicKey(certificate)
    } else {
        var possibleTrust: SecTrust?
        SecTrustCreateWithCertificates(certificate, SecPolicyCreateBasicX509(), &possibleTrust)
        guard let trust = possibleTrust else { return nil }
        var result: SecTrustResultType = .unspecified
        SecTrustEvaluate(trust, &result)
        return SecTrustCopyPublicKey(trust)
    }
}

在这里找到:https://github.com/daltoniam/Starscream/blob/a2ed45c0b2f996cb8c335c4f270ecc68c3bd4c0f/Sources/Starscream/SSLSecurity.swift#L214