第八周预习作业

第八周预习作业


20221407姚博茗

AI总结

第十二章主要介绍了 SSL 协议规范、OpenSSL 中的 SSL 编程、SSL 函数以及 SSL 通信所需证书的准备和实战 SSL 网络编程,具体内容如下:
SSL 协议规范
定义与优点:SSL 协议基于公开密钥技术,可保证两个实体间通信的保密性和可靠性,是 Internet 上保密通信的工业标准。其优点包括支持多种加密算法、能进行身份认证、保证数据完整性和保密性等。
发展历程:SSL 协议不断发展,SSL v3/TLS 提供了多种服务,其协议层次结构包括记录层协议和握手协议层等。
OpenSSL 中的 SSL 编程:OpenSSL 实现了 SSL 协议,应用程序可通过多种方式调用其加密库,使用时需加载 Engine 模块,以降低应用开发难度。
SSL 函数
初始化函数:如 SSL_library_init 用于初始化 SSL 算法库,SSL_CTX_new 用于初始化 SSL 上下文环境变量。
设置证书函数:包括文件形式和结构体方式设置 SSL 证书及私钥的函数,如 SSL_CTX_use_certificate_file、SSL_CTX_use_PrivateKey 等,同时需检查私钥和证书是否匹配。
创建和操作 SSL 套接字函数:SSL_new 用于创建 SSL 结构,SSL_set_fd 用于设置读写套接字,SSL_connect 用于建立 SSL 连接,SSL_write 和 SSL_read 用于数据读写。
准备 SSL 通信所需证书
实验环境准备:包括创建所需文件、生成根 CA 的证书、服务端和客户端的证书请求文件等。
证书签发:根 CA 为服务端和客户端签发证书。
实战 SSL 网络编程:通过具体示例展示了 SSL 网络编程的流程,包括创建 SSL 上下文、加载证书和私钥、建立 SSL 连接、进行数据传输等步骤

AI总结的问题

AI对于SSL函数的解释不够清晰

下面进行进一步的阐述

询问AI

SSL 函数是在 SSL/TLS 协议编程中用于实现安全通信的一系列函数,这些函数主要在 OpenSSL 库中提供,涵盖了从初始化 SSL 环境到进行数据加密传输和连接管理等多个方面的功能。
初始化函数
SSL_library_init 函数
功能:用于初始化 SSL 算法库,这是使用 SSL 相关功能的第一步,确保库中的各种算法和数据结构准备就绪。
参数与返回值:无参数,函数执行成功返回 1,失败返回 0。
SSL_CTX_new 函数
功能:初始化 SSL 上下文环境变量,为后续的 SSL 连接和配置提供基础环境。
参数与返回值:无参数,返回一个指向 SSL_CTX 结构体的指针,该指针用于后续的 SSL 配置操作。如果创建上下文失败,则返回 NULL。
设置证书函数
SSL_CTX_use_certificate_file 函数(文件形式设置证书)
功能:从文件中加载 SSL 证书到 SSL 上下文环境中,证书文件通常包含服务器或客户端的公钥等信息,用于身份认证。
参数与返回值:参数包括 SSL_CTX 结构体指针、证书文件名和文件格式(如 PEM 或 DER)。函数执行成功返回 1,失败返回 0。
SSL_CTX_use_PrivateKey_file 函数(文件形式设置私钥)
功能:从文件中加载与证书对应的私钥到 SSL 上下文环境中,私钥用于解密接收到的数据和对发送的数据进行签名。
参数与返回值:参数与设置证书文件的函数类似,包括 SSL_CTX 结构体指针、私钥文件名和文件格式。成功返回 1,失败返回 0。
SSL_CTX_check_private_key 函数(检查私钥和证书是否匹配)
功能:验证加载到 SSL 上下文中的私钥是否与证书匹配,确保数据加密和解密的一致性和正确性。
参数与返回值:参数为 SSL_CTX 结构体指针,函数返回 1 表示私钥和证书匹配成功,返回 0 表示匹配失败。
创建和操作 SSL 套接字函数
SSL_new 函数
功能:基于之前初始化的 SSL 上下文创建一个 SSL 套接字结构,为后续建立安全连接做准备。
参数与返回值:参数为 SSL_CTX 结构体指针,返回一个指向 SSL 结构体的指针,代表创建的 SSL 套接字。如果创建失败,则返回 NULL。
SSL_set_fd 函数
功能:将 SSL 套接字与一个文件描述符(通常是网络套接字的文件描述符)关联起来,使 SSL 能够在该套接字上进行数据传输操作。
参数与返回值:参数包括 SSL 结构体指针和文件描述符。函数无返回值。
SSL_connect 函数
功能:用于客户端发起 SSL 连接请求,与服务器建立安全连接。在连接过程中,会进行 SSL 握手协议,协商加密算法、交换密钥等操作。
参数与返回值:参数为 SSL 结构体指针,函数返回 1 表示连接成功,返回 0 表示连接失败。
SSL_write 函数
功能:通过 SSL 连接向对方发送数据,数据在发送前会根据当前 SSL 连接的加密算法进行加密处理,确保数据在传输过程中的保密性。
参数与返回值:参数包括 SSL 结构体指针、要发送的数据缓冲区指针和数据长度。函数返回实际发送的字节数,如果发送失败则返回 -1。
SSL_read 函数
功能:从 SSL 连接中接收对方发送的数据,接收到的数据会自动进行解密处理,还原为原始数据。
参数与返回值:参数与 SSL_write 类似,包括 SSL 结构体指针、用于存储接收数据的缓冲区指针和缓冲区大小。函数返回实际接收到的字节数,如果连接关闭则返回 0,接收失败返回 -1。

