经济成本
- 购买证书(对安全性要求不高时,也可以申请免费的证书)
- 部署HTTPS之后,计算资源,包括内存、CPU、网络带宽的消耗都会更大,在相关硬件设备上需要更多投入。加解密比较耗cpu,大站一般都会有专门的服务器完成加解密工作,https请求经过ssl卸载到应用服务器就只是http请求了。有专用的SSL解密卡。
技术方面的成本
- 服务器的配置与优化
- HTTPS给资源的CDN缓存带来了障碍。完全符合SSL要求的页面资源没法像HTTP的那样很方便地做资源分布式缓冲。
- 加密方法的兼容性,老式的平台对一些有用的特性支持不够好。如Windows XP不支持SNI,使得一个IP上只能部署一个证书,一个HTTPS Web server。一些旧平台对加密套件支持不够好。
访问性能
- 流程上,TLS初次连接握手阶段需要在TCP三次握手一个RTT的基础上增加两个RTT。会话恢复的连接握手需要额外增加一个RTT,增加延时。
- 证书验证时,非对称加密相关运算需要消耗比较多的CPU资源。
- 证书验证时,可能需要访问CA的网站,访问CRL或OCSP检查证书的状态,这需要额外的延时。
- 密钥交换过程中的非对称加密相关运算需要消耗比较多的CPU资源。
- 数据交换过程中,对数据的对称加密/解密需要消耗计算资源,带来额外的性能负担。
- 数据交换过程中,为了数据完整性校验,需额外携带MAC,会更多地占用带宽资源。
https访问,对服务器资源消耗最厉害的是SSL连接握手阶段的非对称解密(目前主要是RSA)对CPU的消耗。并且现在新申请的证书只颁发RSA2048 bit证书,在同等硬件条件下,2048bit https比http并发性能要弱5-10倍,甚至更多。
为nginx做如下的cipher suites配置,可以用浏览器访问http2资源:
# https://github.com/cloudflare/sslconfig/blob/master/conf
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
对上面的cipher suites配置做一点点改动:
# https://github.com/cloudflare/sslconfig/blob/master/conf
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:RSA+AES128:EECDH+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
仅有的改动是对调了RSA+AES128
和EECDH+AES128
的位置。再次通过浏览器访问http2资源是会报出如下图所示的错误:
仔细看的话,可以看到ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY
。
这是由于在TLS协商阶段,服务器优先选择了RSA+AES128
加密套件,而这个加密套件在HTTP/2的加密套件黑名单中。
然而,使用curl访问资源则并没有这样的限制:
curl --http2 -v https://www.wolfcstech.com/
curl的http2实现似乎并没有估计规范中定义的加密套件黑名单。
来看看上述配置指定的 CipherSuite 具体有哪些(注:以下命令中的 openssl 版本是 OpenSSL 1.0.2g):
$ openssl ciphers -V 'EECDH+CHACHA20:EECDH+CHACHA20-draft:RSA+AES128:EECDH+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5'
0x00,0x9C - AES128-GCM-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(128) Mac=AEAD
0x00,0x3C - AES128-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA256
0x00,0x2F - AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1
0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD
0xC0,0x2B - ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(128) Mac=AEAD
0xC0,0x27 - ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA256
0xC0,0x23 - ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA256
0xC0,0x13 - ECDHE-RSA-AES128-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA1
0xC0,0x09 - ECDHE-ECDSA-AES128-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA1
0xC0,0x30 - ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD
0xC0,0x2C - ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD
0xC0,0x28 - ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA384
0xC0,0x24 - ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA384
0xC0,0x14 - ECDHE-RSA-AES256-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA1
0xC0,0x0A - ECDHE-ECDSA-AES256-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA1
0x00,0x9D - AES256-GCM-SHA384 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(256) Mac=AEAD
0x00,0x3D - AES256-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA256
0x00,0x35 - AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1
0xC0,0x12 - ECDHE-RSA-DES-CBC3-SHA SSLv3 Kx=ECDH Au=RSA Enc=3DES(168) Mac=SHA1
0xC0,0x08 - ECDHE-ECDSA-DES-CBC3-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=3DES(168) Mac=SHA1
0x00,0x0A - DES-CBC3-SHA SSLv3 Kx=RSA Au=RSA Enc=3DES(168) Mac=SHA1
再通过 Wireshark 获得 Chrome 在 Client Hello 中发送的 CipherSuite 列表,如下:
也就是如下这些:
Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b)
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (0xc02c)
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)
Cipher Suite: Unknown (0xcca9)
Cipher Suite: Unknown (0xcca8)
Cipher Suite: TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (0xcc14)
Cipher Suite: TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcc13)
Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009)
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)
Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)
Cipher Suite: TLS_RSA_WITH_AES_128_GCM_SHA256 (0x009c)
Cipher Suite: TLS_RSA_WITH_AES_256_GCM_SHA384 (0x009d)
Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002f)
Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)
Cipher Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA (0x000a)
参考文档:
Stackoverflow.com: the road to SSL
Everything you need to know about cryptography in 1 hour