如果我复制了这个问题,我会提前道歉。我正在使用与.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对象中包含证书链后,一切正常。
希望这将有助于将来。
答案 0 :(得分:0)
AppTransportSecurity用于列出您想要的非HTTPS连接。 iOS阻止不在此列表中的非HTTPS连接!
答案 1 :(得分:0)
如果您的证书链无效并且是自签名的(假设是这种情况),那么您必须为该主机禁用ATS,否则您永远无法使用Alamofire证书锁定逻辑。 ATS永远不会让Alamofire有机会评估证书链。
此行为的原因是ATS首先评估连接质询,然后让NSURLSessionDelegate
有机会评估质询。如果ATS评估质询的属性并确定它不应该信任该连接,它将在那里停止并且请求将不会成功。它不会调用NSURLSessionDelegate
给你第二次机会来覆盖它。
然而,当你禁用ATS时,第一次ATS检查不再发生,并且挑战被发送到NSURLSessionDelegate
以进行评估,这是Alamofire开始的地方。