ssl协议是基于密码学的基础上,解决通信双方加密信道和身份鉴权的安全问题。ssl协议的算法本身是公开的,但是算法本身的输入参数(key)是由通信双方私自保存。在非对称加密中,服务端保存有一对公钥和私钥对,用于服务端鉴权和加密通信。服务端的私钥泄露会导致恶意攻击者伪造虚假的服务器和客户端通信。特别是源站把业务迁移到云或者CDN上,私钥的安全保存要求更高。
SSL握手目的是安全协商出双方加解密的密钥。协商算法使用的是公钥算法(也就是非对称密钥算法)。公共密钥算法(如RSA和DH)使用了大量的CPU,是TLS握手中最慢的部分。
RSA描述了一对非对称密钥。p和q是一个很大的素数。n是p和q的乘积,也称为公模。n代表位数,也就是密钥安全等级强度。e和(p-1)(q-1)互为素数。其中n和e称为公钥,d称为私钥。
typedef struct rsa_st
{
BIGNUM *p;
BIGNUM *q;
BIGNUM *n;
BIGNUM *e;
BIGNUM *d;
} RSA;
p和q是共享的大数,参与生成密钥。DH算法可以在不安全的信道上传输p和g,协商出对称密钥。p是一个很大的素数,如果是用于生成临时key,512bit,永久key则需要1024bit。g是大于1的素数。通信双方使用一个大数作为私钥,公钥传输给对端。对端使用公钥和自身的私钥协商出对称密钥。
typedef struct dh_st
{
BIGNUM *p;
BIGNUM *g;
BIGNUM *pub_key;
BIGNUM *priv_key;
} DH;
RSA协商:
服务端发送随机码和公钥,客户端使用公钥加密Premaster secret,在可能不安全的信道传输,服务器取得加密后的premaster,通过私钥还原出Premaster secret。
ECDH(椭圆DH协商)
Diffie-Hellman握手是TLS握手的另一种形式。它使用不同的机制:一种用于建立共享的前主机密码。在Diffie-Hellman中,具有不同秘密的双方交换信息以获得共享的秘密。即使服务器私钥被盗窃,记录之前的加密报文也无法恢复原始会话。DH的私钥不参与生成Premaster,只负责签名,做服务端鉴权。
keyless在方案,把服务器的私钥统一管理,并且把服务器的公钥算法中密钥协商的相关计算过程,统一远程调用放在硬件加速卡。提高了处理效率也更安全。来详细看下耗CPU的操作。
SSL很多状态都分A,B两种,A状态表示刚进入该状态还没有收发数据,B状态表示进行的收发数据处理但还没完成善后操作。
ssl3_get_client_hello。
客户随机码的选择,从客户端的加密套件中选择,目前忽略压缩,设置版本号,s->session创建当前连接的session,session是否复用放在SSL->hit,使用的cipher放在SSL->tmp.new_cipher,新创建或者选择已有的session id。ssl3_send_server_key_exchange
openssl1.0.2的版本其中ssl3_get_client_key_exchange,是server 收到client的处理函数。对于RSA算法,才有使用私钥恢复premaster。所以只需要判断如果是RSA算法,调用远程解密。
其中ssl3_get_send_key_exchange,RSA算法没有做任何动作。而对于ECDHE算法则需要使用私钥做签名。这部分耗时的操作也拉到远程解密集群做。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。