SSL双向认证握手过程

SSL 双向认证握手过程客户端的浏览器向服务器传送客户端 SSL 协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息。struct {ProtocolV ers

SSL 双向认证握手过程

客户端的浏览器向服务器传送客户端 SSL 协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息。

struct {

ProtocolV ersion client_version; // SSL协议版本号

Random random; // 客户端产生的随机数

SessionID session_id; // 会话标志符

CipherSuite cipher_suites<0..216-1>; // 客户端支持的加密算法套件

CompressionMethod compression_methods<0..28 -1>; // 客户端支持的数据压缩算法 } ClientHello;

服务器向客户端传送 SSL 协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。

struct {

ProtocolV ersion server_version; // SSL协议版本号

Random random; // 服务器端产生的随机数

SessionID session_id; // 会话标志符

CipherSuite cipher_suite; // 服务器端所支持的加密算法套件

CompressionMethod compression_method; // 服务器端所支持的数据压缩算法

} ServerHello;

opaque ASN.1Cert<1..2 24 -1>;

struct {

ASN.1Cert certificate_list<1..224-1>; // X509.3 证书链,在此,只有服务器端的证书。 } Certificate;

客户利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,

,

发行服务器证书的 CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,将继续进行第四步。

发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名” ----- 用于验证证书中提供的公钥的可用性。(签名算法 公钥 密文)

用户端随机产生一个用于后面通讯的“对称密码”,然后用服务器的公钥(服务器的公钥从步骤②中的服务器的证书中获得)对其加密,然后将加密后的“预主密码”传给服务器。

enum { rsa, diffie_hellman, fortezza_dms } KeyExchangeAlgorithm;

struct {

opaque rsa_modulus<1..216-1>;

opaque rsa_exponent<1..216-1>;

} ServerRSAParams;

其中:

rsa_modulus 服务器的临时的RSA 密钥的模数。

rsa_exponent 服务器的临时的RSA 密钥的公开指数。

struct {

opaque dh_p<1..216-1>;

opaque dh_g<1..216-1>;

opaque dh_Y s <1..216-1>;

} ServerDHParams; /* 短期的DH 参数 */

其中:

dh_p Diffie-Hellman 操作中用到的质模数。

dh_g Diffie-Hellman 操作中用到的发生器。

dh_Y 服务器的Diffie-Hellman 公开值(gX mod p)。

,

struct {

opaque r_s [128];

} ServerFortezzaParams;

其中:

r_s 服务器为密钥交换算法而生成的随机数。

digitally-signed struct {

select(SignatureAlgorithm) {

case anonymous: struct { };

case rsa: opaque md5_hash[16];

opaque sha_hash[20];

case dsa: opaque sha_hash[20];

};

} Signature;

struct {

select (KeyExchangeAlgorithm) {

case diffie_hellman: ServerDHParams params;

Signature signed_params;

case rsa: ServerRSAParams params;

Signature signed_params;

case fortezza_dms: ServerFortezzaParams params;

};

} ServerKeyExchange;

其中:

params 服务器的密钥交换参数。

signed_params 相应的参数值的哈希值,及对此哈希值的签名。

md5_hash MD5(ClientHello.random Serverhello.random ServerParams); sha_hash SHA(ClientHello.random ServerHello.random ServerParams);

,

enum { anonymous, rsa, dsa } SignatureAlgorithm;

如果服务器要求客户的身份认证(在握手过程中为可选),用户可以建立一个随机数然后对其进行数据签名,将这个含有签名的随机数和客户自己的证书以及加密过的“预主密码”一起传给服务器。

服务器端请求证书

enum { rsa_sign(1), dss_sign(2), rsa_fixed_dh(3), dss_fixed_dh(4),

rsa_ephemeral_dh(5), dss_ephemeral_dh(6), fortezza_dms(20), (255)

} ClientCertificateType;

opaque DistinguishedName<3..216-1>;

struct {

ClientCertificateType certificate_types<1..28-1>; // 请求证书类型列表

DistinguishedName certificate_authorities<3..216-1>; // CA列表

} CertificateRequest;

如果服务器要求客户的身份认证,服务器必须检验客户证书和签名随机数的合法性,具体的合法性验证过程包括:客户的证书使用日期是否有效,为客户提供证书的 CA 是否可靠,发行 CA 的公钥能否正确解开客户证书的发行 CA 的数字签名,检查客户的证书是否在证书废止列表(CRL )中。检验如果没有通过,通讯立刻中断;如果验证通过,服务器将用自己的私钥解开加密的“预主密码”,然后执行一系列步骤来产生主通讯密码(客户端也将通过同样的方法产生相同的主通讯密码)。

服务器和客户端用相同的主密码即“通话密码”,一个对称密钥用于 SSL 协议的安全数据通讯的加解密通讯。同时在 SSL 通讯过程中还要完成数据通讯的完整性,防止数据通讯中的任何变化。

客户端向服务器端发出信息,指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥,

,

同时通知服务器客户端的握手过程结束。

struct { } ClientHelloDone;

服务器向客户端发出信息,指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥,同时通知客户端服务器端的握手过程结束。

struct { } ServerHelloDone;

SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验。

本文来自CSDN 博客,转载请标明出处:

SSL 协议与数字证书

SSL 协议的握手和通讯

为了便于更好的认识和理解 SSL 协议,这里着重介绍 SSL 协议的握手协议。SSL 协议既用到了公钥加密技术又用到了对称加密技术,对称加密技术虽然比公钥加密技术的速度快,可是公钥加密技术提供了更好的身份认证技术。SSL 的握手协议非常有效的让客户和服务器之间完成相互之间的身份认证,其主要过程如下:

① 客户端的浏览器向服务器传送客户端 SSL 协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息。

② 服务器向客户端传送 SSL 协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。

③ 客户利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的 CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,将继续进行第四步。

④ 用户端随机产生一个用于后面通讯的“对称密码”,然后用服务器的公钥(服务器

,

的公钥从步骤②中的服务器的证书中获得)对其加密,然后将加密后的“预主密码”传给服务器。

⑤ 如果服务器要求客户的身份认证(在握手过程中为可选),用户可以建立一个随机数然后对其进行数据签名,将这个含有签名的随机数和客户自己的证书以及加密过的“预主密码”一起传给服务器。

⑥ 如果服务器要求客户的身份认证,服务器必须检验客户证书和签名随机数的合法性,具体的合法性验证过程包括:客户的证书使用日期是否有效,为客户提供证书的 CA 是否可靠,发行 CA 的公钥能否正确解开客户证书的发行 CA 的数字签名,检查客户的证书是否在证书废止列表(CRL )中。检验如果没有通过,通讯立刻中断;如果验证通过,服务器将用自己的私钥解开加密的“预主密码”,然后执行一系列步骤来产生主通讯密码(客户端也将通过同样的方法产生相同的主通讯密码)。

⑦ 服务器和客户端用相同的主密码即“通话密码”,一个对称密钥用于 SSL 协议的安全数据通讯的加解密通讯。同时在 SSL 通讯过程中还要完成数据通讯的完整性,防止数据通讯中的任何变化。

⑧ 客户端向服务器端发出信息,指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥,同时通知服务器客户端的握手过程结束。

⑨ 服务器向客户端发出信息,指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥,同时通知客户端服务器端的握手过程结束。

⑩ SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验。

双向认证 SSL 协议的具体过程

① 浏览器发送一个连接请求给安全服务器。

② 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器。

③ 客户浏览器检查服务器送过来的证书是否是由自己信赖的 CA 中心所签发的。如果是,就继续执行协议;如果不是,客户浏览器就给客户一个警告消息:警告客户这个证书不是可以信赖的,询问客户是否需要继续。

④ 接着客户浏览器比较证书里的消息,例如域名和公钥,与服务器刚刚发送的相关消息是否一致,如果是一致的,客户浏览器认可这个服务器的合法身份。

⑤ 服务器要求客户发送客户自己的证书。收到后,服务器验证客户的证书,如果没有

,

通过验证,拒绝连接;如果通过验证,服务器获得用户的公钥。

⑥ 客户浏览器告诉服务器自己所能够支持的通讯对称密码方案。

⑦ 服务器从客户发送过来的密码方案中,选择一种加密程度最高的密码方案,用客户的公钥加过密后通知浏览器。

⑧ 浏览器针对这个密码方案,选择一个通话密钥,接着用服务器的公钥加过密后发送给服务器。

⑨ 服务器接收到浏览器送过来的消息,用自己的私钥解密,获得通话密钥。 ⑩ 服务器、浏览器接下来的通讯都是用对称密码方案,对称密钥是加过密的。 上面所述的是双向认证 SSL 协议的具体通讯过程,这种情况要求服务器和用户双方都有证书。单向认证 SSL 协议不需要客户拥有 CA 证书,具体的过程相对于上面的步骤,只需将服务器端验证客户证书的过程去掉,以及在协商对称密码方案,对称通话密钥时,服务器发送给客户的是没有加过密的(这并不影响 SSL 过程的安全性)密码方案。 这样,双方具体的通讯内容,就是加过密的数据,如果有第三方攻击,获得的只是加密的数据,第三方要获得有用的信息,就需要对加密的数据进行解密,这时候的安全就依赖于密码方案的安全。而幸运的是,目前所用的密码方案,只要通讯密钥长度足够的长,就足够的安全。这也是我们强调要求使用 128 位加密通讯的原因。

证 书 各 部 分 的 含 义

V ersion 证书版本号,不同版本的证书格式不同

Serial Number 序列号,同一身份验证机构签发的证书序列号唯一

Algorithm Identifier 签名算法,包括必要的参数 Issuer 身份验证机构的标识信息 Period of Validity 有效期

Subject 证书持有人的标识信息

Subject ’s Public Key 证书持有人的公钥

Signature 身份验证机构对证书的签名

证书的格式 认证中心所发放的证书均遵循 X.509 V3 标准,其基本格式如下:

证书版本号(Certificate Format Version ) 含义:用来指定证书格式采用的 X.509 版本号。 证书序列号(Certificate Serial Number) 含义:用来指定证书的唯一序列号,以标识 CA 发出的所有公钥证书。

签名(Signature ) 算法标识(Algorithm Identifier ) 含义:用来指定 CA 签发证书所用的

,

签名算法。

签发此证书的 CA 名称(Issuer ) 含义:用来指定签发证书的 CA 的 X.500 唯一名称(DN , Distinguished Name)。

证书有效期(V alidity Period) 起始日期(notBefore ) 终止日期(notAfter ) 含义:用来指定证书起始日期和终止日期。

用户名称(Subject ) 含义:用来指定证书用户的 X.500 唯一名称(DN ,Distinguished Name)。 用户公钥信息(Subject Public Key Information ) 算法(algorithm ) 算法标识(Algorithm Identifier ) 用户公钥(subject Public Key ) 含义:用来标识公钥使用的算法,并包含公钥本身。

证书扩充部分(扩展域)(Extensions ) 含义:用来指定额外信息。

X.509 V3 证书的扩充部分(扩展域)及实现方法如下: CA 的公钥标识(Authority Key Identifier ) 公钥标识(SET 未使用)(Key Identifier ) 签发证书者证书的签发者的甄别名(Certificate Issuer ) 签发证书者证书的序列号(Certificate Serial Number)

X.509 V3 证书的扩充部分(扩展域)及实现CA 的公钥标识(Authority Key Identifier ) 公钥标识(SET 未使用)(Key Identifier ) 签发证书者证书的签发者的甄别名(Certificat 签发证书者证书的序列号(Certificate Serial N含义:CA 签名证书所用的密钥对的唯一标识用户的公钥标识(Subject Key Identifier ) 含义:用来标识与证书中公钥相关的特定密钥进行解密。 证书中的公钥用途(Key Usage ) 含义:用来指定公钥用途。

用户的私钥有效期(Private Key Usage Period ) 起始日期(Note Before ) 终止日期(Note After ) 含义:用来指定用户签名私钥的起始日期和终止日期。 CA 承认的证书政策列表(Certificate Policies ) 含义:用来指定用户证书所适用的政策,证书政策可由对象标识符表示。 用户的代用名(Substitutional Name ) 含义:用来指定用户的代用名。 CA 的代用名(Issuer Alt Name ) 含义:用来指定 CA 的代用名。 基本制约(Basic Constraints ) 含义:用来表明证书用户是最终用户还是 CA 。 在 SET 系统中有一些私有扩充部分(扩展域)Hashed Root Key 含义:只在根证书中使用,用于证书更新时进行回溯。 证书类型(Certificate Type ) 含义:用来区别不同的实体。该项是必选的。 商户数据(Merchant Data ) 含义:包含支付网关需要的所有商户信息。 持卡人证书需求(Card Cert Required ) 含义:显示支付网关是否支持与没有证书的持卡人进行交易。 SET 扩展(SETExtensions ) 含义:列出支付网关支持的支付命令的 SET 信息扩展。 CRL 数据定

,

义版本(V ersion ) 含义:显示 CRL 的版本号。

CRL 的签发者(Issuer ) 含义:指明签发 CRL 的 CA 的甄别名。 CRL 发布时间(this Update ) 预计下一个 CRL 更新时间(Next Update ) 撤销证书信息目录(Revoked Certificates ) CRL 扩展(CRL Extension ) CA 的公钥标识(Authority Key Identifier ) CRL 号(CRL Number )

本文来自CSDN 博客,转载请标明出处:

SSL 单向、双向认证

单向认证:客户端向服务器发送消息,服务器接到消息后,用服务器端的密钥库中的私钥对数据进行加密,然后把加密后的数据和服务器端的公钥一起发送到客户端,客户端用服务器发送来的公钥对数据解密,然后在用传到客户端的服务器公钥对数据加密传给服务器端,服务器用私钥对数据进行解密,这就完成了客户端和服务器之间通信的安全问题,但是单向认证没有验证客户端的合法性。

双向认证:

(1)客户端向服务器发送消息,首先把消息用客户端证书加密然后连同时把客户端证书一起发送到服务器端

(2)服务器接到消息后用首先用客户端证书把消息解密,然后用服务器私钥把消息加密,把服务器证书和消息一起发送到客户端

(3)客户端用发来的服务器证书对消息进行解密,然后用服务器的证书对消息加密,然后在用客户端的证书对消息在进行一次加密,连同加密消息和客户端证书一起发送到服务器端,

(4)到服务器端首先用客户端传来的证书对消息进行解密,确保消息是这个客户发来的,然后用服务器端的私钥对消息在进行解密这个便得到了明文数据。

设置包括两个方面:客户端(IE 浏览器)和服务器(Web Server),我一个一个介绍吧。

,

客户端配置非常简单:只要在IE 的Internet 选项中的高级选项栏中选中“使用SSL 2.0”和“使用SSL 3.0”即可,如果使用的IE 浏览器是5.0以上,加密强度是128位的高强度,如果是5.0以下的浏览器需要下载安全补丁,否则只有40位加密强度。

服务器(Web Server )端配置比较负责,我举例说明IIS 配置的过程(其他Web Server 如何配置我就不知道了):首先使用IIS 本身带有的一个工具生成私有密钥(密钥导出有固定的格式),然后使用这个私有密钥到CA 中心或者一个能生产证书的工具,生成一个证书,这个证书称为站点证书,最后将这个证书导入IIS ,IIS 站点的身份就可以通过这个证书认证了。

实际上如果要求双向认证的话,客户端也要求有证书,就是给每个客户端发放一个证书,但是这比较复杂,一般要求有一个CA 中心的存在,否则只能做到单项认证,也就是只能验证服务器端的身份,不过你可以通过用户名和口令来验证用户的身份,这是最简单的方法。

配置完成之后,只要访问Web Server的方式改为https://就可以了。这时如果是第一次访问,一般情况需要下载站点证书和签发站点证书的根证书,就是我们经常看到的IE 浏览器弹出的是否继续加载的对话框,如果选择继续加载,证书就下载到本地并安装到了浏览器中,以后访问就不会出现这个对话框了。

1. client 向server 端发送ssl 版本号,cipher 设置,随机数(randomly generated data) 和其他

sever 端所要求的信息。

2.server 端向client 端发送ssl 版本号,cipher 设置, 随机数(randomly generated data)和其他client 端所要求的信息。server 发送其证书信息,如果是双向认证(client请求server 端资源时,server 需要对client 端进行认证) ,则请求client 发送证书。

3.client 端根据server 发送过来的信息来认证server ,如果认证失败,提示client user 不能够建立encrypted and authenticated connection.如果认证成功,执行4。

4.client 利用handshake 过程所产生的数据为会话建立premaster secret,用server 的public key(在第2步的server 证书中得到) 对其加密。

5. 如果server 端需要双向认证,client 端对another piece of data进行签名,这个数据对于handshake 是唯一的,client 和server 都知道该数据。client 发送这个signed data ,client 的证书和premaster secret.

6. 如果server 端需要双向认证,server 对client 端进行认证,如果认证失败,则结束会话,否则server 利用private key将premaster secret解密,将解密的premaster secret经过一系

标签: