16、保障Kitura服务器安全:TLS/SSL加密实践

保障Kitura服务器安全:TLS/SSL加密实践

在当今数字化时代,服务器安全至关重要。如果服务器未受保护,数据传输可能会被拦截和窃取。本文将详细介绍如何使用TLS/SSL协议来保障Kitura服务器的安全,包括使用Charles工具演示HTTP的不安全、创建自签名证书以及在服务器和移动应用中应用这些证书。

1. 认识HTTP的安全风险

在第一次世界大战中,美国利用乔克托族和切罗基族原住民作为密码传话员,用他们鲜为人知的母语传递秘密计划和信息,使敌人无法理解,从而扭转战局。这与互联网数据传输的安全性有相似之处。如果在互联网上的所有交互信息都能被周围的实体理解,那将是非常危险的。

为了直观地展示HTTP在保护数据方面的不足,我们可以使用Charles这个代理工具。它有30天的免费试用版,虽然每次启动有10秒延迟且30分钟后会自动关闭,但足以帮助我们进行演示。你可以从 https://www.charlesproxy.com/ 下载该工具。

安装并打开Charles后,打开网页浏览器并加载几个网页,你会看到Charles拦截了所有的网络连接。点击屏幕中间的“Contents”标签,选择一个你熟悉的连接,比如与github.com API的连接。查看请求内容时,你会发现除了能看到以明文显示的api.github.com外,其他内容很难解读。这是因为只有拥有api.github.com网站的密钥和证书才能解密这些内容。

接下来,我们看看普通的HTTP连接是什么样的。在Xcode中打开EmojiJournalServer项目,构建并运行服务器,确保Charles仍在运行。如果Charles中没有显示localhost的连接,说明系统未设置对localhost流量使用代理,可连接 http://localhost.charlesproxy.com:8080/entries 。在浏览器中打开 http://localhost:8080/entries ,输入用户名和密码(如果按照之前的设置,用户名“bill”和密码“excellent”即可)。输入凭证后,在Charles中搜索该连接并查看内容,你会发现所有信息都是明文显示,这就像在战场上用英语大声喊出作战计划一样,毫无安全性可言。使用Charles拦截这个请求,就相当于黑客进行的中间人攻击。

2. SSL/TLS协议介绍

SSL(Secure Sockets Layer)是Netscape在1995年启动的项目,旨在为HTTP通信提供加密包装。TLS(Transport Layer Security)是从SSL演变而来的协议,用于加密通过互联网传输的数据。在本文中,我们统一使用TLS来指代这个协议。

当客户端(如浏览器)尝试与服务器建立连接时,使用HTTP请求意味着告诉服务器“无需考虑数据传输方式,只需提供数据”,这种方式通常是不安全的。而使用HTTPS请求时,客户端实际上向服务器请求三件事来证明其满足HTTPS要求:
1. 有效的服务器名称
2. 有效的、被认可的证书颁发机构(CA)
3. 与服务器名称关联的公共加密密钥

例如,当你向 https://www.awesomewebsite.com 发送请求时,公共网页可以以明文形式在互联网上传输,但如果需要登录该网站,使用明文传输请求显然不是一个好主意。HTTPS的作用就在于,通过公共加密密钥对请求内容进行加密,服务器使用其私钥解密。这就像客户端和服务器之间使用特定语言进行交流,只有双方能理解。

为了在服务器上启用TLS,需要为服务器创建有效的证书,该证书将隐式携带一对公钥和私钥,分发给向服务器发出请求的客户端。下面我们将创建一个自签名的TLS证书。

3. 使用OpenSSL创建自签名证书

Kitura在Linux上使用OpenSSL框架,在macOS上使用Secure Transport来管理TLS。因此,我们先为Linux创建所需的文件,然后使用内置的OpenSSL工具将其转换为适用于macOS的格式。

