首页 > 其他分享 >ios 之 netty版本swiftNio(TLSHandler 创建)

ios 之 netty版本swiftNio(TLSHandler 创建)

时间:2024-04-07 13:32:08浏览次数:26  
标签:TLS netty 协议 ios let swiftNio configurationClient 服务器 客户端

SwiftNio 简介

用于高性能协议服务器和客户端的事件驱动、无阻塞的网络应用程序框架。

SwiftNIO是一个跨平台异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。
这就像Netty,但是为Swift写的。

Xcode引入swiftNio

        在实际写代码前,我们需要把 SwiftNIO 加入我们的项目。我这里都是创建的 Swift Package 项目并通过 SwiftPM 添加依赖的。在 Xcode 的创建项目页面中,选择 Multiplatform 中的 Swift Package。在swiftNio中选择自己需要的库,他的库分别为

TLS简介

        传输层安全性协议(英语:Transport Layer Security,缩写作TLS),及其前身安全套接层(Secure Sockets Layer,缩写作SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。网景公司(Netscape)在1994年推出首版网页浏览器,网景导航者时,推出HTTPS协议,以SSL进行加密,这是SSL的起源。IETF将SSL进行标准化,1999年公布第一版TLS标准文件。随后又公布RFC 5246 (2008年8月)与RFC 6176(2011年3月)。在浏览器、邮箱、即时通信、VoIP、网络传真等应用程序中,广泛支持这个协议。主要的网站,如Google、Facebook等也以这个协议来创建安全连线,发送数据。目前已成为互联网上保密通信的工业标准。

        TLS协议采用主从式架构模型,用于在两个应用程序间透过网络创建起安全的连接,防止在交换数据时受到窃听及篡改。
        TLS协议的优势是与高层的应用层协议(如HTTP、FTP、Telnet等)无耦合。应用层协议能透明地运行在TLS协议之上,由TLS协议进行创建加密通道需要的协商和认证。应用层协议传送的数据在通过TLS协议时都会被加密,从而保证通信的私密性。
        TLS协议是可选的,必须配置客户端和服务器才能使用。主要有两种方式实现这一目标:一个是使用统一的TLS协议通信端口(例如:用于HTTPS的端口443);另一个是客户端请求服务器连接到TLS时使用特定的协议机制(例如:邮件、新闻协议和STARTTLS)。一旦客户端和服务器都同意使用TLS协议,他们通过使用一个握手过程协商出一个有状态的连接以传输数据。通过握手,客户端和服务器协商各种参数用于创建安全连接:
当客户端连接到支持TLS协议的服务器要求创建安全连接并列出了受支持的密码组合(加密密码算法和散列算法),握手开始;
        服务器从该列表中决定加密算法和散列算法,并通知客户端;
服务器发回其数字证书,此证书通常包含服务器的名称、受信任的证书颁发机构(CA)和服务器的公钥;
        客户端验证其收到的服务器证书的有效性;
为了生成会话密钥用于安全连接,客户端使用服务器的公钥加密随机生成的密钥,并将其发送到服务器,只有服务器才能使用自己的私钥解密;
        利用随机数,双方生成用于加密和解密的对称密钥。这就是TLS协议的握手,握手完毕后的连接是安全的,直到连接(被)关闭。如果上述任何一个步骤失败,TLS握手过程就会失败,并且断开所有的连接

SwiftNio TLS创建

        在swiftNio 创建一个NIOSSLHandler,首先准备好证书PEM(可以由openSSL 生成证书),然后绑定证书。(根证书ca,客户端证书,客户端端key)

  /**
     创建contextSSL
     */
    public func createSSL(address : String, env:String)->NIOSSLHandler{
        
        let caPath = Bundle.main.path(forResource: "ca_\(env)", ofType:".crt") ??  ""
        let clientPath = Bundle.main.path(forResource: "client_\(env)", ofType:".crt") ??  ""
        let clientKey = Bundle.main.path(forResource: "clientkey_\(env)", ofType:".pem") ??  ""
        
        var configurationClient =  TLSConfiguration.makeClientConfiguration();
//        configurationClient.cipherSuiteValues = [.TLS_RSA_WITH_AES_256_CBC_SHA]
//        configurationClient.signingSignatureAlgorithms = [.rsaPkcs1Sha256]
//        configurationClient.verifySignatureAlgorithms = [.rsaPkcs1Sha256]
        
        configurationClient.certificateChain = try! NIOSSLCertificate.fromPEMFile(clientPath).map{.certificate($0)}

        configurationClient.privateKey = .file(clientKey)
        
        let trustRoot = try! NIOSSLCertificate.fromPEMFile(caPath)
        configurationClient.trustRoots = NIOSSLTrustRoots.certificates([trustRoot[0]])
        
        let sslContext = try! NIOSSLContext(configuration: configurationClient)
        
        let sslHandler = try! NIOSSLClientHandler(context:sslContext, serverHostname:address)
         
        return sslHandler
    }

socket 绑定TLS

        在上一篇章的ios 之 netty版本swiftNio(socket创建)基础上绑定新创建的TLS。在之前的handler 新增一个sslHandler。

let sslHandler = self!.createSSL(address: address, env:self!.envNum)
                    return  channel.pipeline.addHandler(sslHandler).flatMap({
                        channel.pipeline.addHandler(self!.readHanddle!)
                    }) // Fallback on earl

标签:TLS,netty,协议,ios,let,swiftNio,configurationClient,服务器,客户端
From: https://blog.csdn.net/karision/article/details/137328497

相关文章

  • 关于Axios的异域问题
    需要建一个类,在类中修改需要访问的前端端口: 代码如下:importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.cors.CorsConfiguration;importorg.springframework.web.cors.UrlB......
  • 面试常问问题——ios测试和安卓测试的区别
    1.Android长按home键呼出应用列表和切换应用,然后右滑则终止应用; 2.多分辨率测试,Android端20多种,ios较少; 3.手机操作系统,Android较多,ios较少且不能降级,只能单向升级;新的ios系统中的资源库不能完全兼容低版本中的ios系统中的应用,低版本ios系统中的应用调用了新的资源库,会直接......
  • 折腾PXE网络启动 pxe 双引导bios&uefi模式 WDS windows deployment server
    简介:这才是最终章。折腾这么多,其实还是为了WDS。折腾TFTPD引导bios,是为了确认引导文件可以引导maxdos。折腾TFTPD引导uefi,也是为了确认可以引导grub。折腾OPENWRT双引导bios和UEFI,是为了确认DHCPoption93。现在我们有了可以双引导的TFTP-ROOT目录,虽然只有4个文件,这足够我......
  • 折腾PXE网络启动 pxe 双引导bios&uefi模式 OPENWRT
    简介:前两篇已经折腾了pxe引导bios和uefi,甭管启动的是啥,已经可以网络引导了。但是同时面对这两种系统的时候怎么办?需要通过dhcp的参数来控制谁启动什么。核心内容RFC4578:DynamicHostConfigurationProtocol(DHCP)OptionsfortheIntelPrebooteXecutionEnvironment(......
  • axios快速入门
    一、环境配置1.1概述上古浏览器页面在向服务器请求数据时,因为返回的是整个页面的数据,页面都会强制刷新一下,这对于用户来讲并不是很友好。并且我们只是需要修改页面的部分数据,但是从服务器端发送的却是整个页面的数据,十分消耗网络资源。而我们只是需要修改页面的部分数据,也......
  • axios的理解和使用
    axios中文文档 https://www.axios-http.cn/docs/intro是什么前端最流行的ajax请求库react/vue官方都推荐使用axios发ajax请求 特点基本promise的异步ajax请求库浏览器端/node端都可以使用支持请求/响应拦截器支持请求取消请求/响应数据转换批量发送多个请求常用语法......
  • 苹果电脑(Mac os系统)和iPhone手机(ios系统)实现发送iMessages短信的全部方式
    一、iphone手机(IOS系统)上群发总结为以下几种方式/*经测试,使用iphone手机进行iMessage群发分越狱和免越狱版,越狱版可以做到通过修改序列号来达到无限次数更换ID,免越狱iphone只可以做到大约60、70次更换ID此后将无法再更换ID。*/1、通过iphone手机上自带的快捷指令,来代替人工......
  • axios 常见状态码
    '100':'Continue','101':'SwitchingProtocols','102':'Processing','103':'EarlyHints','200':'Ok','201':'Created&......
  • vue axios sessionID 每次请求都不同的解决方式
    前端:        后端:注意:配置 allowedOrigins时,如果写的是http://localhost/,而请求的源地址是127.0.0.1。虽然它们通常指向同一台本地计算机,但在CORS规则中被视为不同的源。需更新更新allowedOrigins列表,将现有条目http://localhost:5174替换为http://127.......
  • 苹果电脑版(Mac os)系统和iphone(IOS系统)手机发送imessages短信的全部方式
    一、iphone手机(IOS系统)上群发总结为以下几种方式/*经小编通过测试,使用iphone手机进行iMessage群发分越狱和免越狱版,越狱版可以做到通过修改序列号来达到无限次数更换ID,免越狱iphone只可以做到大约60、70次更换ID此后将无法再更换ID。*/1、通过iphone手机上自带的快捷指令,来......