iOS移动应用证书颁发机构

时间:2016-06-14 15:05:28

标签: ios certificate alamofire ca authority

如果我复制了这个问题,我会提前道歉。我正在使用与.local域上的API通信的移动应用程序。我一直试图建立一个安全的连接(使用Alamofire)。我试图像Alamofire wiki建议的那样编写一个自定义的ServerTrustPolicy,并包含我的证书链,但它总是失败。让应用程序连接的唯一方法是在.plist文件中配置App Transport Security并将域添加为例外。有没有人通过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 -connect test.ex01.local:5000

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

希望这将有助于将来。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

此行为的原因是ATS首先评估连接质询,然后让NSURLSessionDelegate有机会评估质询。如果ATS评估质询的属性并确定它不应该信任该连接,它将在那里停止并且请求将不会成功。它不会调用NSURLSessionDelegate给你第二次机会来覆盖它。

然而,当你禁用ATS时,第一次ATS检查不再发生,并且挑战被发送到NSURLSessionDelegate以进行评估,这是Alamofire开始的地方。

相关问题