目前,Kitura在macOS上接受PKCS#12(.p12)格式,在Linux上支持以下格式:
| 格式 | 说明 |
| ---- | ---- |
| PEM | 公共和私有数据的Base64编码ASCII格式 |
| DER | 公共和私有数据的二进制格式 |
| PKCS#7 | 公共数据的Base64编码ASCII格式 |
| PKCS#12 | 公共和私有数据的二进制格式,可进行密码加密,通常包含证书和密钥数据 |

在终端中,从EmojiJournalServer项目的根目录执行以下命令来生成自签名的TLS证书:
1. 生成2048位的RSA公钥:

openssl genrsa -out key.pem 2048
  1. 创建新的证书签名请求(CSR):
openssl req -new -sha256 -key key.pem -out cert.csr

在回答关于位置的提示时,组织名称可以填写虚构内容,电子邮件和挑战密码可以留空。这里使用SHA256算法创建CSR,SHA256是目前较强的哈希算法之一。哈希算法的作用是将明文转换为加密字符串(哈希值),且任何SHA算法都是单向的,即无法从哈希值中提取原始文本。需要注意的是,2015年谷歌通过哈希碰撞使SHA1算法失效,因此从2015年起,TLS至少需要使用SHA2算法。

  1. 生成有效期为365天的证书:
openssl req -x509 -sha256 -days 365 -key key.pem -in cert.csr -out certificate.pem

这个命令的具体含义如下:
- X.509是公钥证书的标准格式
- 指定证书的有效期为365天
- 使用之前生成的key.pem文件对证书内容进行哈希处理
- 指定CSR和其他有效负载
- 使用 -out 标志指定最终输出文件的名称

执行完上述命令后,使用 ls 命令查看文件夹内容,你会看到生成了certificate.pem文件。

  1. 将.pem文件转换为适用于macOS的PKCS#12文件:
openssl pkcs12 -export -out cert.pfx -inkey key.pem -in certificate.pem

当提示输入导出密码时,使用“emojijournal”。

最后,将生成的证书文件移动到一个方便Kitura服务器加载的位置:

mkdir /tmp/Creds 
cp cert.pfx certificate.pem key.pem /tmp/Creds/

需要注意的是,重启机器后, /tmp/Creds 目录将被清除,因此建议将这些文件保存在安全的地方。

此外,还需要对Dockerfile进行一些修改。打开Dockerfile,找到以下行:

# Bundle application source & binaries 
COPY . /swift-project

在这些行下方添加以下内容:

RUN mkdir /tmp/Creds/ 
COPY cert.pfx certificate.pem key.pem /tmp/Creds/

这样,Dockerfile会将所有证书和密钥文件添加到Linux环境中的类似目录中,确保后续运行时的安全连接。

4. 使用BlueSSLService配置TLS

BlueSSLService是IBM用Swift编写的框架,用于为Kitura服务器设置TLS。它已随Kitura预安装,无需为Swift Package Manager添加额外的依赖项。

在Xcode中打开EmojiJournalServer项目,找到 Sources/Application/Application.swift 文件,滚动到文件底部找到 run 函数。删除以下代码行:

Kitura.addHTTPServer(onPort: cloudEnv.port, with: router)

try postInit() 行下方添加以下代码块,创建一个TLS配置变量并传递给Kitura服务器启动器:

#if os(Linux) 
let certificate = "/tmp/Creds/certificate.pem" 
let keyFile = "/tmp/Creds/key.pem" 
let config = SSLConfig(withCACertificateDirectory: nil, 
                       usingCertificateFile: certificate, 
                       withKeyFile: keyFile, 
                       usingSelfSignedCerts: true) 
#else 
let certificateKeyFile = "/tmp/Creds/cert.pfx" 
let config = SSLConfig(withChainFilePath: certificateKeyFile, 
                       withPassword: "emojijournal", 
                       usingSelfSignedCerts: true) 
