Alamofire serverTrustEvaluationFailed 错误分析
serverTrustEvaluationFailed 错误
1 | Printing description of error: |
原因是配置了白名单
1 | var evaluators: [String: ServerTrustEvaluating] = [:] |
可把 allHostsMustBeEvaluated 改为 false,只对指定的host开启。
原理 TLS Server Trust
在与服务器和 Web 服务通信时使用安全的 HTTPS 连接是保护敏感数据的重要步骤。默认情况下,Alamofire 会收到与 URLSession 相同的自动 TLS 证书和证书链验证。虽然这保证了证书链的有效性,但它并不能防止中间人 (MITM) 攻击或其他潜在漏洞。为了减轻中间人攻击,处理敏感客户数据或财务信息的应用程序应使用 Alamofire ServerTrustEvaluating 协议提供的证书或公钥固定。
使用 ServerTrustManager 和 ServerTrustEvaluating 评估服务器信任
该协议 ServerTrustEvaluating 提供了一种执行任何类型的服务器信任评估的方法。它只有一个要求:
1 | func evaluate(_ trust: SecTrust, forHost host: String) throws |
此方法提供从基础 URLSession 接收 SecTrust 的值和主机 String ,并提供执行各种评估的机会。
包括许多不同类型的信任评估器,提供对评估过程的可组合控制:
DefaultTrustEvaluator:使用默认服务器信任评估,同时允许您控制是否验证质询提供的主机。RevocationTrustEvaluator:检查收到的证书的状态,以确保其未被吊销。由于它需要网络请求开销,因此通常不会对每个请求执行此操作。PinnedCertificatesTrustEvaluator:使用提供的证书来验证服务器信任。如果其中一个固定的证书与其中一个服务器证书匹配,则认为服务器信任有效。此赋值器还可以接受自签名证书。PublicKeysTrustEvaluator:使用提供的公钥来验证服务器信任。如果其中一个固定的公钥与其中一个服务器证书公钥匹配,则认为服务器信任有效。CompositeTrustEvaluator:计算值数组,仅当所有ServerTrustEvaluating值都成功时才成功。例如,此类型可用于组合RevocationTrustEvaluator和PinnedCertificatesTrustEvaluator。DisabledTrustEvaluator:此评估程序应仅在调试方案中使用,因为它会禁用所有评估,而这些评估将始终将任何服务器信任视为有效。此评估器绝不应在生产环境中使用!
ServerTrustManager
负责 ServerTrustManager 存储值到特定主机的 ServerTrustEvaluating 内部映射。这允许 Alamofire 使用不同的评估器评估每个主机。
1 | let evaluators: [String: ServerTrustEvaluating] = [ |
这将 ServerTrustManager 具有以下行为:
cert.example.com将始终使用启用默认和主机验证的证书固定,因此需要满足以下条件才能使 TLS 握手成功:- 证书链必须有效。
- 证书链必须包含其中一个固定的证书。
- 质询主机必须与证书链的叶证书中的主机匹配。
keys.example.com将始终使用启用默认和主机验证的公钥固定,因此需要满足以下条件才能使 TLS 握手成功:- 证书链必须有效。
- 证书链必须包含其中一个固定的公钥。
- 质询主机必须与证书链的叶证书中的主机匹配。
- 对其他主机的请求将产生错误,因为
ServerTrustManager默认情况下需要评估所有主机。
测试用例
Alamofire 项目中测试用例:Tests/TLSEvaluationTests.swift
1 | private enum TestCertificates { |


官网:
官网:



