SwiftNIO SSL
SwiftNIO SSL是一个Swift包,它包含了一个基于BoringSSL实现的TLS的版本。这个包允许使用SwiftNIO的协议客户端和服务器,它们能够用TLS来保护传输中的数据。
这个名字主要受到该包使用的库(BoringSSL)的名字的启发,并不是因为我们不知道协议的名字。我们知道协议就是TLS!
要开始使用,请查看API文档。
使用SwiftNIO SSL
SwiftNIO SSL提供了两个ChannelHandler
来确保数据流的流量安全:NIOSSLClientHandler
和 NIOSSLServerHandler
。这些都可以添加到Channel
中,以确保该通道上的通信安全。
此外,我们还提供了一些低级原语来配置TLS连接。这些内容将在下面展示。
为了确保服务器连接的安全,你需要在文件中有一个X.509证书链(可以是PEM或DER格式,但PEM通常更容易),以及与叶证书关联的私钥。然后,这些对象可以包装在用于初始化ChannelHandler
的TLSConfiguration
对象中。
例如
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 = try 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.2和以上的版本。2.13.x和以前的版本支持Swift 5.0和5.1。