keyless原理

ssl协议是基于密码学的基础上,解决通信双方加密信道和身份鉴权的安全问题。ssl协议的算法本身是公开的,但是算法本身的输入参数(key)是由通信双方私自保存。在非对称加密中,服务端保存有一对公钥和私钥对,用于服务端鉴权和加密通信。服务端的私钥泄露会导致恶意攻击者伪造虚假的服务器和客户端通信。特别是源站把业务迁移到云或者CDN上,私钥的安全保存要求更高。

一、ssl握手

SSL握手目的是安全协商出双方加解密的密钥。协商算法使用的是公钥算法(也就是非对称密钥算法)。公共密钥算法(如RSA和DH)使用了大量的CPU,是TLS握手中最慢的部分。

1.1、密钥协商

1.1.1、RSA

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;

1.1.2、DH

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;

1.2、公钥算法

RSA协商:

RSA的握手过程

服务端发送随机码和公钥,客户端使用公钥加密Premaster secret,在可能不安全的信道传输,服务器取得加密后的premaster,通过私钥还原出Premaster secret。

ECDH(椭圆DH协商)

使用DH的握手过程

Diffie-Hellman握手是TLS握手的另一种形式。它使用不同的机制:一种用于建立共享的前主机密码。在Diffie-Hellman中,具有不同秘密的双方交换信息以获得共享的秘密。即使服务器私钥被盗窃,记录之前的加密报文也无法恢复原始会话。DH的私钥不参与生成Premaster,只负责签名,做服务端鉴权。

二、keyless

keyless在方案,把服务器的私钥统一管理,并且把服务器的公钥算法中密钥协商的相关计算过程,统一远程调用放在硬件加速卡。提高了处理效率也更安全。来详细看下耗CPU的操作。

2.1、openssl握手分析

SSL很多状态都分A,B两种,A状态表示刚进入该状态还没有收发数据,B状态表示进行的收发数据处理但还没完成善后操作。

  • SSL_ST_ACCEPT->SSL3_ST_SR_CLNT_HELLO_A:服务端接收到客户端的版本号(2byte)+随机码(32byte)+Session ID(1byte)。这个阶段完成加密的选择,还有协议扩展字段的初始化。相应的openssl代码为ssl3_get_client_hello。客户随机码的选择,从客户端的加密套件中选择,目前忽略压缩,设置版本号,s->session创建当前连接的session,session是否复用放在SSL->hit,使用的cipher放在SSL->tmp.new_cipher,新创建或者选择已有的session id。
  • SSL3_ST_SW_SRVR_HELLO_A:发送服务端的随机码和版本号和选择的密钥套件
  • SSL3_ST_SW_CERT_A:添加服务端证书链,发送证书,开始握手
  • SSL3_ST_SW_KEY_EXCH_A:只有在DH算法才需要进行发送服务端选择的secret计算原材料。RSA和ECDHE算法在此步骤都完成签名,用于服务端授权。相应的函数在ssl3_send_server_key_exchange
  • SSL3_ST_SW_CERT_REQ_A:服务端可以选择发起请求客户端的证书或者忽略此步骤
  • SSL3_ST_SR_KEY_EXCH_A:服务端读取客户端发送过来的密钥生成原材料。如果是RSA,则需要使用私钥解密出pre secret。如果是ECDHE,则需要做签名运算。
  • SSL3_ST_SW_SRVR_DONE_A:完成握手

2.2、更改点

  • 对于RSA来说,消耗性能的操作主要在SSL3_ST_SR_KEY_EXCH_A的pre secret的解密上,和SSL3_ST_SW_KEY_EXCH_A签名。
  • 对于ECDHE,消耗性能的操作主要在SSL3_ST_SW_KEY_EXCH_A的签名上。
  • 把这些耗cpu操作调离到远程解密集群的专用硬件,节省了运算时间,并且私钥也更保障
  • 远程解密机器的信道需要加密,并且远程调用两端都需要鉴权,确保是我们的服务器和解密机器。

三、openssl改造

openssl1.0.2的版本其中ssl3_get_client_key_exchange,是server 收到client的处理函数。对于RSA算法,才有使用私钥恢复premaster。所以只需要判断如果是RSA算法,调用远程解密。

其中ssl3_get_send_key_exchange,RSA算法没有做任何动作。而对于ECDHE算法则需要使用私钥做签名。这部分耗时的操作也拉到远程解密集群做。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JavaEdge

WCF认证:X.509证书1 非对称密码学(Asymmetric Cryptography)二、数字证书三、通过凭证三个属性来分析X.509证书

站在消息交换的角度,密码学就是帮助我们实现对整个消息或者对消息的某个部分进行数字签名和加密的理论和方法

1261
来自专栏java一日一条

详解Https是如何确保安全的?

HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单...

661
来自专栏吴伟祥

非对称加密与安全证书看这一篇就懂了 转

前几日做支付对接时,被对方文档中的加密方式搞晕乎了一会。意识到证书加密方面的理解不够深入,事后查阅参考资料补习一波。本文是根据期间的学习,以及长期以来的实践做出...

1692
来自专栏日暮星辰

使用Oneinstack实现TLS1.3部署

一直在使用OneInstack,一直为网站部署了SSL,随着TLS1.3的草案落实发布,Openssl也发布了多个草案适配的TLS1.3的OPENSSL测试版套...

2352
来自专栏IT笔记

支付宝支付密钥RSA1升级到RSA2

支付宝作为国内第一的第三方支付平台,安全的重要性不言而喻了,下面主要对密钥做一个简单的介绍和升级流程。

5243
来自专栏网络

从https的演进到burpsuite抓包的漫谈

开始先抛出一下三个问题: 网站登录用户名密码明文传输,改用https协议是否能解决这个问题? 那为什么我采用https了通过burp还是可以看到明文密码? 如果...

3478
来自专栏情情说

让数据传输更安全

在阅读RabbitMQ数据传输安全的章节时,提到了ssl协议,用了很大篇幅介绍使用openssl生成一些列秘钥和证书,如果没有相关基础,会不太好理解,本篇就来总...

4107
来自专栏苦逼的码农

【漫画】https 加密那点事

在每次发送真实数据之前,服务器先生成一把密钥,然后先把密钥传输给客户端。之后服务器给客户端发送真实数据的时候,会用这把密钥对数据进行加密,客户端收到加密数据之后...

2423
来自专栏Jackson0714

WCF安全2-非对称加密

2796
来自专栏Janti

PKI信息安全知识点详细解答包含HTTPS

1. 什么是X.509? X.509标准是ITU-T设计的PKI标准,他是为了解决X.500目录中的身份鉴别和访问控制问题设计的。 2. 数字证书 数字证书的意...

3787

扫码关注云+社区

领取腾讯云代金券