SwiftNIO SSL

SwiftNIO SSL 是一个 Swift 包,其中包含一个基于 BoringSSL 的 TLS 实现。此包允许 SwiftNIO 的用户编写使用 TLS 来保护传输中数据的协议客户端和服务器。

这个名字的灵感主要来自这个包使用的库的名字 (BoringSSL),而不是因为我们不知道协议的名字。我们知道协议是 TLS!

要开始使用,请查看 API 文档

使用 SwiftNIO SSL

SwiftNIO SSL 提供了两个 ChannelHandler 来保护数据流:NIOSSLClientHandlerNIOSSLServerHandler。 可以将这些 Handler 添加到 Channel 以保护该通道上的通信。

此外,我们还提供了一些底层原语来配置您的 TLS 连接。 这些将在下面展示。

要保护服务器连接,您需要一个文件中的 X.509 证书链(PEM 或 DER 格式,但 PEM 更容易),以及叶证书的关联私钥。 然后可以将这些对象包装在 TLSConfiguration 对象中,该对象用于初始化 ChannelHandler

例如

let configuration = TLSConfiguration.makeServerConfiguration(
    certificateChain: try NIOSSLCertificate.fromPEMFile("cert.pem").map { .certificate($0) },
    privateKey: .file("key.pem")
)
let sslContext = try NIOSSLContext(configuration: configuration)

let server = ServerBootstrap(group: group)
    .childChannelInitializer { channel in
        // important: The handler must be initialized _inside_ the `childChannelInitializer`
        let handler = NIOSSLServerHandler(context: sslContext)

        [...]
        channel.pipeline.addHandler(handler)
        [...]
    }

对于客户端,这要简单一些,因为不需要证书链或私钥(尽管客户端可能拥有这些东西)。 客户端的设置可以这样做

let configuration = TLSConfiguration.makeClientConfiguration()
let sslContext = try NIOSSLContext(configuration: configuration)

let client = ClientBootstrap(group: group)
    .channelInitializer { channel in
        // important: The handler must be initialized _inside_ the `channelInitializer`
        let handler = try NIOSSLClientHandler(context: sslContext)

        [...]
        channel.pipeline.addHandler(handler)
        [...]
    }

最新版本的 SwiftNIO SSL 支持 Swift 5.6 及更高版本。 以下详细说明了 SwiftNIO SSL 版本支持的最低 Swift 版本

SwiftNIO SSL 最低 Swift 版本
2.0.0 ..< 2.14.0 5.0
2.14.0 ..< 2.19.0 5.2
2.19.0 ..< 2.23.0 5.4
2.23.0 ..< 2.23.2 5.5.2
2.23.2 ... 5.6