У меня есть сервер Python в облаке, который принимает запросы сокетов. У меня есть клиентское приложение Swift (xCode), которое использует потоки ввода/вывода NS (вход/выход) для связи с приложением сервера python.
Я создал свой собственный сертификат SSL и файлы ключей на сервере.
С кодом оболочки SSL, закомментированным на стороне моего сервера, я могу заставить свой клиент и сервер нормально общаться. С SSL я получаю ошибки рукопожатия.
И сервер, и клиент используют TLSV1 для протокола уровня безопасности.
На стороне Mac у меня установлен файл сертификата сервера, и он разрешен в моей цепочке ключей пользователя, но я думаю, что приложение не ищет там доверенные сертификаты.
Есть ли способ прагматически указать файл сертификата для использования NSStream (ами) непосредственно в приложении xCode. Или способ установить сертификат в приложении?
Я знаю, что в python, когда вы обертываете сокет SSL, вы можете сказать, что это клиент, и использовать определенный файл сертификата из пути. Есть ли эквивалент MacOS Swift?
Или я все неправильно делаю?
Ниже мой класс Swift "Light Socket". Ужин простой, но работает, когда не используется SSL на обоих концах.
class SSLSocketLite {
// The input stream.
private var inStream: NSInputStream?
// The output stream.
private var outStream: NSOutputStream?
// The host to connect to.
private var host: String
// The port to connect on.
private var port: Int
init(inHost:String, inPort:Int) {
host = inHost
port = inPort
NSStream.getStreamsToHostWithName(host, port: port, inputStream: &inStream, outputStream: &outStream)
}
func Open() {
inStream?.open()
outStream?.open()
inStream?.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey)
outStream?.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey)
}
func Read() -> String! {
var buffer = Array<UInt8>(count:1024, repeatedValue: 0)
if inStream!.hasBytesAvailable {
inStream!.read(&buffer, maxLength: 1024)
let responseString = NSString(bytes: buffer, length: buffer.count, encoding: NSUTF8StringEncoding) as! String
return responseString
}
return nil
}
func Write(msg:String) {
let data:NSData = msg.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
outStream!.write(UnsafePointer(data.bytes), maxLength: data.length)
}
func Close() {
inStream?.close()
outStream?.close()
}
}
Я собрал все это из множества других сообщений, но не смог найти упоминания о том, где и когда файл сертификата фактически используется вызовами Swift для связи с сервером.
Если есть ключевой элемент, который я либо упустил, либо неправильно понял, пожалуйста, дайте мне знать! И заранее спасибо!