#endif 
Kitura.addHTTPServer(onPort: cloudEnv.port, with: router,  
  withSSL: config)

在Linux中可以使用.pem文件,而在macOS中则需要使用PKCS#12格式的文件,因此这里使用了预处理器指令。需要注意的是,在两个操作系统中都指定了证书是自签名的。在TLS/SSL加密中,有效的证书应由被认可的证书颁发机构(CA)签名,而自签名证书不会被列为经过验证的CA,这会使尝试连接服务器的浏览器发出安全警告。

构建并运行服务器,打开网页浏览器访问 https://localhost:8080 ,可能需要强制机器接受自签名证书。接受证书握手后,你就可以使用HTTPS安全地访问服务器了。如果Charles仍处于打开状态,查看请求内容时,你会发现情况有了很大改善。

在下半部分,我们将介绍如何更新移动应用以接受自签名证书,以及后续的一些建议和资源。

保障Kitura服务器安全:TLS/SSL加密实践

5. 更新移动应用以接受自签名证书

在更新移动应用之前,需要先停止在macOS上运行的服务器,并使用Docker运行服务器。执行以下命令:

kitura build
kitura run

在撰写本文时,OpenSSL存在套接字级别的问题,会导致macOS构建的服务器无法接受自签名证书,而通过Docker在Linux上运行服务器可以避免这个问题。

打开EmojiJournal移动应用,找到 EmojiClient.swift 文件,更新 baseURL 如下:

private static var baseURL: String { 
  return "https://localhost:8080" 
}

由于使用的是自签名证书,需要让KituraKit知道可以接受此类证书。在 EmojiClient.swift 类中有六个调用,代码如下:

guard let client = KituraKit(baseURL: baseURL) else { 
  return completion(nil, .couldNotCreateClient) 
}

在每个调用的构造函数中添加一个参数,强制KituraKit接受自签名证书,更新后的代码如下:

guard let client = KituraKit(baseURL: baseURL,  
  containsSelfSignedCert: true) else { 
    return completion(nil, .couldNotCreateClient) 
}

构建并运行应用,当服务器处于运行状态时,KituraKit会处理自签名证书,一切将正常工作。

6. 总结与后续建议

在本文中,我们学习了如何使用TLS/SSL协议来保障Kitura服务器的安全。具体步骤如下:
1. 使用Charles工具演示了HTTP在保护数据方面的不足,它可以轻松拦截HTTP请求,使数据以明文形式暴露。
2. 使用OpenSSL创建了自签名的TLS证书,包括生成RSA公钥、证书签名请求、证书,并将其转换为适用于macOS的格式。
3. 使用BlueSSLService为Kitura服务器配置TLS,确保服务器能够安全地处理HTTPS请求。
4. 更新了移动应用,使其能够接受自签名证书,保证移动应用与服务器之间的安全通信。

以下是整个流程的mermaid流程图:

graph LR
    A[认识HTTP安全风险] --> B[使用Charles工具演示]
    B --> C[SSL/TLS协议介绍]
    C --> D[使用OpenSSL创建自签名证书]
    D --> E[生成RSA公钥]
    D --> F[创建证书签名请求]
    D --> G[生成证书]
    D --> H[转换为macOS格式]
    E --> I[使用BlueSSLService配置TLS]
    F --> I
    G --> I
    H --> I
    I --> J[更新移动应用]
    J --> K[停止macOS服务器]
    J --> L[使用Docker运行服务器]
    J --> M[更新baseURL]
    J --> N[让KituraKit接受自签名证书]
    K --> O[构建并运行应用]
    L --> O
    M --> O
    N --> O

如果你使用Charles检查经过TLS/SSL加密的流量,通过一系列设置和代理SSL根证书,Charles可以检查请求的内容,但看起来与普通的HTTP请求并无不同。这是因为自签名证书使得Charles能够解密所有流量内容。建议你自己尝试一下,观察其中的差异。

