Alamofire - IOS多证书SSL Pinning

3

我在我的IOS应用程序中使用Alamofire,并实现了SSL Pinning。我已经将证书以.der格式保存在本地。问题是,当证书过期时,我必须发布新证书的应用程序版本。

使用的代码片段:

struct Certificates {
    fileprivate static let sslCertificate: SecCertificate? = Certificates.certificate(filename: (Bundle.main.infoDictionary?["SSL_CERTIFICATE"] as? String))

private static func certificate(filename: String?) -> SecCertificate? {
    guard let filePath = Bundle.main.path(forResource: filename, ofType: "der"), let data = try? Data(contentsOf: URL(fileURLWithPath: filePath)), let certificate = SecCertificateCreateWithData(nil, data as CFData) else{
        return nil
    }
    return certificate
}


final class APIClient {
    
    // MARK: - Host To Evaluate
    private static var hostToEvaluate: String {
        guard let urlString = Bundle.main.infoDictionary?["API_BASE_URL_ENDPOINT"] as? String, let hostURL = URL(string: urlString), let host = hostURL.host else{
            return ""
        }
        return host
    }
    
    // MARK: - Evaluators
    private static var evaluators: Dictionary<String,ServerTrustEvaluating> {
        guard let sslCertificate = Certificates.sslCertificate else{
            return [hostToEvaluate : DisabledTrustEvaluator()]
        }
        return [hostToEvaluate : PinnedCertificatesTrustEvaluator(certificates: [sslCertificate])]
    }
    
    // MARK: - Session
    private static let session = Session(
        serverTrustManager: ServerTrustManager(evaluators: evaluators)
    )
}

我能保留两个证书并进行检查以评估现有证书,如果失败则使用新证书吗?

我已经查看了一些文档和论坛,但没有找到相关的内容。

谢谢,

Abin

1个回答

4
是的。默认情况下,如果您在初始化时没有分别传递keyscertificates参数,则PublicKeysTrustEvaluatorPinnedCertificatesTrustEvaluator将选择应用程序包中的所有证书进行验证。如果有一个匹配的捆绑证书,那么评估将通过。
您的代码将类似于这样:
// MARK: - Evaluators

private static var evaluators: Dictionary<String, ServerTrustEvaluating> = [
    hostToEvaluate: PinnedCertificatesTrustEvaluator()
]

// MARK: - Session

private static let session = Session(
    serverTrustManager: ServerTrustManager(evaluators: evaluators)
)

请确保两个证书都在应用程序包中。(将它们添加到你的目标中)


你能分享一些针对这个案例的代码片段吗?非常感激您的帮助。 - Abin Koshy Cheriyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接