Swift客户端和根SSL证书认证 [英] Swift client and root SSL certificate authentication

查看:183
本文介绍了Swift客户端和根SSL证书认证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

QLIK服务器令牌 api与 ssl 证书,但执行任务后却出现这样的错误-

Integrating get token api of QLIK server with ssl certificate but after performing task I am getting error like this -


完成错误-代码:-999



// Your hostname and endpoint
let hostname = "YOUR_HOST_NAME"
let endpoint = "YOUR_ENDPOINT"
let cert = "YOUR_CERT" // e.g. for cert.der, this should just be "cert"

// Set up certificates
let pathToCert = Bundle.main.path(forResource: cert, ofType: "der")
let localCertificate = NSData(contentsOfFile: pathToCert!)
let certificates = [SecCertificateCreateWithData(nil, localCertificate!)!]

// Configure the trust policy manager
let serverTrustPolicy = ServerTrustPolicy.pinCertificates(
    certificates: certificates,
    validateCertificateChain: true,
    validateHost: true
)    
let serverTrustPolicies = [hostname: serverTrustPolicy]
let serverTrustPolicyManager = ServerTrustPolicyManager(policies: serverTrustPolicies)

// Configure session manager with trust policy
afManager = SessionManager(
    configuration: URLSessionConfiguration.default,
    serverTrustPolicyManager: serverTrustPolicyManager
)



qlikManager.request(strURL, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers).responseJSON { (responseObject) -> Void in

       print(responseObject)
    }

请检查它

推荐答案

创建 CustomServerTrustPolicyManager.swift 并使用以下代码

import UIKit
import Alamofire

class CustomServerTrustPolicyManager: ServerTrustPolicyManager {

    override func serverTrustPolicy(forHost host: String) -> ServerTrustPolicy? {
        // Check if we have a policy already defined, otherwise just kill the connection
        if let policy = super.serverTrustPolicy(forHost: host) {
            return policy
        } else {
            return .customEvaluation({ (_, _) -> Bool in
                return false
            })
        }
    }
}

然后创建 NetworkManager.swift 并使用以下代码:

then create NetworkManager.swift and use below code:

import UIKit
import Alamofire

class NetworkManager {

    static let sharedInstance = NetworkManager()

    let manager: Alamofire.SessionManager = {

        //For using Cerificates Pinning
        let serverTrustPolicies: [String: ServerTrustPolicy] = [
            "host_url": .pinCertificates(
            certificates: ServerTrustPolicy.certificates(),
                validateCertificateChain: true,
                validateHost: true
            )
        ]

        /*
        //For Using with Public Key
        let serverTrustPolicies: [String: ServerTrustPolicy] = [
            "host_url": .pinPublicKeys(
                publicKeys: ServerTrustPolicy.publicKeys(),
                validateCertificateChain: true,
                validateHost: true
            )
        ]
        */

        let configuration = URLSessionConfiguration.default
        configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders

        return Alamofire.SessionManager(
            configuration: configuration,
            serverTrustPolicyManager: CustomServerTrustPolicyManager(policies: serverTrustPolicies)
        )
    }()
}

之后,使用以下命令测试您的连接。

After that use like following to test your connection.

func testSSLConnection() {
    NetworkManager.sharedInstance.manager.request("your_url_to_test").responseJSON { response in
        print("Request: \(String(describing: response.request))")   // original url request
        print("Response: \(String(describing: response.response))") // http url response
        print("Result: \(response.result)")                         // response serialization result

        if let json = response.result.value {
            print("JSON: \(json)") // serialized json response
        }
    }
}

希望它会对您有所帮助。

Hope it will help you.

这篇关于Swift客户端和根SSL证书认证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