保障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
- 创建新的证书签名请求(CSR):
openssl req -new -sha256 -key key.pem -out cert.csr
在回答关于位置的提示时,组织名称可以填写虚构内容,电子邮件和挑战密码可以留空。这里使用SHA256算法创建CSR,SHA256是目前较强的哈希算法之一。哈希算法的作用是将明文转换为加密字符串(哈希值),且任何SHA算法都是单向的,即无法从哈希值中提取原始文本。需要注意的是,2015年谷歌通过哈希碰撞使SHA1算法失效,因此从2015年起,TLS至少需要使用SHA2算法。
- 生成有效期为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文件。
- 将.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服务器和移动应用添加了安全保障。现在,你可以放心地将应用投入使用,享受安全的数据传输带来的便利。
超级会员免费看

被折叠的 条评论
为什么被折叠?



