一、说明

尽管做过证书生成、双向认证、SSL通信编程等事情,但一直不清楚SSL如何完成密钥交换。看网上的资料则众说纷纭,最近和朋友学习时聊到了这个问题,然后正巧上周处理客户反馈SSL版本过低时领导也想弄清SSL的密钥交换过程,所以来研究一番。

二、密钥交换过程

第一步,客户端向服务端,Client Hello(Client Random+Session ID+Cipher Suites);Cipher Suites是客户端支持的加密套件列表。

第二步,服务端接收到Client Hello后,取出Session ID看该Session ID是否在自己认识的列表中。

如果在,则返回Server Hello(Server Random+Session ID+Cipher Suite+Exist Key(Client Random)),要求使用已有密钥进行通信。

如果不在,则返回Server Hello(Server Random+Cipher Suite+Certificate);其中,如果服务器选Cipher Suite使用RSA做密钥交换那么整个Server Hello以一个tcp包的形式返回,如果使用DH做密钥交换那么Certificate等都单独用一个tcp包返回。

第三步,客户端接收到Server Hello。

如果看到是要求使用已有密钥进行通信,则发送Change Cipher(Exist Key(Server Random));然后后续就直接发送http请求。

如果看到是要求密钥协商,则查看证书是否有问题(比如格式、有效期、签名者是否是受信任CA),没问题则取出服务器选中的加密套件;如果是RSA类,再生成一个随机数使用公钥加密(即PreMaster)发往服务器,客户端则按选好的套件加件计算出对称密钥。如果是DH类,则客户端生成一对DH密钥,将公钥(明文)直接发往服务器,客户端使用证书中的公钥和自己DH的私钥计算出对称密钥。

第四步,服务端接收到客户端响应。

如果是Change Cipher,那么就切换至加密模式,等侯客户端请求。

如果是密钥协商,且原先选的是RSA,则使用私钥解密PreMaster获取原随机数,然后按选好的加密套件加三个随机数生成对称密钥。如果原先选的是DH,则取出公钥结合自己的私钥计算出对称密钥。

三、密钥交换过程数据流

3.1 使用DH协商密钥

3.2 使用RSA协商密钥

3.3 使用已有密钥

四、密钥交换过程的几点说明

4.1 TCP/SSL/HTTPS相互之间是什么关系

我们追路tcp流来看一下ssl的通信过程,如下图所示:先是经过了三次握手建立tcp连接,然后再进行ssl的密钥协商过程,然后传输应用层内容,最后仍是tcp四次挥手。

所以总的关系就是:原先是“tcp+http”现在是“tcp+ssl+http”;https不是一个纯粹的协议,而是“ssl+http”;只要你愿意你可以在任意“tcp+xxx”中间插入ssl形成xxxs,如ftps。

4.2 SSL中的Session ID怎么理解

我刚开始听Session ID没什么感觉,然后分析使用已有密钥Client Hello时还和领导反馈说,为什么这个新建的tcp连接中的Session ID和前面的Session ID一样,然后领导又经常性地一语惊醒梦中人:当然一样Session ID就是用来超越tcp连接的。

也就是说,前面说的使用已有密钥模式,其中的Random、Session ID、Cipher Suite都是之前的tcp三次握手和四次挥手使用过的;从编码角度看,如果原先已协商过密钥,那可以保存Random、Session ID、Cipher Suite后续在Session ID有效期内建立SSL连接,只要进行使用已有密钥过程即可,不需要进行密钥协商过程;但一般来说,我们都不是自己实现SSL过程而都是直接调用SSL库,所以这事也不归一般的应用开发人员管。

4.3 RSA在密钥协商中的作用是什么

DH密钥协商过程是比较好理解的,对方的公钥的自己私钥次方等于自己的公钥的对方公钥次方,这个值即是公钥(当然是离散对数运行不是直接的数据运算);RSA怎么完成密钥协商呢?

个人猜测,在密钥交换中RSA仅仅用于第三个随机数的公钥加密私钥解密,最终的对称秘钥和RSA没关系,可能是SHA(Client Random+Server Random+New Random)这种形式生成的。

但如果是这样的话,就不太明白为什么说RSA是唯一可于签名和密钥交换的算法,ECC有什么区别?

