如何使用Alamofire 1.3连接到自签名服务器

Ara*_*ren 20 swift alamofire

连接到自签名服务器时出现以下错误.

错误域= 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 3Swift 4Alamofire 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
}()
Run Code Online (Sandbox Code Playgroud)


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
    }()
Run Code Online (Sandbox Code Playgroud)

下一步是切换所有使用你的电话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
            }
    })
Run Code Online (Sandbox Code Playgroud)

如果您想要更改管理器的共享实例,请转到此处获取更多信息.

  • 不应该是`let man = Alamofire.Manager(配置:配置,serverTrustPolicyManager:ServerTrustPolicyManager(policies:serverTrustPolicies))`? (2认同)

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)
        )
    }()
}
Run Code Online (Sandbox Code Playgroud)

这将允许您使用该NetworkManager.sharedInstance.defaultManager对象发出请求.

  • @jrf你需要使用`.DisableEvaluation`.没有自签名证书的概念.它们无效,因为它们未由受信任的根颁发机构签名.如果你需要更多的自定义行为,那么你总是可以使用`.CustomEvaluation`案例来推销自己的行为. (2认同)

Aec*_*Liu 5

我项目的另一种方法。该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.
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,

    let trustPolicies = MyServerTrustPolicyManager(policies: [:])
    let manager = Alamofire.SessionManager(configuration: sessionConfig, delegate: SessionDelegate(), serverTrustPolicyManager: trustPolicies)
Run Code Online (Sandbox Code Playgroud)

更新@ 2018,01

为了触发ServerTrustPolicyManagerInfo.plist需要配置项目的需求。我在2015年11月1日的cnoon评论中找到了解决方案(详细信息)。

在此处输入图片说明

例如,如果有名为site1.foo.com,,site2.foo.com...的URL ,则添加App Transport Security Settings-> Exception Domains-> foo.com字典,并带有以下条目。

  • NSExceptionRequiresForwardSecrecy:NO
  • NSExceptionAllowsInsecureHTTPLoads:是
  • NSIncludesSubdomains:是

更多细节可以参考该帖子。