"本文档主要介绍了SSL(Secure Socket Layer)中的密钥信息以及OpenSSL编程的基础知识,涵盖了密钥的生成、SESSION的管理以及OpenSSL的相关数据结构和编程接口。"
在SSL协议中,密钥信息是确保通信安全的核心部分。主要有以下几个关键概念:
1. **预主密钥**:预主密钥是主密钥的计算基础,由客户端生成,通过服务器的公钥加密后发送给服务器。在SSLv3中,这个过程在`s3_clnt.c`的`ssl3_send_client_key_exchange`函数中完成,利用`RAND_bytes`生成随机数,并通过`RSA_public_encrypt`进行加密。
2. **主密钥**:主密钥是预主密钥、客户端随机数和服务器随机数共同生成的,客户端和服务端生成的主密钥相同,用于衍生其他密钥。在不同版本的SSL/TLS中,生成方式略有不同,例如在sslv3中通过`ssl3_generate_master_secret`函数生成,而在tlsv1中使用`tls1_generate_master_secret`。
3. **对称密钥和MAC密钥**:对称密钥(包括初始化向量IV)以及读写MAC密钥都是基于主密钥、客户端随机数和服务器随机数生成的。在SSLv3中,这些密钥在`ssl3_generate_key_block`函数中生成,并在`ssl3_change_cipher_state`中分配使用。
4. **SESSION**:在握手过程中,客户端和服务端建立的新SESSION会被服务器分配一个唯一的Session ID,并存储在服务端的哈希表中。这个ID在SSL v2中是16字节,而在SSLv3和TLSv1中是32字节。当需要重用SESSION时,客户端会在`ClientHello`消息中携带此ID,以便服务器查找并恢复会话状态。
关于OpenSSL编程,这本书涵盖了基础的密码学算法(对称算法、摘要算法、公钥算法)、回调函数、OpenSSL库的安装和源码分析、堆栈数据结构、哈希表、内存分配、动态模块加载、抽象IO、配置文件处理、随机数生成和文本数据库等主题。这些内容对于理解和使用OpenSSL进行安全通信开发至关重要。书中还提供了大量源码分析和编程示例,有助于读者深入理解OpenSSL的工作原理和实际应用。