美文网首页
Alamofire-安全认证

Alamofire-安全认证

作者: Code_人生 | 来源:发表于2019-08-27 14:40 被阅读0次

一、问题探索

        SessionManager.default.request(urlString).response { (defaultResponse) in
            print(defaultResponse)
        }
  • if let taskDidReceiveChallenge = taskDidReceiveChallenge {},用户实现了,执行用户实现的;用户没实现,执行系统实现的
//SessionDelegate

extension SessionDelegate: URLSessionTaskDelegate {
    open func urlSession(
        _ session: URLSession,
        task: URLSessionTask,
        didReceive challenge: URLAuthenticationChallenge,
        completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)
    {
        guard taskDidReceiveChallengeWithCompletion == nil else {
            taskDidReceiveChallengeWithCompletion?(session, task, challenge, completionHandler)
            return
        }

        if let taskDidReceiveChallenge = taskDidReceiveChallenge {
            let result = taskDidReceiveChallenge(session, task, challenge)
            completionHandler(result.0, result.1)
        } else if let delegate = self[task]?.delegate {
            delegate.urlSession(
                session,
                task: task,
                didReceive: challenge,
                completionHandler: completionHandler
            )
        } else {
            urlSession(session, didReceive: challenge, completionHandler: completionHandler)
        }
    }
}
  • serverTrustPolicy = session.serverTrustPolicyManager?.serverTrustPolicy(forHost: host)
  • serverTrust = challenge.protectionSpace.serverTrust
//TaskDelegate
    @objc(URLSession:task:didReceiveChallenge:completionHandler:)
    func urlSession(
        _ session: URLSession,
        task: URLSessionTask,
        didReceive challenge: URLAuthenticationChallenge,
        completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)
    {
        var disposition: URLSession.AuthChallengeDisposition = .performDefaultHandling
        var credential: URLCredential?

        if let taskDidReceiveChallenge = taskDidReceiveChallenge {
            (disposition, credential) = taskDidReceiveChallenge(session, task, challenge)
        } else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
            let host = challenge.protectionSpace.host

            if
                let serverTrustPolicy = session.serverTrustPolicyManager?.serverTrustPolicy(forHost: host),
                let serverTrust = challenge.protectionSpace.serverTrust
            {
                if serverTrustPolicy.evaluate(serverTrust, forHost: host) {
                    disposition = .useCredential
                    credential = URLCredential(trust: serverTrust)
                } else {
                    disposition = .cancelAuthenticationChallenge
                }
            }
        } else {
            if challenge.previousFailureCount > 0 {
                disposition = .rejectProtectionSpace
            } else {
                credential = self.credential ?? session.configuration.urlCredentialStorage?.defaultCredential(for: challenge.protectionSpace)

                if credential != nil {
                    disposition = .useCredential
                }
            }
        }

        completionHandler(disposition, credential)
    }

二、添加认证

        self.sessionManager = trustSessionManager()
        self.sessionManager?.request(urlString).response { (defaultResponse) in
            print(defaultResponse)
        }
  • pinPublicKeys(publicKeys: [SecKey], validateCertificateChain: Bool, validateHost: Bool) 验证证书
    • ServerTrustPolicy.certificates() Alamofire提供的方法,默认Bundle.main
    • ServerTrustPolicy.certificates(in: Bundle) Alamofire提供的方法,自己添加证书路径
    • validateCertificateChain 验证证书链
    • validateHost 验证域名地址
  • pinPublicKeys(publicKeys: [SecKey], validateCertificateChain: Bool, validateHost: Bool) 只验证公钥
  • disableEvaluation 不用验证
  • performDefaultEvaluation(validateHost: Bool) 默认的策略,只有合法证书才能通过验证
  • performRevokedEvaluation(validateHost: Bool, revocationFlags: CFOptionFlags) 对注销证书做的一种额外设置
  • customEvaluation((_ serverTrust: SecTrust, _ host: String) -> Bool) 自定义验证,需要返回一个布尔类型的结果
    func trustSessionManager() -> SessionManager{
        
        let serverTrustPlolicies:[String: ServerTrustPolicy] = [
//            hostUrl: .pinCertificates(
//                certificates: ServerTrustPolicy.certificates(),
//                validateCertificateChain: true, //验证证书链
//                validateHost: true //验证域名地址
//            ) //验证证书
        
//            hostUrl: .disableEvaluation //不用验证
            
            hostUrl: .pinPublicKeys(publicKeys: ServerTrustPolicy.publicKeys(), validateCertificateChain: true, validateHost: true) //只验证公钥
        ]
        let sessionManger = SessionManager(serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPlolicies))

        return sessionManger
    }

相关文章

  • Alamofire-安全认证

    一、问题探索 if let taskDidReceiveChallenge = taskDidReceiveCha...

  • 2019-08-22

    Alamofire-初探

  • Alamofire-安全策略

    在web服务器和服务器通信的时候,使用https连接是非常重要的,能够对数据加密传输、身份认证。https协议需要...

  • 使用 SSH-Key 登录远程服务器

    ssh 提供两种级别的安全认证: 基于口令的安全认证 基于密钥的安全认证 基于口令的安全认证 需要知道用户名和密码...

  • OTP一次性动态密码工具实现

    对于企业内部信息安全或行业安全合规性需求,3A认证、授权、审计是必要的基础安全审查项。认证安全机制要求双因素认证,...

  • 四、API安全机制-认证

    源码下载 一、API安全机制-认证API安全机制.png 认证过滤器

  • Alamofire框架使用

    Alamofire-使用[https://blog.csdn.net/yahibo/article/details...

  • CCC认证费用是多少?

    CCC认证是中国强制认证,CCC是英文的缩写,认证对涵盖的产品执行中国强制的安全认证(包含安全跟电磁兼容测试)。所...

  • ELK的安全加固

    一、配置ELK的安全认证功能 ELK支持安全认证功能,但是需要安装xpack插件。我在做认证测试时,发现ELK在6...

  • 【CCC认证百科】CCC认证查询方法 CCC认证证书颁发

    CCC认证作为国家安全认证(CCEE)、进口安全质量许可制度(CCIB)、中国电磁兼容认证(EMC)三合一的“CC...

网友评论

      本文标题:Alamofire-安全认证

      本文链接:https://www.haomeiwen.com/subject/khnsectx.html