这是我的alamofire管理器,我如何添加公钥固定在它?请帮助我,我不知道如何在我的代码中做到这一点,如果可能的话,我需要一步一步地解释如何使用AFManager完成所有请求
class AFManager : NSObject{
///without headers (post)
//used this to registration
class func requestPOSTURL(_ strURL : String, params : [String :
AnyObject]?, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void){
URLCache.shared.removeAllCachedResponses()
Alamofire.request(strURL, method: .post, parameters: params, encoding: URLEncoding.httpBody).responseJSON { (responseObject) -> Void in
//print(responseObject)
if responseObject.result.isSuccess {
let resJson = JSON(responseObject.result.value!)
success(resJson)
}
if responseObject.result.isFailure {
let error : Error = responseObject.result.error!
failure(error)
}
}
}
///// response string (post)
//used this in login // used in change password
class func strRequestPOSTURL(_ strURL : String, params : [String : String]?, headers : [String : String]?, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void){
URLCache.shared.removeAllCachedResponses()
Alamofire.request(strURL, method: .post, parameters: params, encoding: URLEncoding.httpBody, headers: headers).responseJSON { (response) in
//print(response)
if response.result.isSuccess {
let resJson = JSON(response.result.value!)
success(resJson)
}
if response.result.isFailure {
let error : Error = response.result.error!
failure(error)
}
}
}
}
我看到了这个例子,但不知道如何做到这一点,我应该把代码看到下面的链接:https://infinum.co/the-capsized-eight/ssl-pinning-revisited
6条答案
按热度按时间okxuctiv1#
安全
在与服务器和Web服务通信时使用安全的HTTPS连接是保护敏感数据的重要一步。默认情况下,Alamofire将使用Apple的安全框架提供的内置验证来评估服务器提供的证书链。虽然这保证了证书链的有效性,但它不能防止中间人(MITM)攻击或其他潜在漏洞。为了减轻MITM攻击,处理敏感客户数据或财务信息的应用程序应使用ServerTrustPolicy提供的证书或公钥固定。
服务器信任策略
ServerTrustPolicy枚举评估通过安全HTTPS连接连接到服务器时通常由URLAuthenticationChallenge提供的服务器信任。
有许多不同的服务器信任评估情况,使您可以完全控制验证过程:
服务器信任策略管理器
ServerTrustPolicyManager负责存储服务器信任策略到特定主机的内部Map。这允许Alamofire根据不同的服务器信任策略评估每个主机。
确保保留对新的SessionManager示例的引用,否则当sessionManager被释放时,您的请求将全部取消。这些服务器信任策略将导致以下行为:
test.example.com 将始终使用证书钉扎,并启用证书链和主机验证,因此需要满足以下条件才能成功进行TLS握手:证书链必须有效。证书链必须包含一个固定证书。挑战主机必须与证书链的叶证书中的主机匹配。insecure.expired-apis.com永远不会评估证书链,并且总是允许TLS握手成功。所有其他主机将使用Apple提供的默认评估。子类化服务器信任策略管理器
如果您发现自己需要更灵活的服务器信任策略匹配行为(即通配符域),然后子类化ServerTrustPolicyManager并使用您自己的自定义实现重写serverTrustPolicyForHost方法。
验证主机
. performDefaultEvaluation、.pinCertificates和.pinPublicKeys服务器信任策略都采用validateHost参数。将该值设置为true将使服务器信任评估验证证书中的主机名是否与质询的主机名匹配。如果它们不匹配,则评估将失败。validateHost值为false仍将评估完整的证书链,但不会验证叶证书的主机名。
建议在生产环境中始终将validateHost设置为true。验证证书链
固定证书和公钥都可以选择使用validateCertificateChain参数验证证书链。通过将此值设置为true,除了对固定的证书或公钥执行字节相等性检查外,还将评估完整的证书链。值为false将跳过证书链验证,但仍将执行字节相等性检查。
在几种情况下,禁用证书链验证可能是有意义的。禁用验证的最常见用例是自签名证书和过期证书。在这两种情况下,评估总是会失败,但字节相等性检查仍将确保您从服务器接收到所需的证书。
建议在生产环境中始终将validateCertificateChain设置为true。应用传输安全
在iOS 9中添加了应用传输安全性(ATS)后,使用带有多个ServerTrustPolicy对象的自定义ServerTrustPolicyManager可能不会产生任何效果。如果您连续看到CFNetwork SSL Handshake failed(-9806)错误,则可能遇到了此问题。Apple的ATS系统会覆盖整个挑战系统,除非您在应用的plist中配置ATS设置,以禁用足够的ATS设置,以允许您的应用评估服务器信任。
如果您遇到此问题(自签名证书的可能性很高),您可以通过将以下内容添加到Info. plist来解决此问题。
是否需要将NSCepceptionResForwardSecret设置为NO取决于TLS连接是否使用允许的密码套件。在某些情况下,需要将其设置为NO。必须将NSExceptionAllowsInsecureHTTPLools设置为YES,以便允许SessionDelegate接收质询回调。一旦挑战回调被调用,ServerTrustPolicyManager将接管服务器信任评估。如果您尝试连接到仅支持低于1.2的TLS版本的主机,则可能还需要指定NSTEmporaryExceptionMinimumTLSVersion。
建议在生产环境中始终使用有效的证书。在本地网络中使用自签名证书
如果您尝试连接到本地主机上运行的服务器,并且使用自签名证书,则需要将以下内容添加到Info. plist中。
根据Apple文档,将NSAlowsLocalNetworking设置为YES允许加载本地资源,而无需为应用的其余部分禁用ATS。
参考:-https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md
有关实现细节,请参阅测试。https://github.com/Alamofire/Alamofire/blob/master/Tests/TLSEvaluationTests.swift#L290-L450
hs1ihplo2#
使用TrustKit和Alamofire进行SSL固定。在这里,我包含了API Manager类。这将帮助您解决使用Alamofire和TrustKit的问题。
有关完整教程,请参阅this link。
fxnxkyjh3#
Alamofire已经改变了新版本(Alamofire 5.0)中剪切的所有固定代码。
您应该像下面一样使用ServerTrustManager,
f87krz0w4#
我建议使用TrustKit。它是一个专用的库,可以与基于NSURLSession的所有内容一起工作,包括Alamofire。根据您的用例,它可能很简单,只需向Info.plist添加几个值。
与任何安全措施一样,证书固定不是您应该自己实现的,而是您应该使用经过验证的库。
chhqkbe15#
g6ll5ycj6#
我找到了这个解决方案