Нам нужно создать TLS-соединение с root сертификатом CA. У нас есть файлы .pem и .der сертификата root.
Вот шаги:
- Создание параметров для соединения TLS с использованием NWProtocolTLS
func createTLSParameters(allowInsecure: Bool, queue: DispatchQueue) -> NWParameters {
let options = NWProtocolTLS.Options()
sec_protocol_options_set_local_identity(options.securityProtocolOptions, sec_identity_create(clientIdentity)!)
sec_protocol_options_set_challenge_block(options.securityProtocolOptions, { (_, completionHandler) in
completionHandler(sec_identity_create(clientIdentity)!)
}, .main)
let parameters = NWParameters(tls: options)
return parameters
}
Создание сокет-соединения с параметром TLS с помощью NWConnection
func createSocket() {
let parameters = createTLSParameters(allowInsecure: true, queue: self.queue)
parameters.prohibitedInterfaceTypes = [.wifi]
guard let endPoint = NWEndpoint.Port(rawValue: 4420) else {
return
}
con = NWConnection(to: .hostPort(host: NWEndpoint.Host("somehostname.com"), port: endPoint), using: parameters)
con?.stateUpdateHandler = { [weak self] status in
if case .ready = status {
self?.receiveData()
}
}
con?.start(queue: queue)
}
Отправить HTTPS-запрос. Здесь Обязательная информация - это URI для GET.
func sendData(for groupUrl: String, atk: String) {
con?.send(content: "GET **Required Info**".data(using: .utf8), contentContext: .defaultMessage, isComplete: false, completion: NWConnection.SendCompletion.contentProcessed({ (error) in
print("send Data callback---")
if let err = error {
print("send Data failed \(err)")
}
}))
}
В ответ мы получили.
HTTP/1.0 200 OK
Cache-Control: no-cache
Pragma: no-cache
Connection: close
Content-Length: 188
<html><head><title>Request Rejected</title></head>
<body>The requested URL was rejected. Please consult with your administrator.
<br><br>Your support ID is: 7*********769</body></html>
Я думаю, что-то произошло для загрузки root CA-информации во время создания параметра TLS. Можете ли вы помочь нам способ загрузки root CA во время соединения TLS?