Ssl pinning в Swift AlamoFire

Я новичок здесь, но у меня есть приложение, которое подвержено атакам MITM.

После того, как я немного научился, мне кажется, что мне нужно сделать SSL Pining, т.е. сохранить копию открытого ключа/сертификата моих серверов, чтобы он мог определить, пришел ли от него ответ.

Я понятия не имею, как это сделать, я использую AlamoFire в Swift для работы с сетью.

Ответ 1

В Alamofire теперь реализовано закрепление сертификата. Необходимая документация находится в файле Readme.md

https://github.com/Alamofire/Alamofire

Посмотрите пример реализации:

let serverTrustPolicies: [String: ServerTrustPolicy] = [
    "test.example.com": .PinCertificates(
        certificates: ServerTrustPolicy.certificatesInBundle(),
        validateCertificateChain: true,
        validateHost: true
    ),
    "insecure.expired-apis.com": .DisableEvaluation
]

let manager = Manager(
    serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)

Ответ 2

Во-первых, вам необходимо скачать сертификат. Лучший способ - скачать сертификат в браузере 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

Добавить файл сетевого менеджера. Замените свой URL на 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")
        }
}
}

Ответ 3

Alamofire 5.0 теперь выпущен. И SSN Pinnig изменен. Посмотрите на фрагмент кода ниже.

let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForRequest = timeoutIntervalForRequest
        let trustManager = ServerTrustManager(evaluators: [
                     "prod.ehliyetcepte.com": PublicKeysTrustEvaluator(),
                     "dev.ehliyetcepte.com": DisabledEvaluator()])


        self.session = Session(startRequestsImmediately: true,
                               configuration: configuration,
                               delegate: self,
                               serverTrustManager: trustManager)

Ответ 4

Как указано здесь: https://github.com/Alamofire/Alamofire/issues/366

Это, безусловно, то, что сообщество хочет поддержать, но пока нет надежных временных рамок. На данный момент я бы сказал, что вам нужно продолжить AFNetworking и внимательно следить за проектом Alamofire для новых функций.