ios - Swift-NIO 安全的 websocket 服务器

标签 ios swift websocket server swift-nio

我正在尝试在我的 iOS 应用程序中创建 websocket 服务器和客户端,我在此处示例实现的帮助下成功地做到了这一点。 ( https://github.com/apple/swift-nio/tree/master/Sources/NIOWebSocketServer ) - 所以目前的工作情况是,我在应用程序启动时运行 websocket 服务器,然后我将客户端加载到可以连接到它的 webview 中。

现在我的问题是我希望我的服务器能够保护 websocket 服务器(基本上从 HTTPS html 页面连接到 websocket 服务器)

我是网络编程的新手,至少可以说缺乏 Swift-nio 文档。据我所知,我可以使用(https://github.com/apple/swift-nio-transport-services)

我发现这个线程正是我需要的 - https://github.com/apple/swift-nio-transport-services/issues/39 - 我可以禁用 TLS 身份验证,因为我不关心我的用例,只要我可以连接 websocket。

所以我的问题是如何扩展我的客户端 ( https://github.com/apple/swift-nio/tree/master/Sources/NIOWebSocketClient ) 和服务器 ( https://github.com/apple/swift-nio/tree/master/Sources/NIOWebSocketServer ) 以使用 swift-nio-transport-service。

我可以添加 NIOSSLContext 和其他内容,但我认为我需要添加 EventLoopGroup 和新的 bootstrap 方法。我知道答案就在那里……但我似乎无法准确指出。

任何指针将不胜感激。

谢谢。

最佳答案

要将简单的 NIO 服务器转换为 NIOTransportServices 服务器,您需要进行以下更改:

  1. 将对 NIOTransportServices 的依赖项添加到您的服务器。
  2. MultiThreadedEventLoopGroup 更改为 NIOTSEventLoopGroup
  3. ClientBootstrap 更改为 NIOTSConnectionBootstrap
  4. ServerBootstrap 更改为 NIOTSListenerBootstrap
  5. 构建并运行您的代码。

有些 ChannelOptionNIOTransportServices 中不起作用,但大多数都起作用:确认事情正常运行的最简单方法是快速测试公共(public)流。

这不会为您的应用程序添加任何额外的功能,但它确实为您提供了使用 iOS API 的相同功能。

要将 TLS 添加到 NIOTSConnectionBootstrapNIOTSListenerBootstrap,您可以使用 .tlsOptions 函数。例如:

NIOTSListenerBootstrap(group: group)
    .tlsOptions(myTLSOptions())

配置 NWProtocolTLS.Options 是一件有点棘手的事情。您需要获得一个 SecIdentity,这需要与钥匙串(keychain)进行交互。 Quinn 对此进行了一些讨论 here .

一旦你有了一个SecIdentity,你就可以像这样使用它:

func myTLSOptions() -> NWProtocolTLS.Options {
    let options = NWProtocolTLS.Options()
    let yourSecIdentity = // you have to implement something here
    sec_protocol_options_set_local_identity(options.securityProtocolOptions, sec_identity_create(yourSecIdentity)
    return options
}

编写代码后,一切都会顺利进行!


作为扩展,如果你想在 Linux 上保护 NIO 服务器,你可以使用 swift-nio-ssl 来实现。 .这有单独的配置,因为钥匙串(keychain) API 不可用,因此您需要从文件中加载更多的 key 和证书。

关于ios - Swift-NIO 安全的 websocket 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57465854/

相关文章:

java - Spring应用服务器通过websocket向客户端传输数据

ios - 无法访问 AppStore 连接

swift - 如何快速将 UInt 转换为 Int?

ios - 如何获得正确的 AVAudioFormat 用于连接节点

swift - 帧高打印 0

android - 适用于 Android 和 iOS 的 MQTT over websocket

ios - 使用 Swift 创建 Flutter 项目

ios - 基于 View iOS 隐藏和调整文本字段

ios - OCR Tesseract 只设置数字

node.js - websockets 的相对路径