为什么 ssl 固定不适用于同步请求?
Why is ssl pinning not working on synchronous requests?
我想使用 Alamofire 库进行 ssl 固定,但它不适用于同步请求。
我正在使用以下库来同步 Alamofire 请求:
https://github.com/Dalodd/Alamofire-Synchronous
在异步调用中,我用代码 -999 取消了,但是当我尝试使用同步时,我得到的所有响应都是 200。
我的代码是这样的:
let hostname = "..."
let cert = "..." // e.g. for cert.der, this should just be "cert"
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
let defaultManager = Alamofire.SessionManager(
configuration: URLSessionConfiguration.default,
serverTrustPolicyManager: serverTrustPolicyManager
)
let manager = defaultManager
manager.session.configuration.timeoutIntervalForRequest = 120
let request = getRequest(object, endPoint: endPoint)
let response = manager.request(request).responseString()
如果我不在下面的代码中使用信号灯,请求将被中止,但如果我使用它,我会收到 200 个响应
public func response<T: DataResponseSerializerProtocol>(responseSerializer: T) ->
DataResponse<T.SerializedObject> {
let semaphore = DispatchSemaphore(value: 0)
var result: DataResponse<T.SerializedObject>!
self.response(queue: DispatchQueue.global(qos: .default), responseSerializer: responseSerializer) { response in
result = response
semaphore.signal()
}
_ = semaphore.wait(timeout: DispatchTime.distantFuture)
return result
}
这怎么可能?
不支持同步使用 Alamofire,因此您在执行此操作时看到的任何不当行为不太可能得到修复。
此外,该依赖项使用的是 Alamofire 4,其中 5 是最新版本,所以如果您真的想要这种行为,我建议您使用最新版本手动实现它。
我想使用 Alamofire 库进行 ssl 固定,但它不适用于同步请求。
我正在使用以下库来同步 Alamofire 请求: https://github.com/Dalodd/Alamofire-Synchronous 在异步调用中,我用代码 -999 取消了,但是当我尝试使用同步时,我得到的所有响应都是 200。 我的代码是这样的:
let hostname = "..."
let cert = "..." // e.g. for cert.der, this should just be "cert"
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
let defaultManager = Alamofire.SessionManager(
configuration: URLSessionConfiguration.default,
serverTrustPolicyManager: serverTrustPolicyManager
)
let manager = defaultManager
manager.session.configuration.timeoutIntervalForRequest = 120
let request = getRequest(object, endPoint: endPoint)
let response = manager.request(request).responseString()
如果我不在下面的代码中使用信号灯,请求将被中止,但如果我使用它,我会收到 200 个响应
public func response<T: DataResponseSerializerProtocol>(responseSerializer: T) ->
DataResponse<T.SerializedObject> {
let semaphore = DispatchSemaphore(value: 0)
var result: DataResponse<T.SerializedObject>!
self.response(queue: DispatchQueue.global(qos: .default), responseSerializer: responseSerializer) { response in
result = response
semaphore.signal()
}
_ = semaphore.wait(timeout: DispatchTime.distantFuture)
return result
}
这怎么可能?
不支持同步使用 Alamofire,因此您在执行此操作时看到的任何不当行为不太可能得到修复。
此外,该依赖项使用的是 Alamofire 4,其中 5 是最新版本,所以如果您真的想要这种行为,我建议您使用最新版本手动实现它。