ssl中的密钥相关信息包括:预主密钥、主密钥、读解密密钥及其iv、写加密密钥及其iv、读MAC密钥、写MAC密钥。
1) 预主密钥
预主密钥是主密钥的计算来源。它由客户端生成,采用服务端的公钥加密发送给服务端。
以sslv3为例,预主密钥的生成在源代码s3_clnt.c的ssl3_send_client_key_exchange函数中,有源码如下:
tmp_buf[0]=s->client_version>>8;
tmp_buf[1]=s->client_version&0xff;
if (RAND_bytes(&(tmp_buf[2]),sizeof tmp_buf-2) <= 0)
goto err;
s->session->master_key_length=sizeof tmp_buf;
……
n=RSA_public_encrypt(sizeof tmp_buf,tmp_buf,p,rsa,RSA_PKCS1_PADDING);
此处,tmp_buf中存放的就是预主密钥。
2) 主密钥
主密钥分别由客户端和服务端根据预主密钥、客户端随机数和服务端随机数来生成,他们的主密钥是相同的。主密钥用于生成各种密钥信息,它存放在SESSION数据结构中。由于协议版本不同,生成方式也不同。sslv3的源代码中,它通过ssl3_generate_master_secret函数生成,tlsv1中它通过tls1_generate_master_secret函数来生成。
3) 对称密钥和MAC密钥
对称密钥(包括IV)和读写MAC密钥通过主密钥、客户端随机数和服务端随机数来生成。sslv3源代码中,它们在ssl3_generate_key_block中生成,在ssl3_change_cipher_state中分配。