如何在 NGINX/Apache 反向代理中使用 OCSP 验证上游服务器证书

如何在 NGINX/Apache 反向代理中使用 OCSP 验证上游服务器证书

我有一个应用程序需要向远程服务器发出 HTTP 请求。连接应使用 TLS 进行保护。由于外部规范,应用程序必须使用 OCSP 验证所提供的服务器证书。

由于应用程序很难更改,因此我希望将 TLS 处理完全转移到反向代理,最好是 NGINX 或 Apache。这意味着,应用程序以纯文本形式与代理对话,然后代理将请求转发到上游服务器。

我找到了proxy_ssl_crlNGINX 的配置和SSLProxyCARevocationFileApache 的指令,它们似乎对服务器证书进行了额外的验证。但是,我没有找到任何选项可以让它们使用 OCSP 来验证上游服务器证书。

如何实现?如果不使用 NGINX 或 Apache,还有什么可行的替代方案?

答案1

如果我理解正确的话,您无法通过 OCSP 验证证书,这可能不是 NGINX 默认启用的,但可以更改为此行为。关于原始NGINX 文档。

  • 启用客户端证书验证。验证结果存储在 $ssl_client_verify 变量中。(开启/关闭)
ssl_verify_client on;   
  • 启用客户端证书链的 OCSP 验证。leaf 参数仅启用客户端证书的验证。(开/关/leaf)
ssl_ocsp on;
  • 强制使用特定的 DNS 解析器
resolver 192.168.2.1;
  • 覆盖“授权信息访问”证书扩展中指定的 OCSP 响应器的 URL,用于验证客户端证书。即,如果您运行自己的 OCSP 分发站点,或者需要使用特定的站点。
ssl_ocsp_responder http://ocsp.example.org;

此外&其他

  • 启用或禁用服务器对 OCSP 响应的验证。
ssl_stapling_verify on 

由于不清楚应该验证哪一方,因此我将采用更通用的方法。

请记住,正如我正确理解的那样,所有配置参数都可以添加到影响所有子位置的服务器部分,因此您只需为此配置一次。

通用配置可能看起来像这个例子

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/your/certificate.pem;
    ssl_certificate_key /path/to/your/private-key.pem;

    ssl_ocsp on;
    ssl_verify_client on;
    resolver 192.168.2.1;

    location / {
        proxy_pass http://your_upstream_server;
    }
}

如果您需要使用特定证书进行验证,我建议(取自服务器故障

    # Specifies a file with trusted CA certificates in the PEM format used to verify client certificates and OCSP responses if ssl_stapling is enabled.
    # The list of certificates will be sent to clients. If this is not desired, the ssl_trusted_certificate directive can be used. 
    ssl_client_certificate /etc/nginx/client_certs/ca.crt;
    ssl_verify_client on;
    ssl_stapling on; #Yes this has to be configured to use OCSP
    resolver 192.0.2.1;

这将导致此示例配置:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/your/certificate.pem;
    ssl_certificate_key /path/to/your/private-key.pem;

    ssl_ocsp on;
    ssl_verify_client on;
    ssl_client_certificate /etc/nginx/client_certs/ca.crt;
    ssl_stapling on; #Yes this has to be configured to use OCSP
    resolver 192.0.2.1;

    location / {
        proxy_pass http://your_upstream_server;
    }
}

我希望我能从这两方面帮助你。

p如果有人能编辑此回复,使其听起来更流畅、更悦耳,我将不胜感激。我的英语写作能力不是特别强。

答案2

对于 NGINX,您可以使用 ssl_stapling 和 ssl_stapling_verify 指令

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/your/certificate.pem;
    ssl_certificate_key /path/to/your/private-key.pem;

    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8;  # Use a DNS resolver that supports DNS over TLS (DoT)

    location / {
        proxy_pass http://your_upstream_server;
    }
}

https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_stapling

相关内容