文章目录
密码系统设计
第八周预习报告
学习内容
- 《Windows C/C++加密解密实战》第 12 章
- 课程 mindmap
- 报告内容参考第一周
AI 对学习内容的总结(1分)
要求
- 让AI(kimi,元宝等)阅读学习内容并进行总结,教材内容可以使用微信读书或者云班课电子教材
总结
这份文档是关于SSL-TLS协议编程的教程,主要内容包括SSL协议的规范、优点、发展历史、服务内容、层次结构模型、记录层协议、握手协议层、OpenSSL中的SSL编程以及SSL通信所需的证书准备。以下是文档内容的总结:
1. SSL协议规范
- SSL(Secure Sockets Layer):位于TCP/IP层和应用层之间的中间层协议,提供私有性和可靠性。
- 组成:由SSL记录层协议和高层协议(如握手协议、改变加密规约协议、告警协议等)组成。
- 发展:从SSL v1.0发展到TLS v1.3,TLS v1.3在2018年正式成为标准,改善了握手流程,减少了时延,并采用安全的密钥交换算法。
2. SSL协议的优点
- 与应用层协议无关,提供安全连接。
- 使用对称密钥技术和非对称加密技术保证连接的安全性。
- 通过安全的哈希函数保证数据的完整性。
3. SSL/TLS提供的服务
- 客户方和服务器的合法性认证。
- 对数据进行加密。
- 保证数据的完整性。
4. SSL协议层次结构模型
- 记录层:提供数据封装、压缩、加密等基本功能。
- 握手协议层:在数据传输前进行身份认证、协商加密算法、交换加密密钥等。
5. SSL记录层协议
- 分段、压缩、加密和传输数据。
6. SSL握手协议层
- 客户端和服务器通过握手协议完成身份认证和密钥交换。
7. OpenSSL中的SSL编程
- OpenSSL实现了SSL/TLS协议,提供了SSL_connect、SSL_accept、SSL_write、SSL_read等函数进行安全编程。
- 介绍了初始化SSL算法库、设置SSL证书和私钥、创建SSL结构、启动TLS/SSL握手等函数的使用方法。
8. 准备SSL通信所需的证书
- 描述了如何搭建CA环境、创建根CA证书、生成服务端和客户端的证书请求文件以及签发证书的过程。
9. 实战SSL网络编程
- 提供了一个SSL服务端和客户端通信的示例程序,展示了如何使用OpenSSL库进行SSL通信。
整体而言,这份文档是一个关于SSL-TLS协议及其在网络编程中应用的详细指南,涵盖了理论知识和实践操作,适合有一定网络编程基础的读者学习和参考。
对 AI 总结的反思与补充(2分)
要求
- AI总结的问题
- 自己的补充
反思与补充
以下是对上述总结的补充与反思:
补充
- SSL协议规范
- 协议版本细节:
- SSL v1.0由网景公司在1994年提出但未公开。SSL v2.0于1995年公开发布,2011年弃用。SSL v3.0在1996年发布,2015年弃用。TLS v1.0于1999年被IETF纳入标准化,是由SSL v3.0改名而来且改动不大。TLS v1.1在2006年提出,修复了一些Bug并支持更多参数。TLS v1.2在2008年提出,有更多扩展和算法改进,是目前大多数新设备的标配。
- TLS v1.3的发展过程较为复杂,2014年提出,2016年开始草案制定,由于要考虑与v1.2的兼容性,经过多次修改直到2018年第28个草案才正式纳入标准,它改善了握手流程,减少了时延,并采用安全的密钥交换算法。
- 协议层次结构细节:
- 记录层协议:建立在可靠的传输协议(如TCP)之上,定义了4种记录层协议的调用者(握手协议、告警协议、加密修改协议、应用程序数据协议),还可对其他记录类型支持(需分配类型标志)。它把要传送的数据进行分段、压缩、加密传送,对输入数据进行解密、解压、校验后传送给上层调用者。它可为SSL连接提供保密性业务和消息完整性业务。
- 握手协议层:
- 握手协议:产生会话状态的密码参数。SSL客户端和服务器通信时,协商协议版本,选择密码算法验证彼此,使用公开密钥加密技术产生共享密钥。握手过程包括客户端和服务器交换信息、验证证书合法性、产生和交换对称密码等步骤。
- 更换加密规约协议:只有一个字节的数值消息,用于及时通知密码策略,传输使用当前加密约定加密和压缩,在客户端和服务器都会发出,服务器在成功处理密钥交换消息后发送。
- 告警协议:传送消息的严重程度和描述,致命告警会导致连接立即终止,包括关闭告警和多种错误告警(如意外消息告警、记录MAC错误告警等)。
- 协议版本细节:
- SSL协议的优点
- 安全连接特性:连接安全方面,初始化握手后协商秘密密钥,数据加密使用对称密钥技术(如DES、RC4等);身份认证使用非对称(公钥)加密技术(如RSA、DSA等);连接可靠是因为传输数据包含完整性校验码,使用安全的哈希函数(如SHA、MD5等)计算。
- SSL/TLS提供的服务
- 合法性认证细节:客户方和服务器都有各自的证书,通过交换证书获取对方公钥进行身份认证。
- 数据加密细节:在安全连接建立前,先用非对称算法加密握手信息和进行对称算法密钥交换,安全连接建立后,用对称算法加密数据。
- 数据完整性细节:采用消息摘要函数(MAC)提供数据完整性服务。
- OpenSSL中的SSL编程
- 函数介绍补充:
- SSL_library_init函数:用于初始化SSL算法库,在调用SSL系列函数之前必须先调用此函数,执行成功返回1,否则返回0,也可用相关宏定义替代。
- SSL_CTX_new函数:用于初始化SSL_CTX结构体,设置SSL协议算法及版本,支持多种算法(如SSL v2.0、SSL v3.0、TLS v1.0等的客户端和服务端算法),执行成功返回SSL_CTX结构体指针,否则返回NULL。
- SSL_CTX_free函数:释放SSL_CTX结构体,与SSL_CTX_new配套使用。
- SSL_CTX_use_certificate_file函数:以文件形式设置SSL证书,用于服务端设置服务器证书,客户端设置客户端证书,支持PEM和ASN1两种格式,执行成功返回1,否则返回0。
- SSL_CTX_use_certificate函数:以结构体方式设置SSL证书,执行成功返回1,否则返回0。
- SSL_CTX_use_PrivateKey_file函数:以文件形式设置SSL私钥,支持PEM和ASN1两种格式,执行成功返回1,否则返回0。
- SSL_CTX_use_PrivateKey函数:以结构体方式设置SSL私钥,执行成功返回1,否则返回0。
- SSL_CTX_check_private_key函数:检查私钥和证书是否匹配,需在设置私钥和证书后调用,匹配成功返回1,否则返回0。
- SSL_new函数:申请一个SSL套接字,创建新的SSL结构,继承底层上下文等设置,执行成功返回SSL结构体指针,否则返回NULL。
- SSL_free函数:释放由SSL_new建立的SSL结构体,内部会减少引用计数并删除结构,引用计数为0时释放内存。
- SSL_set_fd函数:设置SSL套接字为读写套接字,执行成功返回1,否则返回0。
- SSL_set_rfd函数:设置SSL套接字为只读套接字,执行成功返回1,否则返回0。
- SSL_set_wfd函数:设置SSL套接字为只写套接字,执行成功返回1,否则返回0。
- SSL_connect函数:发起SSL连接,即启动与TLS/SSL服务器的TLS/SSL握手,执行成功返回1,否则返回0。
- SSL_accept函数:用在服务端,接受客户端的SSL连接,执行成功返回1表示TLS/SSL握手成功,返回0表示握手不成功但已关闭,小于0表示握手失败,可调用SSL_get_error()找出原因。
- SSL_get_peer_certificate函数:获取对方的X509证书,根据协议定义TLS/SSL服务端将始终发送证书(如果存在),只有在服务端明确请求时客户端才会发送证书,使用匿名密码不发送证书,执行成功返回对方证书结构体指针,否则返回NULL,若证书不指示验证状态信息,需用SSL-get-verify-result检查验证状态,使用后需显式释放证书对象。
- SSL_write函数:将缓冲区数据写入指定的SSL连接,返回值大于0表示实际写入长度,等于0表示写入操作未成功(可能是基础连接已关闭),小于0表示写入操作未成功(可能是发生错误或需执行某个操作),可调用SSL_get_error()查明原因。
- SSL_Read函数:从指定的SSL连接中读取数据,返回值大于0表示读取操作成功且为实际读取长度,等于0表示读取操作未成功(可能是对方发送关闭通知警报或底层传输关闭),小于0表示读取操作未成功(可能是发生错误或需执行某个操作),可调用SSL_get_error()找出原因。
- 函数介绍补充:
- 准备SSL通信所需的证书
- 实验环境细节:严格应准备三台安装Windows系统的计算机(CA端、服务端、客户端),但为方便实验可在一台物理机上完成所有证书签发工作。
- CA环境细节:CA通过OpenSSL实现,编译安装OpenSSL1.0.2m后,在C:\myOpenss\outssl下有配置文件openssl.cnf,可通过编辑软件查看其内容了解CA环境。
- 文件创建细节:根据CA配置文件,需在C:\myOpenssl\out\bin下新建文件夹demoCA,在demoCA下建立子文件夹newcerts,新建两个文本文件index.txt和serial并在serial中输入01。
- 证书创建过程细节:
- 根CA证书创建:
- 首先生成私钥文件(genrsa -des3 -out root.key 1024),采用3DES加密,输入保护口令,生成的私钥文件是Base64编码的PEM格式。
- 然后可选择生成根证书签名请求文件(req -new -key root.key -out root.csr)或自签根证书(req -new -x509 -key root.key -out root.crt),自签根证书时需输入证书信息(如国家名、组织名等)。
- 服务端证书创建:
- 先生成服务端私钥(genrsa -des3 -out server.key 1024),再生成证书请求文件(req -new -key server.key -out server.csr),输入相关信息,最后签发证书(ca -in server.csr -out server.crt -keyfile root.key -cert root.crt -days 365 -config…/ssl/openssl.cnf)。
- 客户端证书创建:
- 生成客户端私钥(genrsa -des3 -out client.key 1024),再生成证书请求文件(req -new -key client.key -out client.csr),输入相关信息,最后签发证书(ca -in client.csr -out client.crt -keyfile root.key -cert root.crt -days 365 -config…/ssl/openssl.cnf)。
- 根CA证书创建:
- 实战SSL网络编程
- 示例程序细节:
- 服务端程序:
- 首先进行一系列初始化操作,包括WSAStartup、SSL_load_error_strings、OpenSSL_add_ssl_algorithms等,设置协议版本为TLS v1.0(TLSv1_server_method),初始化SSL_CTX结构体,设置验证方式并加载CA证书,设置证书和私钥文件,检查私钥和证书是否匹配,设置加密算法列表。
- 然后进行正常的TCP Socket过程,创建套接字、绑定端口、监听连接、接受连接,接着进行SSL过程,创建SSL套接字、设置读写套接字、接受SSL连接,打印加密算法信息和服务端的证书信息(如果有),进行数据交换(SSL_read和SSL_write),最后进行收尾工作(shutdown、SSL_free和SSL_CTX_free)。
- 客户端程序:
- 同样进行初始化操作,设置协议版本为TLS v1.0(TLSv1_client_method),初始化SSL_CTX结构体,设置验证方式并加载CA证书,设置证书和私钥文件,检查私钥和证书是否匹配,构建随机数生成机制。
- 接着进行正常的TCP Socket过程,创建套接字、连接服务器,然后进行SSL握手过程,创建SSL套接字、设置读写套接字、发起SSL连接,打印加密算法信息和服务端的证书信息(如果有),进行数据交换(SSL_write和SSL_read),最后发送SSL/TLS关闭通知,进行收尾工作(shutdown、SSL_free和SSL_CTX_free)。
- 服务端程序:
- 示例程序细节:
反思
- 内容完整性
- 文档内容较为全面,涵盖了SSL/TLS协议的各个方面,从理论基础到实际编程应用都有详细介绍。但对于一些高级应用场景或与其他安全协议的比较方面可以进一步补充,以便读者更好地理解SSL/TLS协议在实际网络安全环境中的地位和作用。
- 难度层次
- 对于有一定网络编程基础的读者来说,文档的难度适中。但对于初学者来说,可能会在一些概念理解和函数使用上遇到困难。例如,证书的创建和配置过程涉及到较多的命令行操作和参数设置,如果能增加一些图形化界面的示例或者更详细的步骤解释,可能会更有助于初学者理解。
- 实践指导
- 实战部分提供了服务端和客户端的示例程序,这对于读者理解如何使用OpenSSL库进行SSL通信非常有帮助。然而,可以进一步增加一些错误处理和调试方面的指导,例如当出现证书不匹配、握手失败等常见问题时,如何更快速准确地定位问题并解决。
学习思维导图(2分)
要求
- Mermaid 代码与截图(参考Mermaid MindMap语法)或者提交思维导图链接(如果使用线上编辑器,推荐processon,xmind,…)
代码
mindmap
root((第八周预习报告SSL-TLS编程))
SSL协议规范
什么是SSL协议
安全套接层
位于TCP/IP层和应用层之间
提供私有性和可靠性
SSL协议组成
SSL记录层协议
(握手协议/改变加密规约协议/告警协议等)
SSL协议发展历史
SSL v1.0到TLS v1.3
TLS v1.3改善握手流程和安全性
SSL协议优点
与应用层协议无关
提供安全连接
使用对称和非对称加密技术
保证数据完整性
SSL协议发展
客户方和服务器的合法性认证
对数据进行加密
保证数据的完整性
SSL提供的服务
记录层
数据封装/压缩/加密
握手协议层
身份认证/协商加密算法/交换加密密钥
OpenSSL中的SSL编程
初始化SSL算法库
设置SSL证书和私钥
创建SSL结构
启动TLS/SSL握手
准备SSL通信所需的证书
搭建CA环境
创建根CA证书
生成服务端和客户端证书请求文件
签发证书
实战SSL网络编程
SSL服务端和客户端通信示例
使用OpenSSL库进行SSL通信
::icon(fa fa-book)
上面mermaid实际效果,vscode中可以预览:
思维导图
基于 AI 的学习(2分)
要求
- 至少找到自己理解不是太好 2 个概念,让 AI 对自己进行苏格拉底提问
- 参考下面提示语或者使用 AI Agent
提示词:“我在学习XXX知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”
- 核心是要求AI工具:“请你以苏格拉底的方式对我进行提问”
- 然后AI工具就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”
- 如果你觉得差不多了,可以先问问AI工具:“针对我XXX知识点,我理解了吗?”
- AI工具会给出它的判断,如果你也觉得自己想清楚了,可以最后问AI工具:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。
学习内容
学习实践过程遇到的问题与解决方式(AI 驱动,优先使用AI工具解决问题)(2分)
至少两个
-
- 理解SSL/TLS协议的复杂性
问题:
- 理解SSL/TLS协议的复杂性
SSL/TLS协议涉及许多复杂的概念,如握手协议、加密算法、证书和密钥交换等,初学者可能会感到困惑。
解决方式:
分步骤学习:将学习过程分解成小块,逐步掌握每个概念。
实践操作:通过实际编写代码和运行示例来加深理解。
使用图解和示例:利用图解和示例代码来帮助理解抽象的概念。
-
- OpenSSL编程中的技术挑战
问题:
- OpenSSL编程中的技术挑战
在使用OpenSSL进行编程时,可能会遇到编译错误、运行时错误或者握手失败等问题。
解决方式:
阅读官方文档:OpenSSL的官方文档提供了详细的函数说明和使用示例,是解决问题的重要资源。
加入社区和论坛:参与OpenSSL社区和论坛,与其他开发者交流经验和解决方案。
调试和日志记录:使用调试工具和日志记录来诊断问题,特别是在处理复杂的握手失败和连接问题时。
更新和补丁:确保使用的OpenSSL库是最新版本,以利用最新的安全修复和性能改进。
作业提交要求(1分)
- 提交Markdown 文件,文档命名“学号姓名《密码系统设计》.md”
- 提交Markdown 文件转为 PDF,文档命名“学号姓名《密码系统设计》第 X 周.pdf”
- 提交代码托管链接(可选):学号姓名 gitee(github) 链接
- 内容质量高有加分
参考资料
- AI工具(你使用的AI工具及其链接)
- 图书
- 网站