我正在创建一个访问HTTPS Web服务的iPad应用程序.我想实现固定,但我遇到了问题.
这个类创建了Alamofire Manager(主要来自文档):
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) } } }
该证书保存在项目中,并在"目标>构建阶段>复制包资源"显示.
我每次发出请求时都会收到以下错误(来自else块testPinning()
):
Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo={NSErrorFailingURLKey=https://www.google.co.uk/, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://www.google.co.uk/})
jcaron.. 8
因此,问题是证书以错误的格式保存.
ServerTrustPolicy.certificatesInBundle()
根据扩展列表查找捆绑包中的所有证书,然后尝试使用它们加载它们SecCertificateCreateWithData
.根据其文档,此功能:
如果data参数中传递的数据不是有效的DER编码的X.509证书,则返回NULL
在Firefox中导出证书时,文件浏览器底部会出现"格式"弹出窗口.选择"X.509证书(DER)",您应该为此目的获得正确格式的证书.
因此,问题是证书以错误的格式保存.
ServerTrustPolicy.certificatesInBundle()
根据扩展列表查找捆绑包中的所有证书,然后尝试使用它们加载它们SecCertificateCreateWithData
.根据其文档,此功能:
如果data参数中传递的数据不是有效的DER编码的X.509证书,则返回NULL
在Firefox中导出证书时,文件浏览器底部会出现"格式"弹出窗口.选择"X.509证书(DER)",您应该为此目的获得正确格式的证书.