Сбой подтверждения SSL при попытке загрузить файл с FTPS - PullRequest
1 голос
/ 28 мая 2020

Что я делаю?

Я работаю над приложением iOS, которое будет загружать файлы с сервера FTPS. Для этой цели я использую библиотеку FilesProvider .

Описание ошибки

До сих пор мне удалось успешно войти на сервер, просмотреть файлы и выполнить поиск файлов, но Я получаю следующую ошибку при попытке загрузить один из файлов:

File Provider <FilesProvider.FTPFileProvider: 0x283c23900> shouldDoOperation Copy with action Copying and destination file:///private/var/mobile/Containers/Data/Application/90AF4202-18C1-4A41-B461-4FB262FD39B9/tmp/B13A8110-C919-48E4-8BD9-E684929310C0.tmp
2020-05-27 14:35:39.372289+0200 MyApp[548:100799] [] nw_socket_handle_socket_event [C13:1] Socket SO_ERROR [54: Connection reset by peer]
2020-05-27 14:35:39.595959+0200 MyApp[548:99892] CFNetwork SSLHandshake failed (-9806)
2020-05-27 14:35:39.596380+0200 MyApp[548:99892] TCP Conn 0x28274f540 SSLHandshake failed (-9806)
File Provider <FilesProvider.FTPFileProvider: 0x283c23900> Failed for operation Copy with action Copying and destination file:///private/var/mobile/Containers/Data/Application/90AF4202-18C1-4A41-B461-4FB262FD39B9/tmp/B13A8110-C919-48E4-8BD9-E684929310C0.tmp
Throwing Error: Error Domain=NSOSStatusErrorDomain Code=-9806 "(null)" UserInfo={_kCFStreamErrorCodeKey=-9806, _kCFStreamErrorDomainKey=3}

FTPFileProvider - это объект, созданный с помощью библиотеки, о которой я упоминал выше. который обрабатывает FTP-соединение. Этот провайдер выглядит так:

guard let url = URL(string: "ftps://X.X.X.X") else { return } // I have to use an IP address instead of a domain
var provider = FTPFileProvider(baseURL: url, mode: .default, credential: credential, cache: .none)
provider.delegate = self
provider.fileOperationDelegate = self // This delegate is only for print the first line of the error
provider.serverTrustPolicy = .disableEvaluation

После создания провайдера соединения я смог выполнить вход на сервер, выполнить поиск в некоторых файлах и получить список файлов. Я делаю это с помощью этой функции:

provider.searchFiles(path: remotePath, recursive: false, query: predicate, foundItemHandler: { (file) in print("File found with name: \(file.name)") }, completionHandler: { (list, error) in
        if error != nil {
            DispatchQueue.main.async {
                onError(error!)
            }
        } else {
            var files:[String] = []
            for f in list {
                (f.isRegularFile) ? files.append(f.name) : nil
            }
            DispatchQueue.main.async {
                onSucess(files)
            }
        }
})

При запуске этого поиска я получаю следующее предупреждение:

2020-05-27 14:45:51.831812+0200 MyApp[555:102153] [] nw_socket_handle_socket_event [C4:1] Socket SO_ERROR [54: Connection reset by peer]

Но я успешно получаю результат в onSuccess(files). Возвращаемое значение для files:

["20200527-093234-28346646454.pdf", "20200527-105409-28346646454.pdf"]

После этого поиска я пытаюсь загрузить один из файлов, когда получаю ошибку , описанную в начале этого поста. Для загрузки у меня есть следующая функция:

provider.copyItem(path: "\(remotePath)/\(file)", to: localPath.absoluteString, overwrite: true) { (error) in
    if error != nil {
        DispatchQueue.main.async {
            onError(error!)
        }
    } else {
        DispatchQueue.main.async {
            onSuccess(localPath)
        }
    }
}

То, что я пробовал

  • Как вы могли видеть выше, объект, который подключается к серверу, отключил SSL сертификаты проверки. Вот почему я могу выполнить вход в систему и искать файлы.
  • Я настроил Info.plist отключение ATS:
<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key> <!-- Because I wan't to allow everything  -->
        <true/>
        <key>NSAllowsLocalNetworking</key> <!-- Because seems like library uses AVFoundation framework -->
        <true/>
        <key>NSAllowsArbitraryLoadsForMedia</key> <!-- Because I'm using a public IP instead a domain -->
      <true/>
    </dict>

Ничего из этого варианты работают.

Некоторые факты

  • DNS-запись домена сейчас не будет создаваться. Я ничего не могу с этим поделать.
  • На сервере есть действующий сертификат SSL.
  • Я могу успешно войти в систему, просмотреть список файлов и выполнить поиск файлов. (Я просто не могу скачать)
  • Я не пытался загрузить файл. Приложение не собирается этого делать.

Вопросы

  • Почему логин, список или поиск файлов работают, но я получаю эту ошибку при попытке загрузки?
  • Есть идеи, как это исправить? Любое решение?
...