如何在 Alamofire swift 5 中进行 SSL 公钥固定

Bhi*_*kar 2 ios swift alamofire public-key-pinning swift5

我正在尝试将 SSL 公钥固定集成到 Alamofire swift 5 中,但我发现ServerTrustPolicyManager它已被弃用。请帮助我融入。谢谢。

gch*_*ita 6

要集成 SSL 公钥固定,您首先必须通过拖放将 SSL 证书添加到项目的目标中。

要测试您的证书格式是否正确,您可以尝试从main 中publicKeys的参数中获取值,如下所示:AlamofireExtensionBundle

print("Bundle public keys: \(Bundle.main.af.publicKeys)")
Run Code Online (Sandbox Code Playgroud)

如果该数组至少有一个元素,那么您就准备好了。如果没有,请尝试将 SSL 证书导入到 Mac 的钥匙串中,然后将其导出为.cer,然后将其添加到项目的目标中。(这应该有效)

要检查 SSL 证书的公钥是否是您在项目中导入的公钥,您可以在创建以下项目时将 AlamofireServerTrustManager与实例一起使用:PublicKeysTrustEvaluatorSession

let evaluators: [String: ServerTrustEvaluating] = [
    "your.domain.com": PublicKeysTrustEvaluator()
]
let serverTrustManager = ServerTrustManager(evaluators: evaluators)
let session = Session(serverTrustManager: serverTrustManager)
Run Code Online (Sandbox Code Playgroud)

确保在evaluators字典中,键("your.domain.com"在上面的代码中)是您的服务器域,如果您不希望 Alamofire 执行默认验证和/或验证主机,您可以传递给的初始化程序false中的这些参数:PublicKeysTrustEvaluator

let evaluators: [String: ServerTrustEvaluating] = [
    "your.domain.com": PublicKeysTrustEvaluator(
        performDefaultValidation: false,
        validateHost: false
    )
]
let serverTrustManager = ServerTrustManager(evaluators: evaluators)
let session = Session(serverTrustManager: serverTrustManager)
Run Code Online (Sandbox Code Playgroud)

然后您必须使用此Session实例在您的域中发出任何请求,如下所示:

let url = "https://your.domain.com/path/to/api"
session.request(url, method: .post, parameters: parameters).responseDecodable { response in
    
}
Run Code Online (Sandbox Code Playgroud)

正如@JonShier 在评论中指出的那样:你需要Session在声明的范围之外保持生命。通常这是通过单个或其他外部参考来完成的。

  • 您需要使“Session”在声明范围之外保持活动状态。通常这是通过单个或其他外部参考来完成的。 (2认同)