安全和网络是当今软件的基本特征。现代互联网充斥着蠕虫、特洛伊木马、中间人和其他威胁。这就是为什么维护安全比以往任何时候都更重要。
OpenSSL是互联网上使用最广泛、最重要的开源项目之一。如果你是一名软件开发人员、系统管理员、网络安全工程师或DevOps专家,你可能在过去偶然发现了这个工具集——但你如何最大限度地利用它呢?在本书的帮助下,您将学习OpenSSL最重要的功能,并深入了解其全部潜力。
本书包含对基本密码学和网络安全概念的逐步解释,以及说明这些概念使用的实际示例。您将从学习基础知识开始,例如如何执行对称加密和计算消息摘要。接下来,您将了解更多关于密码学的知识:MAC和HMAC、公钥和私钥以及数字签名。随着学习的深入,您将探索使用X.509证书、公钥基础设施和TLS连接的最佳实践。
在本书结束时,您将能够使用OpenSSL最流行的功能,允许您在应用程序和网络基础设施中实现加密和TLS。
本书面向软件开发人员、系统管理员、DevOps专家、网络安全工程师和分析师,或任何希望保护其应用程序和基础设施安全的人。软件开发人员将学习如何使用OpenSSL库为他们的软件提供加密和TLS。DevOps专业人员和系统管理员将学习如何在命令行上使用密码和证书,以及如何为他们的组织设置迷你CA。需要对安全和网络有基本的了解。
第1章,OpenSSL和其他SSL/TLS库,OpenSSL and Other SSL/TLS Libraries
将概述OpenSSL是什么,它的优势是什么,并了解OpenSSL的历史以及OpenSSL 3.0中的新功能。我们还将把OpenSSL与其他SSL/TLS库进行比较。
第2章,对称加密和解密,Symmetric Encryption and Decryption
将介绍对称加密中的重要概念——密码(ciphers)、加密模式(encryption modes)和填充(padding)。我们将概述现代密码、加密模式和填充类型,并推荐在哪种情况下使用哪种技术。这些技术的使用将通过命令行和C代码示例进行说明。
第3章,消息摘要,Message Digests
将探讨为什么需要消息摘要(也称为加密哈希,cryptographic hashes)以及在哪里使用它们。我们将概述计算消息摘要的现代加密哈希函数,并建议在哪种情况下使用哪种哈希函数。消息摘要的计算将通过命令行和C代码示例进行说明。
第4章,MAC和HMAC
将解释为什么需要消息认证码(Message Authentication Codes,MACs)以及在哪里使用它们。由于它是一种流行的MAC类型,因此将讨论基于哈希的MAC(Hash-based MAC,HMAC)。我们还将学习如何将HMAC与加密相结合,以及密码末日原理。HMAC的计算将通过代码示例进行说明。
第5章,从密码推导加密密钥,Derivation of an Encryption Key from a Password
将说明为什么密码本身不能用于加密,以及为什么需要密钥推导。我们将概述现代密钥推导函数,并建议何时使用哪种函数。然后,将通过命令行和C代码示例说明加密密钥的推导。
第6章,非对称加密和解密,Asymmetric Encryption and Decryption
将深入探讨为什么需要非对称加密,它是如何工作的,以及如何使用私钥和公钥来实现加密和解密。使用RSA的加密和解密将通过命令行和C代码示例进行说明。
第7章,数字签名及其验证,Digital Signatures and Their Verification
将阐明为什么需要数字签名以及在哪里使用数字签名。我们将概述现代数字签名算法,如RSA、ECDSA和EdDSA,并建议在哪种情况下使用哪种数字签名方案。数字签名和签名验证将通过命令行和C代码示例进行说明。
第8章,X.509证书和PKI,X.509 Certificates and PKI
将详细介绍X.509证书是什么,为什么需要它们,以及在哪里使用它们。我们还将解释证书如何签署其他证书以及证书签名链是如何形成的,以及什么是公钥基础设施(Public Key Infrastructure,PKI)以及如何使用证书验证来验证身份,例如网站的身份。上述技术的使用将通过命令行和C代码示例进行说明。
第9章,建立TLS连接并通过它们发送数据,Establishing TLS Connections and Sending Data over Them
将分解TLS协议是什么,为什么需要它,以及为什么它被如此广泛地使用。我们还将了解SSL和TLS之间的区别。然后,我们将学习如何建立和关闭TLS连接,以及如何通过TLS发送和接收数据。使用TLS将通过命令行和C代码示例进行说明。
第10章,在TLS中使用X.509证书,Using X.509 Certificates in TLS
将详细介绍如何在TLS中处理X.509证书,以及为什么证书对TLS很重要。我们还将学习如何验证远程证书。然后,我们将学习如何使用CRL和OCSP进一步检查证书有效性。最后,我们将学习如何使用客户端证书。使用证书将通过命令行和C代码示例进行说明。
第11章,TLS的特殊用法,Special Usages of TLS
将研究TLS的特殊用途:TLS固定,使用非阻塞网络模式,以及使用OpenSSL基本输入输出对象(Basic Input-Output Objects,BIO)在非标准套接字或特殊网络层上的TLS连接。上述技术的使用将通过C代码示例进行说明。
第12章,运行迷你CA,Running a Mini-CA
将指导您如何运行自己的迷你CA,以控制证书并将PKI构建到组织中。运行迷你CA将通过示例配置文件和命令进行说明。
您必须在计算机上安装OpenSSL才能运行命令行和C代码示例。如果你还没有安装它,【第2章“对称加密和解密”】将帮助你安装。要构建C代码示例,你需要一个兼容C11的C编译器和一个链接器。您必须按照各自的文档安装这些开发工具。所有示例都已在Kubuntu Linux 22.04上使用上述Linux发行版中的GNU C编译器、GNU Linker(LD)和GNU Make进行了测试。其他开发工具,如LLVM Clang或Microsoft Visual C++,也应与本书中的代码示例兼容。
系统需求
如果您使用的是本书的数字版本,我们建议您自己键入代码或从本书的GitHub存储库访问代码(下一节提供了链接)。这样做将帮助您避免与复制和粘贴代码相关的任何潜在错误。
虽然对OpenSSL功能和代码示例的解释有时非常详细,但这本书旨在提供指导,而不是取代OpenSSL文档。如果您想了解本书未涵盖的OpenSSL功能的详细信息,请随时查阅OpenSSL文档、OpenSSL源代码,或者使用OpenSSL尝试自己的代码!
您可以从GitHub下载本书的示例代码文件,网址为 https://github.com/PacktPublishing/Demystifying-Cryptography-with-OpenSSL-3 。如果代码有更新,它将在GitHub存储库中更新。
我们还有丰富的书籍和视频目录中的其他代码包,请访问 https://github.com/PacktPublishing/ 。看看他们!
我们还提供了一个PDF文件,其中包含本书中使用的屏幕截图和图表的彩色图像。您可以在此处下载:https://packt.link/c0WEO 。
本书中使用了许多文本约定。
Code in text:表示文本中的码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入和Twitter句柄。下面是一个示例:“SSH user public keys are pinned on the server in the authorized_keys file.”
代码块设置如下:
xxxxxxxxxx
d_server_cert)
X509_free(pinned_server_cert);
if (pinned_server_cert_file)
fclose(pinned_server_cert_file);
任何命令行输入或输出编写如下:
xxxxxxxxxx
$ ./tls-server 4433 server_keypair.pem server_cert.pem *** Listening on port 4433
Bold:表示一个新术语、一个重要单词或您在屏幕上看到的单词。例如,菜单或对话框中的单词以粗体显示。这里有一个例子:“Reduced maintenance because you don’t need to make a Certificate Signing Request (CSR) and communicate with a CA. You can even use a self-signed certificate.(减少了维护,因为您不需要发出证书签名请求(CSR)并与CA通信。您甚至可以使用自签名证书。)”
无关紧要。