高性能 SSL 加密算法配置 2019版

现状

CentOS 7.4+、Ubuntu 16.04+ 默认自带 openssl 1.0.2 LTS。
OpenSSL 1.1.1 LTS 已经发布,支持 TLS 1.3,默认不再提供 3DES 算法 。
Ubuntu 18.04 默认自带 openssl 1.1.0, Ubuntu 18.10 默认自带 openssl 1.1.1

TLS 1.3 final 正式版的支持情况

OpenSSL 1.1.1 20180911
Chrome 70 20181016
Firefox 63 20181023

先说结论:最复杂的算法配置

ssl_ciphers EECDH+AES:EECDH+CHACHA20;

验证:

openssl version
openssl ciphers -v 'EECDH+AES:EECDH+CHACHA20'

说明:
以上算法配置兼容 openssl 1.0.1,1.0.2,1.1.0,1.1.1 等主流版本。
以上算法配置支持 TLS 1.1 1.2 1.3 等协议。
以上算法配置支持 RSA 和 ECC 证书。
以上算法配置适用与绝大部分场景。要求客户端为:JDK 1.6+, Win7+, Android 4+ 。

生成 dhparam.pem 文件

openssl dhparam -dsaparam -out dhparam.pem 4096    # recommend, more quickly
openssl dhparam -out dhparam.pem 4096

完整的 Nginx 配置

server {
  listen 80;
  listen 443 ssl http2;
  server_name ssl.domain.com;
  server_tokens off;
 default_type "text/html";
  ssl_certificate         ssl.domain.com.pem;
  ssl_certificate_key  ssl.domain.com.key;
  ssl_dhparam dhparam.pem;
  ssl_session_timeout  5m;
  ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 ;
  ssl_prefer_server_ciphers on;
  ssl_ciphers EECDH+AES:EECDH+CHACHA20;
  proxy_http_version 1.1;
  proxy_set_header Connection "";
  proxy_set_header   Host             $host;
  proxy_set_header   X-Real-IP        $remote_addr;
  proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_set_header   X-Forwarded-Proto $scheme;
  proxy_set_header   X-Forwarded-Port $server_port;
  proxy_redirect off;
  

  # force https
  #add_header Strict-Transport-Security "max-age=31536000; preload";
  #if ($scheme = http) { rewrite ^/(.*)  https://$host/$1 permanent; }

   location /{  proxy_pass http://php;    }

}

以上文章可满足绝大多数的业务场景和安全需要。以下内容基本可以不看。
如果软件版本不支持 TLSv1.3 ,就需要在配置文件中删除 TLSv1.3 字样。

更高安全级别:禁用SHA算法。要求客户端为:JDK 1.8+, Win7+, Android 4+ 。

ssl_ciphers EECDH+AES:EECDH+CHACHA20:!SHA;

OPENSSL 1.1.1 + TLSv1.1,1.2,1.3

ssl_ciphers EECDH+AES:EECDH+CHACHA20:!SHA;
#或如下写法,结果一样
ssl_ciphers EECDH:!SHA:!CAMELLIA:!ARIA;

TLSv1.3 新增的算法有:

TLS_AES_256_GCM_SHA384 
TLS_CHACHA20_POLY1305_SHA256 
TLS_AES_128_GCM_SHA256
/app/openssl-1.1.1/bin/openssl ciphers -v 'EECDH+AES:EECDH+CHACHA20:!SHA'
TLS_AES_256_GCM_SHA384  TLSv1.3 Kx=any      Au=any  Enc=AESGCM(256) Mac=AEAD
TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any      Au=any  Enc=CHACHA20/POLY1305(256) Mac=AEAD
TLS_AES_128_GCM_SHA256  TLSv1.3 Kx=any      Au=any  Enc=AESGCM(128) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-CCM8 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESCCM8(256) Mac=AEAD
ECDHE-ECDSA-AES256-CCM  TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESCCM(256) Mac=AEAD
ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128) Mac=AEAD
ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
ECDHE-ECDSA-AES128-CCM8 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESCCM8(128) Mac=AEAD
ECDHE-ECDSA-AES128-CCM  TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESCCM(128) Mac=AEAD
ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA384
ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384
ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA256
ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA256
ECDHE-ECDSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=CHACHA20/POLY1305(256) Mac=AEAD
ECDHE-RSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH     Au=RSA  Enc=CHACHA20/POLY1305(256) Mac=AEAD

