iOS 移动应用程序证书颁发机构

iOS mobile app certificate authority

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

这是我的 Alamofire.Manger:

static let 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 - 连接测试。ex01.local:5000

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

希望这对以后的人有所帮助。

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

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

此行为的原因是 ATS 在给 NSURLSessionDelegate 评估挑战的机会之前首先评估连接挑战。如果 ATS 评估质询的属性并确定它不应该信任该连接,它就会停在那里并且请求不会成功。它不会调用 NSURLSessionDelegate 给您第二次覆盖它的机会。

但是,当您禁用 ATS 时,第一次 ATS 检查将不再发生,质询将发送到 NSURLSessionDelegate 进行评估,这是 Alamofire 开始的地方。