Http-сервер Python не соответствует политике ATS - PullRequest
0 голосов
/ 03 июля 2019

Я создал http-сервер на python, который работает как положено (отвечает на json как строку) и URLSession в Swift, который должен получить этот json. Моя проблема в том, что Apple требует HTTP-соединения для использования HTTPS.

App Transport Security (ATS)

Начиная с iOS 9.0 и OS X 10.11, новая функция безопасности, называемая App Transport Security (ATS), включена по умолчанию для всех HTTP-соединений, выполненных с помощью URLSession. ATS требует, чтобы HTTP-соединения использовали HTTPS (RFC 2818). Для получения дополнительной информации посмотрите NSAppTransportSecurity в Ссылке ключа Списка свойств информации.

См .: https://developer.apple.com/documentation/foundation/urlsession

Это код для моего сервера Python:

import http.server
import ssl
import json

class RequestHandler(http.server.BaseHTTPRequestHandler):
    def set_headers(self):
        self.send_response(200)
        self.end_headers()

    def do_GET(self):
        self.set_headers()
        self.wfile.write(json.dumps({
            'title': 'title'
        }).encode())

port = 8888
host = ''

with http.server.HTTPServer((host, port), RequestHandler) as httpd:
    httpd.socket = ssl.wrap_socket(httpd.socket, keyfile='key.pem', certfile='cert.pem', server_side=True)
    print('server serves on {}:{}'.format(host, port))
    httpd.serve_forever()

Это команда, которую я использовал для создания файлов сертификатов и ключей: openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365. Когда я запускаю файл сервера python, мне нужно ввести пароль PEM, поэтому я предполагаю, что это сработало.

А это мой код Swift для URLSession:

let url = URL(string: "http://localhost:8888")!
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
let dataTask = session.dataTask(with: url) { (data, response, error) in
    guard error != nil else {
        print("\(error!.localizedDescription)")
        return
    }
    guard data != nil else {
        print("no data")
        return
    }

    print(String(data: data!, encoding: .utf8)!)
}
dataTask.resume()

Когда я запускаю код Python, а затем код Swift, Xcode выдает мне ошибку и печатает нет данных . Ошибка: не удается запустить загрузку задачи ... <1>, поскольку она не соответствует политике ATS

Обратите внимание, что я хочу, чтобы мой python-сервер соответствовал политике ATS, а НЕ добавлял исключения домена или ключ NSAllowsLocalNetworking в мой info.plist.

PS: Модуль ssl и ssl.wrap_socket(... были попыткой заставить мой HTTP-сервер соответствовать политике ATS.

1 Ответ

1 голос
/ 09 июля 2019

Мне действительно нравится использовать Ngrok для этого, это очень просто и бесплатно (хотя есть платные версии). С их сайта

ngrok предоставляет доступ к локальным серверам за NAT и брандмауэрами Интернет через безопасные туннели.

Например, я запускаю свои проекты django на localhost: 8000 и запускаю ngrok, чтобы создать https / http-URL для моего приложения iOS, вместо того чтобы пытаться подключиться к localhost: 8000 напрямую. Установка и запуск занимает около двух секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...