MoshiCoCo
发布于 2023-11-07 / 73 阅读
0
0

Nginx HTTP 性能调优 - 未完成

使用OCSP/OCSP Stapling替代CRL证书查询

CRL

  • CRL(证书吊销列表),是由CA机构维护的一个证书吊销列表,由于CA签发的证书通常具备有效期,所以在建立SSL/TLS请求时,通常会对CA证书进行查询,确认证书状态是否处于过期或者吊销状态。

当客户端/浏览器获取到从服务端返回的公钥证书后,会向CA请求CRL,借此来确认当前证书的状态是否可用。此时会需要额外的网络请求开销。

并且由于CRL的更新并非是完全实时的,当CRL被刷新后,而证书随即被吊销后,此时会导致客户端/浏览器连接到不安全的网站上。

如果CRL不可用,此时会导致客户端无法获取CRL,进而无法完成对证书验证。

如果CRL中存在大量的撤销证书,会导致请求的网络开销过大。

OCSP

为了解决CRL的上述问题,OCSP应运而生。

OCSP (Online Certificate Status Protocol), 也就是 TLS证书状态查询扩展,通常由证书签发机构 (CA)提供,用于在线实时验证证书是否合法有效,这样客户端就可以根据证书中的 OCSP信息,发送查询请求到 CA 的验证地址,来检查此证书是否有效。

当客户端/浏览器在获取到来自服务端的公钥后,会从公钥中提取证书序列号,将其封装为OCSP request发送给CA机构,如果CA服务器经查询发现该序列号不在撤销证书列表,则会响应证书有效。

相比于CRL,OCSP的响应数据结构更加轻量,在验证环节的网络开销较小,目前OCSP已经逐步替换了CRL,不过在某些领域,CRL依旧被广泛应用。

OCSP Stapling

OCSP Stapling 相比于OCSP协议,在隐私保护和性能上有了更好的提升。

OCSP Stapling 一般翻译为 OCSP装订,就是将查询 OCSP接口的工作交给服务器来做,服务器除了可以直接查询 OCSP信息,还可以仅进行少数次查询并将响应缓存起来。当有客户端向服务器发起 TLS握手请求时,服务器将证书的 OCSP信息随证书链一同发送给客户端。

由于OCSP协议请求CA验证证书时,请求是由客户端/浏览器发起,这种机制CA会得知客户端需要校验的证书,也就能获得客户端正在访问的站点。

而OCSP Stapling则是由将OCSP验证流程放在了服务端进行验证,当客户端与服务端进行握手的时候,会将OCSP信息响应给客户端。

此时客户端便不再需要和CA建立额外的网络请求,进而提高了性能。

协议优化

开启HTTP2

目前,绝大部分网站都是用的H2协议,H2协议相比于H1.1具备更好的性能表现。

随着网络基础设施的不断更新,目前许多网站请求一个页面往往会伴随着数十个HTTP请求,H2协议能够在一个链接中并行请求,进而提升性能。

如果你使用了Nginx,开启HTTP2非常简单,只需要在nginx 端口监听配置的末尾增加 http2选项即可。

listen 443 ssl http2;

注意,该配置仅适合1.25.0之前的版本,在1.25.0之后的版本中,nginx移除了server块中对http2参数的支持。你可以通过下述配置开启。

http {
    log_format quic '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" "$http3"';

    access_log logs/access.log quic;
    # 开启http2
    http2 on;
    # 开启http3
    http3 on;

    server {
        # for better compatibility it's recommended
        # to use the same port for quic and https
        listen 443 quic reuseport;
        listen 443 ssl;

        ssl_certificate     certs/example.com.crt;
        ssl_certificate_key certs/example.com.key;
        location / {
            # required for browsers to direct them to quic port
            add_header Alt-Svc 'h3=":443"; ma=86400';
        }
    }
}

开启HTTP3 (QUIC)

Nginx 从1.25.0版本开始支持HTTP QUIC。

安装Nginx 1.25.x

配置Nginx QUIC

http {
    log_format quic '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" "$http3"';

    access_log logs/access.log quic;
    # http2/3兼容
    http2 on;
    http3 on;

    server {
        # for better compatibility it's recommended
        # to use the same port for quic and https
        listen 443 quic reuseport;
        listen 443 ssl;

        ssl_certificate     certs/example.com.crt;
        ssl_certificate_key certs/example.com.key;

        location / {
            # required for browsers to direct them to quic port
            add_header Alt-Svc 'h3=":443"; ma=86400';
        }
    }
}

注意,HTTP QUIC协议只支持TLSv1.3版本的加密。

如果你发现HTTP QUIC未生效,或者无法建立连接,但同时HTTP2/1.1均可以使用时,请确认服务器安全组是否开放了443 UDP端口。


评论