4.4 怎么探测服务端支持哪些SSL版本和加密套件

从原理上讲,使用某个版本的SSL发送Client Hello,如果服务器不支持该版本则会使用其支持的版本回Server Hello;对于加密套件,则可能是客户端声称其只支持某个加密套件,如果返回Server Hello则表明服务端支持该加密套件,如果返回Alert(Handshake Failure)则表明服务器不支持该加密套件。

如果要测服务端支不支持某个SSL版本或者某个加密套件,那么推荐使用openssl:

# -ssl3指定只使用ssl v3版本
# -cipher指定加密套,可使用openssl ciphers查看所有加密套件
# -ssl3和-cipher两个选项不是强相关的,可只指定其中一个
# 另外要注意有些加密套件可能只持部分SSL版本,注意看清到底报什么错
openssl s_client -ssl3 -cipher DH-RSA-DES-CBC3-SHA -host 192.168.220.128 -port

如果要探测服务端支持的所有SSL版本和所有加密套件,推荐使用nmap:

# -p是端口
nmap -p --script ssl-enum-ciphers 192.168.220.128
# 可以用以下命令来查看帮助说明
# nmap -p --script-help ssl-enum-ciphers

结果如下图所示,各套件末尾的A/D这种表示该加密套件的加密强度级别,A级的加密强度最好

4.5 SSL和SSH有没有关系

SSL是Netscape公司提出的,OpenSSL是OpenSSL管理管员会维护的一个SSL实现,其他括SSL协议库、应用程序(openssl可执行程序)以及密码算法库(包括各类主流加密算法)三部分。

OpenSSH是OpenBSD维护的一个项目,最开始使用OpenSSL的密码算法库,由于“心脏出血(heartbleed)”漏洞,OpenSSH已从OpenSSL转向自己开发的分支LibreSSL

总而言之,SSH和SSL都是非对称算法协商对称密钥最后使用对称加密,过程很相似但他们的具体有差别;至于SSH为什么不直接使用SSL的设计,可能是SSH和SSL基本同时延生然后SSH的设计者觉得没必要换吧。

一个SSH密钥交换过程如下:

第一步,客户端向服务端发送自己的客户端信息(SSH版本+实现软件+软件版本,实现软件和软件版本并没有多大意义服务端后续步骤不会因为客户端的不同而不同);

第二步,服务端向客户端发送自己的服务端信息(SSH版本+实现软件+软件版本,实现软件和软件版本并没有多大意义客户端后续步骤不会因为服务端的不同而不同);

第三步,客户端向服务端发送自己支持的算法列表;

第四步,服务端向客户端发送自己支持的算法列表(这设计与SSL相比就显得多余?);

第五步,客户端发送选择的密钥计算方法+自己的DH公钥;

第六步,服务端回复确认使用的密钥计算方法+自己的DH公钥,并表示已准备好可切换至加密模式;

第七步,客户端回复确认将进入加密模式;

第八步,后边就是加密通信,包括用户名密码认证等步骤。

