预备知识:
http://blog.csdn.net/mrpre/article/details/77866856
http://blog.csdn.net/mrpre/article/details/77868263
http://blog.csdn.net/mrpre/article/details/77868365
要说明什么是双向认证,就先说明什么是单向认证。
1:在普通的场景中,例如我们访问https://www.baidu.com,客户端会和服务器会进行SSL握手,进行**协商与身份认证,这个身份认证就是单向认证,又叫服务器认证,即 客户端需要认证服务器身份,客户端如何认证服务器身份呢?
请参考文章 http://blog.csdn.net/mrpre/article/details/77866856
简单的来说,就是服务器安装了server 证书,和对应的私钥,握手过程中,服务器将证书发送到客户端,客户端需要验证证书是否正确,这个“正确”的该概念包括 证书是否真的属于发送方,证书是否被篡改的等。验证的流程大致是 浏览器受到服务器发送过来的server证书(证书链),自己需要首先构造一个完整的证书链,即 在本地找server证书的上级证书,上级证书的上级证书,一路找,找到根证书为止。然后再去验证这个链。
验证过程请看前文,这里不再赘述。
2:而双向认证就是包括了客户端认证+服务器认证,即除了客户端验证服务器身份这个基本功能以外,服务器也需要验证客户端身份,如何实现呢?那就是在服务器存放ca证书+根证书,然后把用户证书和私钥(最下级证书)发给客户端。用户证书一般直接导入浏览器,例如阿里巴巴数字证书,也可以是以ukey或者u盾的形式保存,常见于网银交易、网银登录。
之前说过,客户端认证服务器证书是因为服务器会发送证书给客户端,故,服务器若要验证客户端,需要请求客户端证书,所以服务器需要打开双向认证功能或者叫客户端认证功能。具体到报文里面呢,就是服务器在和客户端SSL握手过程中会发送 certificate request报文,具体见博客:
http://blog.csdn.net/mrpre/article/details/77868263
握手报文如下:
注意,no.89的certificate是服务器发送给客户端的注释,而no.90的cerficate是客户端发给服务器的certificate,不要搞混。我们看到了certificate request 中 Distinguished Names就是服务器导入的ca、根证书subject。
双向认证常见问题:
常见问题就是一个双向认证访问不通,具体原因五花八门。
定位步骤(网络问题通用方法)
1:抓包
2:分析报文
(1)看服务器是否发送了certificate request,并且看Distinguished Names是否和服务器导入的ca证书、root证书一致,若不一致,则先更改服务器配置,是否ca证书路径保存不对,是否ca证书过期。
(2)看客户端收到certificate request后,是否发送用户证书,判断客户端是否发送证书的依据并不是客户端有没有发 certificate报文,例如下图中,客户端虽然发送了certificate 报文,但是里面表示证书大小的长度为0,则表示客户端实质上并没有发送证书。
(3)若客户端没法送证书,上图所示,则需要检查客户端配置,看是不是浏览器没安装证书、是不是ukey、u盾松了或者对应的驱动程序没安装好等,通常ie和chrome共享windows的证书管理工具,ie导入的证书,chrome也能用,而firefox需要单独导入证书。
其次需要确定 检查 用户证书 和 certificate request报文里Distinguished Names中的证书们是否是上下级关系,如果不是,客户端也不会发送证书,现在要么调整服务器的ca证书,要么更换用户证书,使得用户证书和服务器导入的ca证书等能够构成一个链。
例如,如果证书链如下关系:root->ca1->ca2->user,certificate request发送了root+ca1,客户端有user,则客户端不会发送证书。
最后,确定用户证书是过期,ca证书是否过期。所谓过期是相对的,相对与本地电脑而言,如果浏览器判断用户证书过期了,他也不会发送证书。
若还是不行,并且其他客户端能访问,确定配置正确后,重置浏览器吧。
(4)若客户端发送了证书,但是还是验证不通过,通常,服务器在验证不通过时会发送一个alert报文,表明错误类型,如果回复Unknow CA,表明服务器少导入了ca证书或者根证书。如果是Expires,则表示用户证书对于服务器而言要么还未到生效时间,要么过期了。最后一种可能是用户证书被吊销了,这种情况少见。
还有一个问题,也可能导致服务器验证客户端证书不通过,这个就比较复杂了,见我的博客
http://blog.csdn.net/mrpre/article/details/77876907