0

如果我复制了这个问题,我提前道歉。我正在开发一个与 .local 域上的 API 通信的移动应用程序。我一直在尝试建立安全连接(使用 Alamofire)。我尝试按照 Alamofire wiki 的建议编写自定义 ServerTrustPolicy,并包含我的证书链,但它总是失败。让应用程序连接的唯一方法是在 .plist 文件中配置应用程序传输安全性并将域添加为例外。有没有人有使用 .local 域的 alamofire 证书的经验?非常感谢任何建议。先感谢您。

这是我的 Alamofire.Manger:

静态让 sharedInstance: Manager = {

    var apiObject = ApiBaseService()

    //let domainName = apiObject.getDomain()
    let pathToCert = NSBundle.mainBundle().pathForResource("certca", ofType: "der")
    let localCertificate:NSData = NSData(contentsOfFile: pathToCert!)!

    let serverTrustPolicy = ServerTrustPolicy.PinCertificates(
        certificates: ServerTrustPolicy.certificatesInBundle(),
        validateCertificateChain: true,
        validateHost: true
    )

    let value = GlobalConstants.APICallErrorLocations.actionsGetActions
    let serverTrustPolicies: [String: ServerTrustPolicy] = [
        "test.ex01.local": serverTrustPolicy
    ]

    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders
    configuration.timeoutIntervalForRequest = NSTimeInterval(12.0)


    return Manager(configuration: configuration,
    serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies))
    }()

难道我做错了什么?

克里斯蒂安

编辑:

问题是我用这个命令发现的 TLS 版本是 v1.0:

openssl s_client -connect test.ex01.local:5000

更新 TLS 版本并在 ServerTrustPolicy 对象中包含证书链后,一切正常。

希望这对将来的人有所帮助。

4

2 回答 2

0

AppTransportSecurity 用于列出您想要的非 HTTPS 连接。iOS 会阻止不在此列表中的非 HTTPS 连接!

于 2016-06-14T15:57:36.970 回答
0

如果您的证书链无效并且是自签名的(假设是这种情况),那么您必须禁用该主机的 ATS,否则您将永远无法使用 Alamofire 证书固定逻辑。ATS 甚至不会给 Alamofire 评估证书链的机会。

这种行为的原因是 ATS 先评估连接质询,然后再给予NSURLSessionDelegate评估质询的机会。如果 ATS 评估了质询的属性并确定它不应该信任该连接,它就会停在那里并且请求不会成功。它不会调用NSURLSessionDelegate给您第二次覆盖它的机会。

但是,当您禁用 ATS 时,第一次 ATS 检查不再发生,并且质询被发送到NSURLSessionDelegateAlamofire 开始的评估。

于 2016-06-15T14:37:34.237 回答