Приложение iOS для разработки не может подключиться к самозаверяющему сертификату SSL Secure WebSocket Server HTTP(s)IOS

Программируем под IOS
Ответить
Anonymous
 Приложение iOS для разработки не может подключиться к самозаверяющему сертификату SSL Secure WebSocket Server HTTP(s)

Сообщение Anonymous »

Поскольку мой iPhone был обновлен до iOS 16.6, похоже, он больше не поддерживает соединение HTTP WebSocket Server. Просто хочу также сказать, что у меня нет опыта разработки приложений для iOS, поэтому я буду благодарен за любую помощь и рекомендации.
Проблема, которую нужно решить: я пытался изменить коды, в которых создаю HTTP. (s) сервер и продвигаем его на сервер WebSocket, чтобы в конечном итоге заставить приложение iOS подключаться к новому HTTP-серверу WebSocket.
Справочная информация: инженер-программист, написавший код приложения iOS. сказал, что это было написано для подключения к Сервер SimpleWebsocket (HTTP) использует встроенную поддержку Websocket в iOS через «URLSessionWebsocketTask», и с момента обновления версии iOS на iPhone он не может подключиться к HTTP-серверу.
Коды для приложения iOS находятся в формате .swift и используют XCode для компиляции и загрузки приложения на iPhone. Создание сервера WebSocket происходит в .py вместе с контроллером графического интерфейса приложения.
Изначально, чтобы все работало, я бы настроил сервер WebSocket с помощью Ubuntu из сценария Python. поскольку я управляю приложением iOS через другой драйвер сценария Python, который предоставляет графический интерфейс для управления приложением на компьютере с Windows (компьютер также предоставляет мобильную точку доступа, к которой подключается iPhone для возможности подключения к серверу).< /p>
Изменения по порядку после моей попытки преобразовать HTTP-сервер в HTTP(S):
  • Создан самозаверяющий сертификат SSL с IP-адресом мобильной точки доступа в качестве общего имени.
  • Самозаверяющий SSL-сертификат на iPhone загружен и проверен.
  • Изменен файл WebSocketClient.py. который запускается в Ubuntu для принятия и использования сертификата SSL (это показывает, что сервер Secure WebSocket запущен на введенном порту)
  • Обновлен Сценарий Python Driver.py (графический интерфейс для управления приложением iOS) на компьютере Windows для подключения к Secure WebSocket Server (это также показывает, что он подключен к Secure WebSocket Server)
  • Здесь все выглядит хорошо точка
  • Теперь, после того как я подключаюсь к мобильной точке доступа с компьютера Windows, я перехожу к приложению iPhone iOS, где ему необходимо подключиться к сервер, поэтому в быстром коде приложения iOS для подключения к серверу я изменил исходный ws:// на wss:// и повторно загрузил приложение на iPhone, но оно не может подключиться к серверу (в Терминал Ubuntu, он будет показывать, если он подключается, но сейчас ничего не происходит).
  • При отладке подключения к серверу WebSocket возникает следующая ошибка: Error Domain=NSURLErrorDomain Code=-1009 «Подключение к Интернету отключено».< /strong>

    Я точно знаю, что мобильная точка доступа имеет подключение к Интернету, так как я использовал DropBox, чтобы получить cert.pem для сертификации SSL, чтобы доверять ей


    Я точно знаю, что мобильная точка доступа имеет подключение к Интернету, поскольку я использовал DropBox, чтобы получить сертификат SSL. li>

Основываясь на этих попытках, чего мне не хватает в моих действиях по подключению приложения iOS/iPhone к серверу HTTP(S)? Нужно ли мне добавлять изменения в info.plist приложения iOS (список свойств информации) для работы с HTTP(s) вместе с WebSocketConnection.swift приложения iOS? Заранее спасибо.
Коды для приложения iOS, которые, по моему мнению, имеют отношение к WebSocketServer:

Info.plist, куда я добавил строки (не уверен, правильно ли). :

Код: Выделить всё

NSAppTransportSecurity:

Код: Выделить всё




CFBundleDevelopmentRegion
$(DEVELOPMENT_LANGUAGE)
CFBundleExecutable
$(EXECUTABLE_NAME)
CFBundleIdentifier
$(PRODUCT_BUNDLE_IDENTIFIER)
CFBundleInfoDictionaryVersion
6.0
CFBundleName
$(PRODUCT_NAME)
CFBundlePackageType
$(PRODUCT_BUNDLE_PACKAGE_TYPE)
CFBundleShortVersionString
1.0
CFBundleVersion
1
LSRequiresIPhoneOS

NSCameraUsageDescription
ARKit live camera
NSLocationWhenInUseUsageDescription
for image anchor
NSAppTransportSecurity

NSAllowsArbitraryLoads

NSAllowsLocalNetworking

NSExceptionDomains

192.168.137.1

NSExceptionAllowsInsecureHTTPLoads

NSExceptionMinimumTLSVersion
TLSv1.2
NSExceptionRequiresForwardSecrecy

NSIncludesSubdomains




UIApplicationSceneManifest

UIApplicationSupportsMultipleScenes

UISceneConfigurations

UIWindowSceneSessionRoleApplication


UISceneConfigurationName
Default Configuration
UISceneDelegateClassName
$(PRODUCT_MODULE_NAME).SceneDelegate
UISceneStoryboardFile
Main




UIApplicationSupportsIndirectInputEvents

UILaunchStoryboardName
LaunchScreen
UIMainStoryboardFile
Main
UIRequiredDeviceCapabilities

armv7

UISupportedInterfaceOrientations

UIInterfaceOrientationPortrait
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight

UISupportedInterfaceOrientations~ipad

