连接到自签名服务器时出现以下错误.
错误域= NSURLErrorDomain代码= -1202"此服务器的证书无效.您可能连接到假装为"maskeddomain.com"的服务器,这可能会使您的机密信息面临风险." UserInfo = 0x7fb6dec259e0 {NSURLErrorFailingURLPeerTrustErrorKey =,NSLocalizedRecoverySuggestion =你想连接到服务器吗?,_kCFStreamErrorCodeKey = -9813,NSUnderlyingError = 0x7fb6dbe0dd90"操作无法完成.(kCFErrorDomainCFNetwork error -1202.)"
看起来像Alamofire 1.3(https://github.com/Alamofire/Alamofire#security)允许禁用此验证.有没有人实现过这个?我在我的快速项目中使用Alamofire API,不确定"服务器信任策略管理器"究竟需要在哪里实现.请指教.
jon*_*ren 38
Swift 3或Swift 4和Alamofire 4的管理器配置:
private static var manager: Alamofire.SessionManager = {
    // Create the server trust policies
    let serverTrustPolicies: [String: ServerTrustPolicy] = [
        "test.example.com": .disableEvaluation
    ]
    // Create custom manager
    let configuration = URLSessionConfiguration.default
    configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
    let manager = Alamofire.SessionManager(
        configuration: URLSessionConfiguration.default,
        serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
    )
    return manager
}()
law*_*cko 22
有一种方法可以更改Alamofire管理器共享实例的服务器信任策略,但不建议这样做.相反,您应该创建自己的经理自定义实例.这是推荐的解决方案,代码是Swift 2.0,带有来自swift-2.0分支的Alamofire,在Xcode7 beta 5中编译.
创建经理的自定义实例
因为您不会在Alamofire上使用请求方法,而是使用自定义管理器上的请求方法,您需要考虑存储管理器的位置.我所做的是将它作为静态存储在我的网络包装器中(利用Alamofire并处理我的应用程序网络需求的类).我这样设置:
private static var Manager : Alamofire.Manager = {
        // Create the server trust policies
        let serverTrustPolicies: [String: ServerTrustPolicy] = [
            "maskeddomain.com": .DisableEvaluation
        ]
        // Create custom manager
        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders
        let man = Alamofire.Manager(
            configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
            serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
        )
        return man
    }()
下一步是切换所有使用你的电话Alamofire.request()用Manager.request(),所以你应该有这样的事情:
Manager.request(.GET, "http://stackoverflow.com").responseJSON(
    completionHandler: { (_, respose, result) -> Void in
            if result.isSuccess {
                // enjoy your success
            } else if result.isFailure {
                // deal with your failure
            }
    })
如果您想要更改管理器的共享实例,请转到此处获取更多信息.
cno*_*oon 12
在README中直接发布了一个示例,演示了如何在需要时禁用评估.
由于您还需要创建自己的Manager实例,因此您需要执行以下操作:
class NetworkManager {
    static let sharedInstance = NetworkManager()
    let defaultManager: Alamofire.Manager = {
        let serverTrustPolicies: [String: ServerTrustPolicy] = [
            "test.example.com": .PinCertificates(
                certificates: ServerTrustPolicy.certificatesInBundle(),
                validateCertificateChain: true,
                validateHost: true
            ),
            "insecure.expired-apis.com": .DisableEvaluation
        ]
        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders
        return Alamofire.Manager(
            configuration: configuration,
            serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
        )
    }()
}
这将允许您使用该NetworkManager.sharedInstance.defaultManager对象发出请求.
我项目的另一种方法。该ServerTrustPolicyManager是一个open类,它的serverTrustPolicy功能open了。因此它可以被覆盖。
// For Swift 3 and Alamofire 4.0
open class MyServerTrustPolicyManager: ServerTrustPolicyManager {
    // Override this function in order to trust any self-signed https
    open override func serverTrustPolicy(forHost host: String) -> ServerTrustPolicy? {
        return ServerTrustPolicy.disableEvaluation
        // or, if `host` contains substring, return `disableEvaluation`
        // Ex: host contains `my_company.com`, then trust it.
    }
}
然后,
    let trustPolicies = MyServerTrustPolicyManager(policies: [:])
    let manager = Alamofire.SessionManager(configuration: sessionConfig, delegate: SessionDelegate(), serverTrustPolicyManager: trustPolicies)
为了触发ServerTrustPolicyManager,Info.plist需要配置项目的需求。我在2015年11月1日的cnoon评论中找到了解决方案(详细信息)。
例如,如果有名为site1.foo.com,,site2.foo.com...的URL ,则添加App Transport Security Settings-> Exception Domains-> foo.com字典,并带有以下条目。
| 归档时间: | 
 | 
| 查看次数: | 19271 次 | 
| 最近记录: |