我正在创建一个访问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)
}
}
}
项目中的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()
根据扩展列表查找捆绑包中的所有证书,然后尝试使用SecCertificateCreateWithData
加载它们。根据其文档,此功能:
如果data参数中传递的数据不是有效的DER编码的X.509证书,则返回NULL
在Firefox中导出证书时,文件浏览器底部会出现“格式”弹出窗口。选择“X.509证书(DER)”,您应该为此目的获得正确格式的证书。
首先,您需要下载证书。最好的方法是在Firefox浏览器上下载证书。
步骤1
转到您的网页/ API并单击锁定图标以获取证书。
第2步
单击查看证书
第3步
单击证书字段选项卡的第一部分,然后单击导出
第4步
选择格式: - DER
第5步
将文件拖放到XCode项目中
第6步
在“目标>构建阶段>复制捆绑资源”下添加证书
第7步
添加网络管理器文件。用google.com替换您的网址
import Foundation
import Alamofire
import SwiftyJSON
class MYPNetworkManager {
var Manager: SessionManager?
init() {
let serverTrustPolicies: [String: ServerTrustPolicy] = [
"https://google.com": .pinCertificates(
certificates: ServerTrustPolicy.certificates(),
validateCertificateChain: true,
validateHost: true
),
"insecure.expired-apis.com": .disableEvaluation
]
Manager = SessionManager(
serverTrustPolicyManager: ServerTrustPolicyManager(policies:
serverTrustPolicies)
)
}
}
第8步
添加文件以获取会话管理器
import Foundation
import Alamofire
import SwiftyJSON
class APIPinning {
private static let NetworkManager = MYPNetworkManager()
public static func getManager() -> SessionManager {
return NetworkManager.Manager!
}
}
第9步
在Alamofire上使用此会话管理器,例如: -
public static func testPinning() {
NetworkManager.Manager!.request("YourURL", method: .get, encoding: URLEncoding.httpBody, headers: MConnect.headersWithToken)
.validate()
.responseJSON { response in
print(response)
switch response.result {
case .success:
if let value = response.result.value {
let json = JSON(value)
print(json)
} else {
}
case .failure:
print("Error")
}
}
}