Swift 5中Alamofire实现SSL公钥固定方案求助(ServerTrustPolicyManager已弃用)
Swift 5 + Alamofire 实现SSL公钥固定方案
Alamofire 5+ 已弃用ServerTrustPolicyManager,改用ServerTrustManager配合PinPublicKeysEvaluator实现公钥固定,以下是具体集成步骤:
1. 准备公钥数据
先将服务器的公钥转为Data格式,通常从PEM格式字符串处理而来:
// 处理PEM格式公钥为Data func publicKeyData(from pemString: String) -> Data? { let cleanedPEM = pemString.replacingOccurrences(of: "-----BEGIN PUBLIC KEY-----", with: "") .replacingOccurrences(of: "-----END PUBLIC KEY-----", with: "") .replacingOccurrences(of: "\n", with: "") return Data(base64Encoded: cleanedPEM) } // 替换为你的服务器公钥PEM字符串 guard let targetPublicKeyData = publicKeyData(from: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAO...\n-----END PUBLIC KEY-----") else { fatalError("无效的公钥格式") }
2. 创建公钥固定评估器
使用PinPublicKeysEvaluator(Alamofire内置的公钥固定实现):
let publicKeyEvaluator = PinPublicKeysEvaluator( publicKeys: [targetPublicKeyData], validateCertificateChain: true, validateHost: true )
参数说明:
publicKeys: 支持传入多个公钥Data,用于服务器公钥更新时的平滑过渡validateCertificateChain: 开启证书链完整性验证,建议保持truevalidateHost: 开启主机名验证,防止域名劫持,建议保持true
3. 配置Alamofire Session
将评估器绑定到指定域名,创建自定义Session:
let serverTrustManager = ServerTrustManager(evaluators: [ "your-api-domain.com": publicKeyEvaluator ]) // 自定义Session,后续所有请求通过该Session发起 let secureSession = Session(serverTrustManager: serverTrustManager)
4. 发起验证请求
使用配置好的secureSession发起网络请求,自动触发公钥固定验证:
secureSession.request("https://your-api-domain.com/api/data").responseJSON { response in // 处理响应 }
可选:全局Session配置
如果希望所有默认AF.request()都应用验证规则,可替换Alamofire的全局Session:
AF.session = secureSession
注意事项
- 公钥更新:服务器更换公钥前,需提前在App中添加新公钥,避免请求失败
- 开发调试:仅在开发环境可临时使用
DisabledEvaluator跳过验证,上线必须移除 - 安全建议:不要关闭
validateCertificateChain和validateHost,否则会降低安全等级
内容的提问来源于stack exchange,提问作者Bhimashankar
相关产品推荐
相关产品推荐

