SSL weak ciphers 漏洞修复过程

本文介绍了SSL/TLS的定义、工作原理和历史发展,重点讨论了SSL弱密码和漏洞,包括SSL 2.0和SSL 3.0的安全问题。针对SSL/TLS 1.0和1.1的不安全性,提出了禁用这些版本的处理办法,并提供了Nginx的TLS配置示例。通过禁用弱加密和旧版协议,可以提高系统的安全性。

故事前言

最近接到了一个安全漏洞:ssl weak ciphers。一开始接到这个漏洞讲真,觉得一脸懵逼。发现触及知识点盲区了。。没办法,那我们一步一步去解剖。
首先这个问题在网上查阅时候,大多数都会带上 TLS/SSL ciphers。所以这里也一起讲解一下。

知识储备

什么是 TLS

TLS定义

TLS(Transport Layer Security,安全传输层),一种加密协议。TLS是建立在传输层TCP协议之上的协议,服务于应用层,它的前身是SSL(Secure Socket Layer,安全套接字层),以SSL 3.0 作为基础版。它实现了将应用层的报文进行加密后再交由TCP进行传输的功能。

TLS如何工作

TLS可以用于传输层安全协议(例如TCP)之上。TLS包含三个主要组件:加密,身份验证和完整性。

  • 加密:隐藏从第三方传输的数据。(通过加密方式实现)
  • 认证:确保交换信息的各方是他们声称的身份。(双方认证证书)
  • 完整性:验证数据是否未被伪造或篡改。(MAC 地址)

TLS握手过程

sequenceDiagram
    Client->>Server:ClientHello
    Server->>Client:ServerHello
    Server-->>Client:SendCertificate、Request Certificate
    Server->>Client:ServerHelloDone
    
    Client->>Server:ClientKeyExchange
    Client->>Server:ChangeCipherSpec
    Client->>Server:Finashed
    
    Server->>Client:ChangeCipherSpec
    Server->>Client:Finished

TLS 发展过程

  • 1995: SSL 2.0, 由Netscape提出,这个版本由于设计缺陷,并不安全,很快被发现有严重漏洞,已经废弃。
  • 1996: SSL 3.0. 写成RFC,开始流行。目前(2015年)已经不安全,必须禁用。
  • 1999: TLS 1.0. 互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版
  • 2006: TLS 1.1. 作为 RFC 4346 发布。主要修复了CBC模式相关的如BEAST攻击等漏洞
  • 2008: TLS 1.2. 作为 RFC 5246 发布 。增进安全性,目前应该主要部署的版本
  • 2015之后: TLS 1.3,还在制订中,支持0-rtt,大幅增进安全性,砍掉了aead之外的加密方式

什么是 SSL

其实就是上面说的 Secure Socket Layer,安全套接字层。位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
TLS 则是以SSL 3.0 作为基础推出的。

问题分析

漏洞定义

参考 :https://www.acunetix.com/vulnerabilities/web/ssl-weak-ciphers/

语言漏洞描述
EnglishSSL weak ciphersThe remote host supports the use of SSL ciphers that offer either weak encryption or no encryption at all.
中文SSL弱密码远程主机支持使用SSL密码,该密码提供弱加密或完全不加密。

漏洞理解

估计就是开放了 SSL ,以及一些密码套件问题。为了确保数据传输的安全,TLS / SSL使用一个或多个密码套件。密码套件是身份验证,加密和消息身份验证代码(MAC)算法的组合。在TLS / SSL连接的安全设置协商以及数据传输期间使用它们。

处理办法

1. 禁用SSL 2.0 和 SSL 3.0

SSL 2.0是SSL的第一个公开版本。它于1995年发布。此版本的SSL包含多个安全问题。1996年,对协议进行了完全重新设计,并发布了SSL 3.0。

由于安全问题,SSL 2.0协议不安全,您应该完全禁用它。由于存在POODLE(在降级的传统加密上填充Oracle)漏洞,SSL 3.0也不安全,您也应该禁用它。如果启用,攻击者可能会检索安全连接的纯文本内容。此外,您不能在SSL 3.0中使用椭圆曲线密码术(请参阅下文)。

Internet Explorer 6是唯一仍使用SSL 3.0的浏览器。因此,除非仍然需要支持旧版Internet Explorer 6浏览器,否则应禁用SSL 3.0,如下所述。

2. 禁用 TLS 1.0 和 1.1

除非需要支持旧版浏览器,否则还应禁用TLS 1.0和TLS 1.1。PCI DSS(支付卡行业数据安全标准)指定从2018年6月30日起,将不再使用TLS 1.0。它还强烈建议您禁用TLS 1.1。这些协议可能会受到诸如FREAK,POODLE,BEAST和CRIME之类的漏洞的影响。如果您仍然必须支持TLS 1.0,请禁用TLS 1.0压缩以避免CRIME攻击。

您还应该禁用弱密码,例如DES和RC4。DES可能会在几个小时内损坏,并且发现RC4比以前认为的要弱。过去,建议使用RC4作为减轻BEAST攻击的一种方法。但是,由于对RC4的最新攻击,Microsoft已发布了针对它的公告。PCI DSS还禁止使用RC4批量密码。

如果禁用TLS 1.0和TLS 1.1,则以下用户代理及其旧版本可能会受到影响(不同操作系统上的特定用户代理版本可能会有所不同)。

  • Android 4.3
  • 铬29
  • 火狐26
  • Internet Explorer 10
  • Java 6u45、7u25
  • OpenSSL 0.9.8y
  • Safari 6.0

如何配置 TLS

Nginx的

根据您的业务用例(例如,需要支持旧版浏览器和法规要求),您可能需要使用略有不同的密码套件配置。您可以使用Mozilla SSL配置生成器来使用不同的浏览器配置文件(现代,中级或旧版)获得最佳的TLS配置。或者可以手动生成:https://ssl-config.mozilla.org/#server=nginx&server-version=1.17.0&config=intermediate

  1. 高级
# generated 2019-12-30, https://ssl-config.mozilla.org/#server=nginx&server-version=1.17.0&config=modern
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    # modern configuration
    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers off;

    # HSTS (ngx_http_headers_module is required) (63072000 seconds)
    add_header Strict-Transport-Security "max-age=63072000" always;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;

    # replace with the IP address of your resolver
    resolver 127.0.0.1;
}
  1. 中级
# generated 2019-12-30, https://ssl-config.mozilla.org/#server=nginx&server-version=1.17.0&config=intermediate
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam.pem
    ssl_dhparam /path/to/dhparam.pem;

    # intermediate configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

    # HSTS (ngx_http_headers_module is required) (63072000 seconds)
    add_header Strict-Transport-Security "max-age=63072000" always;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;

    # replace with the IP address of your resolver
    resolver 127.0.0.1;
}
  1. 旧版
# generated 2019-12-30, https://ssl-config.mozilla.org/#server=nginx&server-version=1.17.0&config=old
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    # openssl dhparam 1024 > /path/to/dhparam.pem
    ssl_dhparam /path/to/dhparam.pem;

    # old configuration
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA;
    ssl_prefer_server_ciphers on;

    # HSTS (ngx_http_headers_module is required) (63072000 seconds)
    add_header Strict-Transport-Security "max-age=63072000" always;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;

    # replace with the IP address of your resolver
    resolver 127.0.0.1;
}

参考文献:https://www.acunetix.com/blog/articles/tls-ssl-cipher-hardening/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Charlven

你的鼓励将是我最大的动力哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值