思维导图

[

AI提问

学习中遇到的疑问以及解决

我对于SSL在C/S架构的应用有些疑惑

询问AI获得了一个示例

import socket
import ssl

# 创建一个套接字对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定到指定地址和端口
server_socket.bind(('localhost', 8888))
# 开始监听,允许最多5个连接同时等待
server_socket.listen(5)

# 加载服务器端的私钥和证书(这里需要提前准备好有效的证书文件和对应的私钥文件)
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(certfile='server.crt', keyfile='server.key')

while True:
    # 接受客户端连接
    client_socket, client_address = server_socket.accept()
    # 使用SSL包装套接字,建立安全连接
    ssl_socket = context.wrap_socket(client_socket, server_side=True)
    try:
        # 接收客户端发送的数据
        data = ssl_socket.recv(1024).decode('utf-8')
        print(f"收到客户端消息: {data}")
        # 向客户端回显消息
        ssl_socket.send(data.encode('utf-8'))
    except Exception as e:
        print(f"出现错误: {e}")
    finally:
        # 关闭SSL套接字
        ssl_socket.close()
import socket
import ssl

# 创建套接字对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 创建SSL上下文,用于配置SSL相关设置,这里是客户端模式
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
# 加载信任的根证书(如果服务器证书是由受信任的CA颁发的,通常系统已经内置了常见CA的根证书,这里可以省略这一步,不过为了明确验证逻辑,可以加载相关证书)
context.load_verify_locations('ca.crt')
# 设置验证模式为要求验证服务器证书
context.verify_mode = ssl.CERT_REQUIRED

# 连接到服务器
client_socket.connect(('localhost', 8888))
# 使用SSL包装套接字,建立安全连接
ssl_socket = context.wrap_socket(client_socket, server_hostname='localhost')

try:
    message = "你好,这是测试消息"
    # 向服务器发送消息
    ssl_socket.send(message.encode('utf-8'))
    # 接收服务器返回的消息
    response = ssl_socket.recv(1024).decode('utf-8')
    print(f"从服务器收到回复: {response}")
except ssl.SSLError as e:
    print(f"SSL相关错误: {e}")
except socket.error as e:
    print(f"套接字相关错误: {e}")
finally:
    # 关闭SSL套接字
    ssl_socket.close()
posted @ 2024-12-09 18:44  北寒带  阅读(43)  评论(0编辑  收藏  举报