双向认证流程补充

407 阅读5分钟

双因子验证

4.png

浏览器验证服务端ssl证书

  1. 浏览器内置的有一个信任证书区(以Google浏览器为例:设置 -> 隐私设置和安全性 -> 安全 -> 管理证书),里面包含了许多浏览器信任的证书。可以看到浏览器已经信任了许多“中级证书颁发机构”和“受信任的根证书颁发机构“。当我们在访问某网站时,浏览器就会自动下载该网站的SSL证书,并对证书的安全性进行检查。

    1.png

  2. 由于证书是分等级的,网站拥有者可能从根证书颁发机构领到证书,也可能从根证书的下一级(如某个国家的认证中心,或者是某个省发出的证书)领到证书。假设我们正在访问某个使用 了 SSL技术的网站,浏览器就会收到一个SSL证书,如果这个证书是由根证书颁发机构签发的,IE浏览器就会按照下面的步骤来检查:

    • 浏览器使用内置的根证书中的公钥来对收到的证书进行认证,如果一致,就表示该安全证书是由可信任的颁证机构签发的,这个网站就是安全可靠的;如果该SSL证书不是根服务器签发的,浏览器就会自动检查该证书上一级的发证机构,直到找到相应的根证书颁发机构,如果该根证书颁发机构是可信的,这个网站的SSL证书也是可信的。

      浏览器从哪些方面验证SSL服务器证书的?

      • 第一,检查SSL 证书是否是由浏览器中“受信任的根证书颁发机构”颁发,如果是,则会验证证书有效性;如果不是或者验证失败,则浏览器会有安全警告。 证书验证:首先要明白数字证书是怎么生成的,证书是通过

      • 第二,检查SSL证书中的证书吊销列表,检查证书是否被证书颁发机构吊销?如果已经被吊销,则会显示警告信息。 吊销列表:在证书颁发机构的证书中有一个CRL分发点(注意:此项属于证书扩展性,不一定所有的证书都有),里面有一个url地址,通过这个url地址可以下载一个.crl文件,里面有一个吊销列表,包含了被吊销证书的序列号和吊销日期

        2.png

        浏览器输入CRL分发点中的URL地址会得到一个crl文件,如下(吊销列表中是被吊销证书的序列号和吊销日期): 3.png

      • 第三,检查此SSL证书是否过期?如果证书已经过了有效期,则会显示警告信息

      • 第四,检查部署此SSL证书的网站的域名是否与证书中的域名一致?如果不一致,则浏览器也会显示警告信息

      • 第五,浏览器会到欺诈网站数据库查询此网站是否已经被列入欺诈网站黑名单

不在浏览器安装相关颁发者证书,浏览器是无法识别服务端证书的真正有效性的,通过代码自己在客户端实现,以及服务端开放CA公钥的相关接口。

服务器验证客户端ssl证书

参考流程图

关于nginx的配置:

为什么要设置服务端证书和服务端私钥,以及自建CA证书?

server {
    listen 443 ssl; //端口非固定,只是一般都是用https默认端口443
    server_name  xxx;
    ssl_certificate ../server.cer;  // 服务端证书
    ssl_certificate_key ../server-key.unsecure; // 服务端私钥
    ssl_client_certificate ../ca.cer; // CA证书
    ssl_verify_client on; // 表示开启双向认证,服务端也要认证客户端,该参数默认是off关闭
    location / {
    root   html;
    index  index.html index.htm;
}

为什么要配置服务端证书和服务端私钥? 首先要明白https本身就是一种单向认证(客户端验证服务端),https建立安全传输的过程(准确说是ssl握手阶段)中需要用到服务端的公钥(在证书中,用于加密)和私钥(用于解密)。而nginx开启的双向认证是https双向认证,这是目前应用最广最通用的双向认证方式,并且浏览器本身也支持了https认证方式:即如果在浏览器提前安装了自签CA根证书或者用的是浏览器内置的已信任的CA签发的证书,对于B/S架构的程序来说可以减少一部分客户端验证服务端的开发成本(当然,如果不提前在浏览器安装自签CA根证书或者使用的不是浏览器内置的已信任的CA签发的证书,而是自己在代码层面实现类似相关验证流程的话,浏览器依然是会提示网站不可信)。所以因为nginx配置开启双向认证是https双向认证,所以需要配置服务端证书和私钥,并且也只用在配置https的基础上多加了两个参数ssl_client_certificatessl_verify_client,配置一下ca根证书。Nginx支持四层代理(传输层)和七层代理(应用层),但要用证书实现认证,那么势必涉及到解析数据包具体内容,所以使用的应用层代理。

为什么配置CA根证书? 首先浏览器验证服务端证书,就是在它自己内置的信任证书区中找,看是否有颁发此证书的根证书,如果有,才能识别验证然后信任证书,否则是会认为证书不可信的,所以我们首先浏览器这种功能的时候,如果不想让用户自己手动导入CA根证书到浏览器信任证书区,则一般只能通过网络请求来动态获取CA根证书(或者公钥),自己在代码中实现验证机制。而服务端验证客户端证书的时候同样类似的步骤流程,同样也需要CA根证书,所以要配置CA根证书。