证书钉在Alamofire

问题描述 投票:5回答:2

我正在创建一个访问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/})
ios swift alamofire pinning
2个回答
8
投票

因此,问题是证书以错误的格式保存。

ServerTrustPolicy.certificatesInBundle()根据扩展列表查找捆绑包中的所有证书,然后尝试使用SecCertificateCreateWithData加载它们。根据其文档,此功能:

如果data参数中传递的数据不是有效的DER编码的X.509证书,则返回NULL

在Firefox中导出证书时,文件浏览器底部会出现“格式”弹出窗口。选择“X.509证书(DER)”,您应该为此目的获得正确格式的证书。


0
投票

首先,您需要下载证书。最好的方法是在Firefox浏览器上下载证书。

步骤1

转到您的网页/ API并单击锁定图标以获取证书。

enter image description here

第2步

单击查看证书

enter image description here

第3步

单击证书字段选项卡的第一部分,然后单击导出

enter image description here

第4步

选择格式: - DER

enter image description here

第5步

将文件拖放到XCode项目中

enter image description here

第6步

在“目标>构建阶段>复制捆绑资源”下添加证书

enter image description here

第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")
        }
}
}
© www.soinside.com 2019 - 2024. All rights reserved.