sqlserverssl安全错误_TLSSSL证书解读(三)
TLS/SSL 证书解读 (三)
TLS/SSL 优化
TLS/SSL主要的性能调优简单包括: 启⽤ False Start, 选择合适 cipher suite,
resumption 等. 另外, 如果你追求 fashion, 那么 HTTP/2 也是个不错的选择.
设置 session 缓存
session 缓存设置可以让两次的 RTT, 变为⼀次, 这相当于快了⼀倍(不包括密钥计算等). 不同的 server 设置 session 办法 有很多, 这⾥以nginx 为例. 在 nginx 中, ⽀持的 Session ID 的形式, 即在 server 中缓存以前 session 的加密内容. 涉及的字段有两
个, ssl_session_cache 和 ssl_session_timeout.
ssl_session_cache: 设置 session cache 上限值, 以及是否在多个 worker 之间共享.
ssl_session_timeout: 设置 session cache 存储的时间.
例⼦:
ssl_session_cache shared:SSL:10m;ssl_session_timeout 20m;
表⽰的含义: session cache 会在不同的 worker 之间分享, 假设 1 MB 只能存储 8000 次握⼿的信息. 那么 10 MB ⼀共 可以存储80000 次握⼿信息. 如果超出, 则不会存储. 缓存信息存在是时长为 20 分钟. 另外, 你也可以开启 session ticket, ST(session ticket)需要⼀个 sign 参数, 使⽤ openssl 创建即可.
# 创建
ticket.keyopenssl rand 48 > ticket.key
# 在 nginx 中开启ssl_session_ticket on;ssl_session_ticket_key ticket.key;
选择合适的 cipher suite
先说明⼀下, 证书的内容和加密套件实际没有任何关系. 这主要还是取决于服务器的⽀持程度以及客户端的⽀持度. 另外, 如果想要启
⽤ False Start, 这和套件的选择有很⼤的关系. nginx 中, 主要⽤到两个指令:
ssl_prefer_server_ciphers on;ssl_ciphers xxx;
ssl_prefer_server_ciphers: ⽤来告诉客户端, 要按照我提供的加密套件选择.
ssl_cipher: 具体设置的加密套件内容, 使⽤ : 分隔.
⽀持性最⾼的就是使⽤:
# 让浏览器决定使⽤哪个套件ssl_ciphers HIGH:!aNULL:!MD5;
⼀般情况, 还是应该⾃⼰来决定使⽤哪个套件, 这样安全不安全由⾃⼰说了算. 这⾥简单放⼀个, ⽐较安全的, 下⾯所有的套件都必 须⽀持Forward Secrey.
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
不过, 以下的加密套件, 最好不要使⽤, 因为基本上都不安全:
aNULL: 是⼀种⾮标准的 DH 密钥交换套件. 容易被 中间⼈ 攻击.
eNULL: 没有加密⽅式, 明⽂交换
EXPORT: ⼀种弱加密⽅式.
RC4: 使⽤已经废弃的 ARCFOUR 算法
DES: 使⽤已经废弃的 Data Encryption 标准
SSLv2: ⽼版本 SSL2.0 的加密套件
MD5: 直接使⽤ MD5 加密⽅式.
False Start
另外, 怎么在 nginx 中开启 False Start 呢? 这其实和服务器并没有多⼤的关系, 关键还是你选择的套件和 NPN/ALPN 协议的 作⽤.
⾸先, 加密套件必须具有 Forward Secrey, 否则开不了.
浏览器需要使⽤ NPN 或者 ALPN 告诉服务器, 该所需的协议版本, 然后再决定开不开启.
那么, nginx中, 我们只要选择好合适的加密套件即可. 这⾥⼀份现成的:
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-G 使⽤ DH 密钥交换
DH 的加密过程, 上⾯已经说过了. DH⾃带两个公共的参数, 所以, 这必须⼿动进⾏创建.
# 创建 DH 参数openssl dhparam 2048 -out dhparam.pem
然后, 调⽤该⽂件
# nginxssl_dhparam dhparam.pem;
这样, 就正式的开启的 DH 加密模式. 抓包观察结果 (DH在ServerHello):
由于历史原因, DH param 已经使⽤的长度是 1024, ⽐如: 采⽤ 0akley group 2 版本. 现在, ⽐较流⾏的 DH 加密⽅式 是 ECDH, 它和以前
的加密⽅式 (DHE) ⽐起来, 在密钥⽣成这块会快很多. 同样, 由于历史原因, 它的基本条件⽐较⾼.
使⽤ SNI
SNI 就是针对⼀个 IP ⼿握很多个证书时, ⽤到的协议机制. 这⾥主要是⽤来区分, 不同的 host, 使⽤不同的证书. 主要使⽤格式 就是不同的server_name 搭配不同的 certificate.
server {
server_name www.abc;    ssl_;    ssl_certificate_key;}
server {
server_;    ssl_;    ssl_certificate_key;}
如何开启呢? 换个⾼版本的 nginx. 使⽤ nginx -V 检查 nginx 是否带有
TLS SNI support enabled
完整的⽰例:
server {
listen 443 ssl http2; # 默认打开 http2nginx ssl证书配置
listen [::]:443 ssl http2;    ssl_certificate /etc/nginx/;
ssl_certificate_key /etc/nginx/key;
ssl_session_cache shared:SSL:10m;    ssl_session_timeout 20m;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;            ssl_dhparam /etc/nginx/cert/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;}