这里有几点需要说明:

1.数字签名签发和校验使用的密钥对是CA自己的公私密钥,跟证书申请者提交的公钥没有关系。

2.数字签名的签发过程跟公钥加密的过程刚好相反,即是用私钥加密,公钥解密。

3.现在大的CA都会有证书链,证书链的好处一是安全,保持根CA的私钥离线使用。第二个好处是方便部署和撤销,即如何证书出现问题,只需要撤销相应级别的证书,根证书依然安全。

4.根CA证书都是自签名,即用自己的公钥和私钥完成了签名的制作和验证。而证书链上的证书签名都是使用上一级证书的密钥对完成签名和验证的。

5.怎样获取根CA和多级CA的密钥对?它们是否可信?当然可信,因为这些厂商跟浏览器和操作系统都有合作,它们的公钥都默认装到了浏览器或者操作系统环境里。比如 firefox就自己维护了一个可信任的CA列表 ,而 chrome和IE使用的是操作系统的CA列表 。

数字证书的费用其实也不高,对于中小网站可以使用 便宜甚至免费的数字证书服务(可能存在安全隐患),像著名的verisign公司的证书一般也就几千到几万块一年不等。当然如果公司对证书的需求比较大,定制性要求高,可以建立自己的CA站点,比如google,能够随意签发google相关证书。

3,HTTPS对速度和性能的影响

既然HTTPS非常安全,数字证书费用也不高,那为什么互联网公司不全部使用HTTPS呢?原因主要有两点:

HTTPS对速度的影响非常明显。每个HTTPS连接一般会增加1-3个RTT,加上加解密对性能的消耗,延时还有可能再增加几十毫秒。

HTTPS对CPU计算能力的消耗很严重,完全握手时,web server的处理能力会降低至HTTP的10%甚至以下。

下面简单分析一下这两点。

3.1 HTTPS对访问速度的影响

我用一张图来表示一个用户访问使用HTTPS网站可能增加的延时: 

用户访问使用HTTPS网站可能增加的延时

HTTPS增加的延时主要体现在三个阶段,包含了上图所示的2和3阶段。

● 302跳转。为什么需要302?因为用户懒。我想绝大部分网民平时访问百度时都是输入 www.baidu.com 或者baidu.com吧?很少有输入 http://www.baidu.com 访问百度搜索的吧?至于直接输入 https://www.baidu.com 来访问百度的HTTPS服务的就更加少了。所以为了强制用户使用HTTPS服务,只有将用户发起的HTTP请求www.baidu.com302 成 https://www.baidu.com 。这无疑是增加一个RTT的跳转延时。

● 上图第三阶段的SSL完全握手对延时的影响就更加明显了,这个影响不仅体现在网络传输的RTT上,还包含了数字签名的校验,由于客户端特别是移动端的计算性能弱,增加几十毫秒的计算延时是很常见的。

● 还有一个延时没有画出来,就是证书的状态检查,现在稍微新一点的浏览器都使用ocsp来检查证书的撤销状态,在拿到服务器的证书内容之后会访问ocsp站点获取证书的状态,检查证书是否撤销。如果这个ocsp站点在国外或者ocsp服务器出现故障,显然会影响这个正常用户的访问速度。不过还好ocsp的检查周期一般都是7天一次,所以这个对速度的影响还不是很频繁。 另外chrome默认是关闭了ocsp及crl功能,最新版的firefox开启了这个功能,如果ocsp返回不正确,用户无法打开访问网站。

实际测试发现,在没有任何优化的情况下,HTTPS会增加200ms以上的延时。

那是不是对于这些延时我们就无法优化了呢?显然不是,部分优化方式参考如下:

1.服务器端配置HSTS,减少302跳转,其实HSTS的最大作用是防止302 HTTP劫持。HSTS的缺点是浏览器支持率不高,另外配置HSTS后HTTPS很难实时降级成HTTP。

2.设置ssl session 的共享内存cache. 以nginx为例,它目前只支持session cache的单机多进程共享。配置如下:

ssl_session_cache shared:SSL:10m;

如果是前端接入是多服务器架构,这样的session cache是没有作用的,所以需要实现session cache的多机共享机制。我们已经在nginx 1.6.0版本上实现了多机共享的session cache。多机session cache的问题必须要同步访问外部session cache,比如redis。由于openssl目前提供的API是同步的,所以我们正在改进openssl和nginx的异步实现。

3.配置相同的session ticket key,部署在多个服务器上,这样多个不同的服务器也能产生相同的 session ticket。session ticket的缺点是支持率不广,大概只有40%。而session id是client hello的标准内容,从SSL2.0开始就被全部客户支持。

ssl_session_tickets on;

ssl_session_ticket_key ticket_keys;

4.设置ocsp stapling file,这样ocsp的请求就不会发往ca提供的ocsp站点,而是发往网站的webserver。ocsp的配置和生成命令如下:

● ssl_stapling on;

● ssl_stapling_file domain.staple;

● 上面是nginx配置,如下是ocsp_stapling_file的生成命令:

● openssl s_client -showcerts -connect yourdomain:443 < /dev/null | awk -v c=-1 '/-----BEGIN CERTIFICATE-----/{inc=1;c++} inc {print > ("level" c ".crt")} /---END CERTIFICATE-----/{inc=0}'

● for i in level?.crt;

● do

● openssl x509 -noout -serial -subject -issuer -in "$i";

● echo;

● done

● openssl ocsp -text -no_nonce -issuer level1.crt -CAfile CAbundle.crt -cert level0.crt -VAfile level1.crt -url $ocsp_url -respout domain.staple ,其中$ocsp_url等于ocsp站点的URL,可以通过如下命令求出:for i in level?.crt; do echo "$i:"; openssl x509 -noout -text -in "$i" | grep OCSP; done,如果是证书链,一般是最底层的值。

5.优先使用ecdhe密钥交换算法,因为它支持PFS( perfect forward secrecy) ,能够实现 false start 。

6.设置tls record size,最好是能动态调整record size,即连接刚建立时record size设置成msg,连接稳定之后可以将record size动态增加。

7.如果有条件的话可以启用tcp fast open。虽然现在没有什么客户端支持。

8.启用SPDY。SPDY是强制使用HTTPS的,协议比较复杂,需要单独的文章来分析。可以肯定的一点是使用SPDY的请求不仅明显提升了HTTPS速度,甚至比HTTP还要快。在无线WIFI环境下,SPDY比HTTP要快50ms左右,3G环境下比HTTP要快250ms。


相关内容