UIInterfaceOrientationPortrait
UIInterfaceOrientationPortraitUpsideDown
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight



Код: Выделить всё

//
//  WebSocketConnection.swift
//  WebSockets
//
//  Created by zen on 6/17/19.
//  Copyright © 2019 AppSpector.  All rights reserved.
//

import Foundation
import Combine

protocol WebSocketConnection {
func send(text: String)
func send(data: Data)
func connect()
func disconnect()
var delegate: WebSocketConnectionDelegate? {
get
set
}
}

protocol WebSocketConnectionDelegate {
func onConnected(connection: WebSocketConnection)
func onDisconnected(connection: WebSocketConnection, error: Error?)
func onError(connection: WebSocketConnection, error: Error)
func onMessage(connection: WebSocketConnection, text: String)
func onMessage(connection: WebSocketConnection, data: Data)
}

class WebSocketTaskConnection: NSObject, WebSocketConnection, URLSessionWebSocketDelegate {
var delegate: WebSocketConnectionDelegate?
var webSocketTask: URLSessionWebSocketTask!
var urlSession: URLSession!
let delegateQueue = OperationQueue()

// Commented out below - ML 11/18/2024
// init(url: URL) {
//     super.init()
//     urlSession = URLSession(configuration: .default, delegate: self, delegateQueue: delegateQueue)
//     webSocketTask = urlSession.webSocketTask(with: url)
// }

// Updated init() for configuration with SSL - ML 11/18/2024
init(url: URL) {
super.init()

// Create URLSession configuration with SSL settings
let config = URLSessionConfiguration.default
config.timeoutIntervalForResource = 30 // Adjust timeout if needed

urlSession = URLSession(configuration: config,
delegate: self,
delegateQueue: delegateQueue)

// Create WebSocket task with the URL
var request = URLRequest(url: url)
request.setValue("", forHTTPHeaderField: "Origin") // Handle any CORS issues
webSocketTask = urlSession.webSocketTask(with: request)
}

func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didOpenWithProtocol protocol: String?) {
self.delegate?.onConnected(connection: self)
}

func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didCloseWith closeCode: URLSessionWebSocketTask.CloseCode, reason: Data?) {
self.delegate?.onDisconnected(connection: self, error: nil)
}

// Added additional func urlSession() to accept/trust SSL - ML 11/18/2024
func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) ->  Void) {
guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust,
let serverTrust = challenge.protectionSpace.serverTrust else {
completionHandler(.performDefaultHandling, nil)
return
}

let credential = URLCredential(trust: serverTrust)
completionHandler(.useCredential, credential)
}

func connect() {
webSocketTask.resume()

listen()
}

func disconnect() {
webSocketTask.cancel(with: .goingAway, reason: nil)
}

func listen()  {
webSocketTask.receive { result in
switch result {
case .failure(let error):
self.delegate?.onError(connection: self, error: error)
case .success(let message):
switch message {
case .string(let text):
self.delegate?.onMessage(connection: self, text: text)
case .data(let data):
self.delegate?.onMessage(connection: self, data: data)
@unknown default:
fatalError()
}

self.listen()
}
}
}

func send(text: String) {
webSocketTask.send(URLSessionWebSocketTask.Message.string(text)) { error in
if let error = error {
self.delegate?.onError(connection: self, error: error)
}
}
}

func send(data: Data) {
webSocketTask.send(URLSessionWebSocketTask.Message.data(data)) { error in
if let error = error {
self.delegate?.onError(connection: self, error: error)
}
}
}
}
ОБНОВЛЕНИЕ:
Я могу подключить приложение iOS/iPhone к пользовательскому серверу SSL и обмениваться данными, но получаю ошибку -1001 «Запрос тайм-аут» через 30 секунд.
Архитектура:
  • ПК под управлением Windows под управлением Ubuntu (WSL), на котором размещен сервер WebSocket с самоподписавшийся SSL
  • Приложение Python с графическим интерфейсом в качестве клиента для управления приложением iOS
  • Приложение iOS в качестве другого клиента на физическом iPhone
    < li>Сервер работает по адресу wss://192.168.137.1:8001 (это IP-адрес мобильной точки доступа с ПК с Windows, к которому также необходимо подключить iPhone)
Текущее Статус:
  • ✓ Сервер успешно создан и работает.
  • ✓ Графический интерфейс Python подключается и работает правильно.
  • ✓ Приложение iOS первоначально подключается и обменивается данными в течение 30 секунд.
  • ✗ Время соединения iOS истекает через 30 секунд.
  • ✗ Обновления карт из графического интерфейса. не синхронизировать с приложением iOS
Сообщение об ошибке в терминале Xcode:

Код: Выделить всё

WebSocket: Received text message
2024-11-25 15:49:03.678384-0800 iVEERS[1465:454666] Task . finished with error [-1001] Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=-2103, _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask ., _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalWebSocketTask ."
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=wss://192.168.137.1:8001/, NSErrorFailingURLKey=wss://192.168.137.1:8001/, _kCFStreamErrorDomainKey=4}
Технические подробности:
  • Использование встроенного URLSessionWebSocketTask iOS для подключения через WebSocket
    < li>Самозаверяющий SSL-сертификат
  • Настройки безопасности транспорта, настроенные в Info.plist
  • Обновления карт используют данные PNG в кодировке Base64
Вопросы:
  • Что вызывает тайм-аут через 30 секунд?
  • Как поддерживать постоянный Соединение WebSocket?
  • Почему обновления карт не распространяются на клиент iOS?
Есть ли дополнительные рекомендации/предложения был бы очень признателен. Пожалуйста, дайте мне знать, помогут ли дополнительные фрагменты кода в том, что у меня сейчас есть.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -websocket
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»