ssl握手协议中的CipherSuite

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:
下面是一个ssl握手的过程,没有进行客户端验证:
1.C-S:ClientHello---cipher-suit-list
2.S-C:ServerHello---selected-cipher-suit
3.S-C:ServerKeyExchange
4.S-C:ServerHelloDone
5.C-S:ClientKeyExchange
6.C-S:完成
7.S-C:完成
第3步是否发送要看c和s协商的cipher-suit是什么,cipher-suit包含四个部分(将摘要算法并入认证算法的话也可以看作三个部分),第一是密钥交换算法,第二是签名算法/验签算法,第三是摘要算法,第四是对称加密算法,RFC2246中建议了很多中组合,一般写法是"密钥交换算法-签名算法-对称加密算法-摘要算法",如果只有rfc的建议是可用的,那就难免要在各个ssl实现中加以若干硬性的规定,这样密钥交换和认证就不得不耦合起来了,比如使用ECC算法签名的证书不能使用RSA算法进行密钥交换,证书中密钥太长的的涉及出口限制的必须使用临时rsa进行密钥交换,如果使用rsa作为密钥交换算法,那么在ClientKeyExchange中的pre-master必须用证书中的公钥加密等等,之所以有这么多限制就是因为一些人或者机构的管理因素在里面,比如美国的出口限制等等,从协议本身来说,这些限制是不应该的,证书仅仅用于认证,而不和密钥交换挂钩,当然,它们之间也不是没有任何关系,比如KeyExchange消息本身就需要认证,而认证的公私钥信息可以在证书中。
     协议本身来看,任何的算法都能组合成一个cipher-suit,以RFC2246的一个建议为例,使用RSA作为密钥交换算法的不能发送ServerKeyExchange消息,我们来看一下如何违反它从而实现一个新的不在RFC中的cipher-suit,这个cipher-suit使用rsa作为密钥交换算法,但是使用ecdsa作为认证算法,暂且不考虑对称加密算法和摘要算法。仍以上述握手过程为例,第2步时server端选择了RSA-ECDSA-XX-YY这个cipher-suit,紧接着第3步,server将自己的使用ecdsa签名的证书发送给了client,client用ca的ecc公钥验证server证书中ecc签名,然后server违反rfc建议,在密钥交换算法是rsa的情况下发送ServerKeyExchange消息,由于使用rsa进行密钥交换,而证书中的公钥是ecc算法签名的,那么这个ServerKeyExchange消息中必须包含一个临时的rsa公钥,server自己保留临时rsa私钥,然后server用自己的ecc私钥将这个ServerKeyExchange消息进行签名后发给client,client收到后会使用server证书中的ecc公钥来验证这个签名,通过后保存该消息中提取的server的临时rsa公钥,接着处理完hellodone消息后生成一个pre-master,然后用刚才保存的server临时rsa公钥加密这个pre-master作为ClientKeyExchange消息发送给server,随后两端使用密钥导出算法导出一个对称密钥,认证完成,密钥交换完成,握手完成。

     上述的整个过程理解起来很简单,就把ecc算法签名的证书当成密钥太长并有出口限制的rsa证书即可。总之,不考虑匿名dh以及一切类似情况下,任何需要验证的地方,公钥一般都取证书里面的,私钥都取本地加载的,涉及密钥交换的地方,严格按照cipher-suit中的算法进行。以上的论述在OpenSSL中不被支持,要想让OpenSSL支持这个RSA-ECDSA-XX-YY的话就必须修改OpenSSL的源代码,这个修改很简单,仅仅修改s3_srvr.c,s3_clnt.c等不多的几个文件即可,加上对诸如(l & SSL_kRSA) && (l & SSL_aECDSA)等组合的判断,本文不述。总之,就协议而言,任意的算法都能组合成一个cipher-suit。



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1271782

相关文章
|
Java 应用服务中间件 网络安全
Tomcat配置ssl协议及遇到的问题https页面无法访问
Tomcat配置ssl协议及遇到的问题https页面无法访问
|
1月前
|
JavaScript 安全 Java
谈谈UDP、HTTP、SSL、TLS协议在java中的实际应用
下面我将详细介绍UDP、HTTP、SSL、TLS协议及其工作原理,并提供Java代码示例(由于Deno是一个基于Node.js的运行时,Java代码无法直接在Deno中运行,但可以通过理解Java示例来类比Deno中的实现)。
65 1
|
2月前
|
消息中间件 安全 Kafka
Kafka支持SSL/TLS协议技术深度解析
SSL(Secure Socket Layer,安全套接层)及其继任者TLS(Transport Layer Security,传输层安全)是为网络通信提供安全及数据完整性的一种安全协议。这些协议在传输层对网络连接进行加密,确保数据在传输过程中不被窃取或篡改。
167 0
|
3月前
|
安全 网络安全 数据安全/隐私保护
|
4月前
|
安全 网络协议 网络安全
SSL(Secure Sockets Layer)是一种安全协议,用于在客户端和服务器之间建立加密的通信通道。
SSL(Secure Sockets Layer)是一种安全协议,用于在客户端和服务器之间建立加密的通信通道。
|
6月前
|
安全 网络协议 网络安全
SSL协议
SSL协议
124 8
|
6月前
|
安全 算法 应用服务中间件
SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】
SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】 【可验证】 详细描述TLS是安全传输层协议,用于在两个通信应用程序之间提供保密性和数据完整性。
3253 2
|
6月前
|
安全 网络协议 网络安全
|
6月前
|
存储 安全 网络安全
什么是SSL/TLS协议?
【5月更文挑战第14天】什么是SSL/TLS协议?
201 0
|
算法 网络安全 开发工具
TLS/SSL 协议-非对称加密(RSA)原理
TLS/SSL 协议-非对称加密(RSA)原理
269 0