为什么 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 是最新版本,所以如果您真的想要这种行为,我建议您使用最新版本手动实现它。