现状
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