SSL密钥协商过程分析的更多相关文章

  1. SSL/TLS/WTLS原理(密钥协商的形象化比喻:验证服务器的身份,用服务器的公钥协商加密格式,然后再加密具体的消息,TCP传递SSL处理后的数据)good

    一 前言 首先要澄清一下名字的混淆: 1 SSL(Secure Socket Layer)是netscape公司设计的主要用于web的安全传输协议.这种协议在WEB上获得了广泛的应用. 2 IETF( ...

  2. HTTPS 和 SSL/TLS 协议:密钥交换(密钥协商)算法及其原理

    转自:https://blog.csdn.net/andylau00j/article/details/54583769 本系列的前一篇,咱们聊了“密钥交换的难点”以及“证书体系”的必要性.今天这篇来 ...

  3. Diffie-Hellman密钥协商算法

    一.概述 Diffie-Hellman密钥协商算法主要解决秘钥配送问题,本身并非用来加密用的:该算法其背后有对应数学理论做支撑,简单来讲就是构造一个复杂的计算难题,使得对该问题的求解在现实的时间内无法 ...

  4. Libreswan软件的密钥协商协议IKEv1主模式实现分析

    Libreswan软件的密钥协商协议IKEv1主模式实现分析 1 协商过程 IKEv1(互联网密钥交换协议第一版)是IPsec VPN隧道协商使用的标准密钥协商协议,其协商过程如下图所示. 总共来回交 ...

  5. 第三十个知识点:大致简述密钥协商中的BR安全定义。

    第三十个知识点:大致简述密钥协商中的BR安全定义. 在两方之间建密钥共享是一件密码学中古老的问题.就算只考虑定义也比标准加密困难的多.尽管古典的Diffie-Hellman协议在1976年思路解决了这 ...

  6. DTLS协议中client/server的认证过程和密钥协商过程

    我的总结:DTLS的握手就是协商出一个对称加密的秘钥(每个客户端的秘钥都会不一样),之后的通信就要这个秘钥进行加密通信.协商的过程要么使用非对称加密算法进行签名校验身份,要么通过客户端和服务器各自存对 ...

  7. 使用keytool生成ssl密钥文件keystore和truststore

    最近在研究Mina的开发,通信的时候需要数据加密,而且mina本身支持SSLFilter过滤器,所以可以采用SSL加密的方式对数据进行加密. 在进行加密之前,我们需要使用keytool(这个存在于C: ...

  8. im协议设计选型【转】

    一.im协议的分层设计所谓“协议”是双方共同遵守的规则,例如:离婚协议,停战协议.协议有语法.语义.时序三要素.(1)语法:即数据与控制信息的结构或格式(2)语义:即需要发出何种控制信息,完成何种动作 ...

  9. SSL连接建立过程分析(1)

    Https协议:SSL建立过程分析 web訪问的两种方式: http协议,我们普通情况下是通过它訪问web,由于它不要求太多的安全机制,使用起来也简单,非常多web网站也仅仅支持这样的方式下的訪问. ...

随机推荐

  1. Ivanti的垃圾软件landesk

    landesk是Ivanti公司推出的终端管理工具,这个工具垃圾就垃圾在无法卸载,进程杀不死.文件删不掉,奉劝大家千万不要安装这个软件.前些天公司的IT部门一直在催促员工安装这个软件,我一时糊涂安装了 ...

  2. MySQL——数据库操作

    1.创建数据库 登录MySQL服务后,使用create命令创建数据库 # 登录MySQL进入终端 mysql -u root -p # 之后输入命令 create database database_ ...

  3. Generate a document using docxtemplater

    生成word文档,更新word内容 http://javascript-ninja.fr/docxtemplater/v1/examples/demo.html   https://docxtempl ...

  4. 锁、分布式锁、无锁实战全局性ID

    1.为什么要使用锁 当发生并发时,会产生多线程争夺一个资源,为保证资源的唯一性. JVM锁:对象锁,死锁,重入锁,公平锁,偏向锁 分布式锁:数据库 nosql .zookeeper 面试题:如何排查死 ...

  5. using 中写 return 一样会释放using 中对象 但是会在外面定义一个一样的对象 赋值后 释放 最后 return 外面定义的那个对象

    static DataTable getDataTable() { ")) { SqlCommand com = new SqlCommand("", con); Sql ...

  6. bat 获取管理员权限,判断系统位数,获取当前文件所在目录,regsvr32注册DLL、OCX

    1.获取管理员权限 @echo off if exist "%SystemRoot%\SysWOW64" path %path%;%windir%\SysNative;%Syste ...

  7. 深入理解Java封装、继承、多态

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10830957.html 一:封装 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法 ...

  8. Matplotlib 绘制定制的直方图

    1.普通风格 代码 import numpy as np import matplotlib.pyplot as plt rng = np.random.RandomState(27) x = rng ...

  9. 洛谷P2365 任务安排(斜率优化dp)

    传送门 思路: 最朴素的dp式子很好考虑:设\(dp(i,j)\)表示前\(i\)个任务,共\(j\)批的最小代价. 那么转移方程就有: \[ dp(i,j)=min\{dp(k,j-1)+(sumT ...

  10. 第07节-开源蓝牙协议BTStack框架代码阅读(上)

    首先来看一下,对于硬件操作,它是如何来进行处理的.在上篇文章中曾说过,在main函数里面它会调用硬件相关的代码,调用操作系统相关的代码.在BTStack中,可以搜索一下main.c,将会发现有很多ma ...