【发布时间】:2016-04-09 05:51:19
【问题描述】:
我正在创建一个访问 HTTPS Web 服务的 iPad 应用程序。我想实现固定,但遇到了问题。
这个类创建 Alamofire 管理器(主要取自文档):
class NetworkManager {
var manager: Manager?
init() {
let serverTrustPolicies: [String: ServerTrustPolicy] = [
"www.google.co.uk": .PinCertificates(
certificates: ServerTrustPolicy.certificatesInBundle(),
validateCertificateChain: true,
validateHost: true
),
"insecure.expired-apis.com": .DisableEvaluation
]
manager = Alamofire.Manager(
configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)
}
}
这个函数进行调用:
static let networkManager = NetworkManager()
public static func testPinning() {
networkManager.manager!.request(.GET, "https://www.google.co.uk").response { response in
if response.1 != nil {
print("Success")
print(response.1)
print(response.1?.statusCode)
} else {
print("Error")
print(response.3)
}
}
}
项目中的 certificate is saved 并显示在“目标 > 构建阶段 > 复制捆绑资源”下。
我目前每次发出请求时都会收到以下错误(来自 testPinning() 中的 else 块):
Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo={NSErrorFailingURLKey=https://www.google.co.uk/, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://www.google.co.uk/})
【问题讨论】:
-
你提供了什么证书?您是否检查过
ServerTrustPolicy.certificatesInBundle()返回的内容(即它是否实际上包含证书)?如果 Google 对同一个域使用多个证书,也不会感到太惊讶。 -
ServerTrustPolicy.certificatesInBundle()返回 0,我不明白。有没有一种特定的方式可以将 .cer 证书添加到捆绑包中?关于谷歌,这是一个替换我正在开发的站点的示例站点,但上述问题是相同的。 -
你的意思是它返回一个空数组?该调用的返回值应该是一个数组,而不是一个数字。您可能想尝试
NSBundle.mainBundle().pathsForResourcesOfType(".cer", inDirectory: nil)以查看是否在捆绑包中找到了该文件(如果是,则可能表明证书文件内容存在问题)。调用ServerTrustPolicy.certificatesInBundle()时,日志中会显示什么内容? -
是的,这是正确的,我的意思是一个 0 值的数组。仔细观察,可以在link
certificatesInBundle()中找到那行代码。在那里的 for 循环中,找到了证书,但第 138 行阻止将证书添加到数组中。我怀疑它也可能是 .cer 的内容,尽管它在 Xcode 中打开得很好(关于我应该如何保存证书的任何建议,而不是问题中链接的方法?)。另外,我如何查看这些日志? -
当您在 Firefox 中导出证书时,文件浏览器底部会弹出一个“格式”弹出窗口。你选择了什么格式?我相信您需要“X.509 证书 (DER)”(根据
SecCertificateCreateWithData的文档,其中指出“如果在data参数中传递的数据不是有效的 DER 编码的 X.509 证书,则返回 NULL ”(强调我的)。
标签: ios swift alamofire pinning