1. 升级系统的 openssl 到最新版

如果还是使用 CentOS 6 系统,可以考虑自行编译 openssl
如果CentOS 7 系统用的还是 openssl 1.0.1 版本, 先执行命令升级到 1.0.2

openssl version
sudo yum install openssl-devel -y

2. 选择加密算法

2.1 适用于大多数情况,兼容 openssl 所有版本。

ssl_ciphers EECDH+AES:EECDH+CHACHA20:!SHA;

以上配置兼容的客户端为:

  • Android 4+
  • JDK 7+
  • XP + Firefox
  • Win7

以上配置不支持的客户端为:

  • JDK 6
  • WinXP + IE8

以上配置基本满足主流的网络环境的要求。如果有兼容低版本系统的需求,可以考虑采用下面的配置。

2.2 兼容IE8和JDK6,兼容 openssl 所有版本。

ssl_ciphers EECDH+AES:EECDH+CHACHA20:RSA+3DES;

以上配置兼容的客户端为:

  • Android 4+
  • JDK 6+
  • XP + IE 8
  • Win7

常见需要支持的基本都兼容。
以上配置没有禁用 SHA,因为禁用了就没法支持 JDK6 。
如果不需要支持WinXP+IE8,可以去掉最后的 RSA+3DES 。

自行编译 openssl,并保留系统版本

wget -c https://www.openssl.org/source/openssl-1.1.1.tar.gz
tar zxfv openssl-1.1.1.tar.gz
cd openssl-1.1.1

OPENSSL=openssl-1.1.1
./config --prefix=/app/$OPENSSL --openssldir=/app/$OPENSSL -Wl,-rpath,/app/$OPENSSL/lib
make -j8 && sudo make install
/app/$OPENSSL/bin/openssl ciphers -V "ALL:COMPLEMENTOFALL"


说明

如果使用 ECC 证书,OpenSSL 版本低于 1.1.0 ,推荐的配置为

EECDH+ECDSA+AES:EECDH+AES:EECDH+CHACHA20:!SHA

这样把 ECDSA 的算法排在前面。如果是更高的版本,则自动把 ECDSA 排在前面。

如果想知道配置完成后支持哪些算法,运行以下命令即可

openssl version
openssl ciphers -v 'EECDH+AES:EECDH+CHACHA20:!SHA'

如果在乎安全性,请停止使用 OpenSSL 1.0.1 版本,至少升级到 1.0.2 版本。
最简单的做法,就是使用 CentOS 7.4+ 、Ubuntu 16.04+ LTS 等版本。

ECC 证书兼容性

浏览器
Firefox 2+
Apple Safari 4+ (with a compatible OS)
Google Chrome 1.0+ (with a compatible OS)
Microsoft Internet Explorer 7+ (Vista)

操作系统
Google Android 4.0+ (2018.08 统计显示,0.2%的份额低于这个版本)
Apple OS X 10.6+
Microsoft Windows Vista+
Red Hat Enterprise Linux 6.5+

软件、开发语言
Java JDK 5+
OpenSSL 0.9.8+

资料来源 https://www.gworg.com/ssl/136.html

客户端兼容性重点考虑对象

  • JDK 7+
  • Android 4.0+
  • IE 9.0 +

常见问题

https://www.jianshu.com/p/235b8f915cff

你可能感兴趣的:(高性能 SSL 加密算法配置 2019版)