互联网上有大量关于设置网站或应用使用TLS/SSL的资源。如果你打算将应用部署到互联网上,可以访问 https://letsencrypt.org https://zerossl.com ,为你的实时服务进行设置。

通过以上步骤,你已经成功地为Kitura服务器和移动应用添加了安全保障。现在,你可以放心地将应用投入使用,享受安全的数据传输带来的便利。

Delphi 12.3 作为一款面向 Windows 平台的集成开发环境,由 Embarcadero Technologies 负责其持续演进。该环境以 Object Pascal 语言为核心,并依托 Visual Component Library(VCL)框架,广泛应用于各类桌面软件、数据库系统及企业级解决方案的开发。在此生态中,Excel4Delphi 作为一个重要的社区开源项目,致力于搭建 Delphi 与 Microsoft Excel 之间的高效桥梁,使开发者能够在自研程序中直接调用 Excel 的文档处理、工作表管理、单元格操作及宏执行等功能。 该项目以库文件与组件包的形式提供,开发者将其集成至 Delphi 工程后,即可通过封装良好的接口实现对 Excel 的编程控制。具体功能涵盖创建与编辑工作簿、格式化单元格、批量导入导出数据,乃至执行内置公式与宏指令等高级操作。这一机制显著降低了在财务分析、报表自动生成、数据整理等场景中实现 Excel 功能集成的技术门槛,使开发者无需深入掌握 COM 编程或 Excel 底层 API 即可完成复杂任务。 使用 Excel4Delphi 需具备基础的 Delphi 编程知识,并对 Excel 对象模型有一定理解。实践中需注意不同 Excel 版本间的兼容性,并严格遵循项目文档进行环境配置与依赖部署。此外,操作过程中应遵循文件访问的最佳实践,例如确保目标文件未被独占锁定,并实施完整的异常处理机制,以防数据损毁或程序意外中断。 该项目的持续维护依赖于 Delphi 开发者社区的集体贡献,通过定期更新以适配新版开发环境与 Office 套件,并修复已发现的问题。对于需要深度融合 Excel 功能的 Delphi 应用而言,Excel4Delphi 提供了经过充分测试的可靠代码基础,使开发团队能更专注于业务逻辑与用户体验的优化,从而提升整体开发效率与软件质量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
# 【实战教程】Pytest从入门到进阶:基于FastAPI的测试开发全指南 13章体系化教程,从Pytest基础到企业级实战,结合FastAPI落地测试方案,附完整可运行代码与最佳实践! ## 核心内容 覆盖环境搭建、用例编写、Fixture系统、参数化测试、覆盖率分析、插件开发、CI/CD集成等13大核心模块,分入门→进阶→高级三阶段学习路径。每章配套FastAPI实战项目(用户认证、电商API、完整电商系统等),测试用例贴合实际业务,支持本地直接运行。聚焦高频难点:Fixture作用域管理、参数化数据源设计、测试并行执行、异常处理、自定义插件开发、覆盖率优化。落地工程化实践:测试目录规范、用例隔离、日志配置、测试报告可视化、CI/CD自动化集成。 ## 技术栈 FastAPI + Pytest + Pydantic + OAuth2/JWT + RESTful API + 测试覆盖率工具 + CI/CD ## 适用人群 Python开发者、测试工程师、后端开发者、DevOps工程师(零基础可入门,有经验可进阶) ## 学习收获 掌握Pytest全流程用法,能独立设计可维护测试体系,实现高覆盖率测试与报告可视化,开发自定义插件,落地TDD与持续集成流程。 ## 快速上手 1. 进入章节目录安装依赖:`pip install fastapi uvicorn pytest fastapi.testclient` 2. 运行应用:`uvicorn app:app --reload`,访问`http://localhost:8000/docs` 3. 执行测试:`python -m pytest test_app.py -v` 配套完整代码、测试用例与配置文件,助力快速落地实际项目!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值