ssl_stapling_verify 究竟验证了什么?

二维码
| Jan 08, 2019 | 原创

在配置nginxssl相关字段的时候,一般标配的文章(如下代码)都会告诉你需要配置ssl_stapling_verify字段值为on , 不过你是否知道当该参数设置为on的时候,你的服务器ssl组件(openssl或者其他)到底验证了什么额外内容呢?

ssl_certificate "/path/signed_cert_plus_intermediates";
ssl_certificate_key "/path/private_key"

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate "/path/to/root_CA_cert_plus_intermediates";
...

对于nginx官方文档关于 ssl_stapling_verify 指令的解释也比较模糊,仅仅只是说:该指令用于开启或关闭对OCSP响应信息的验证,且需要配合ssl_trusted_certificate一起使用才能有用。

因此,我们需要通过另外的手段查看该指令到底验证了什么信息,于是直接去看nginx源代码,找到如下内容:

# https://github.com/nginx/nginx/blob/master/src/event/ngx_event_openssl_stapling.c#L660
if (OCSP_basic_verify(basic, chain, store,staple->verify ? OCSP_TRUSTOTHER :OCSP_NOVERIFY)!= 1)

nginx的源代码文件ngx_event_openssl_stapling 660 行,发现如果设置该指令,那么就采用OCSP_TRUSTOTHER参数否则使用OCSP_NOVERIFY参数,而使用该参数的函数即是:OCSP_basic_verify()

那么,进一步,我们在 openssl 扩展中找到该函数关于OCSP_TRUSTOTHEROCSP_NOVERIFY参数类型验证官方说明:

int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs,X509_STORE *st, unsigned long flags);

Then the function already returns success if the flags contain OCSP_NOVERIFY or if the signer certificate was found in certs and the flags contain OCSP_TRUSTOTHER.

意思是:如果设置为OCSP_TRUSTOTHER即(ssl_stapling_verify 设置 on),除了对证书是否吊销基本信息验证之外,还要验证签名者的证书是否存在于certs提供的证书列表里,并且包含OCSP_TRUSTOTHER字段。

此外,我们发觉该函数需要提供一个证书列表:STACK_OF(X509) *certs, 那么此参数证书列表从哪里获取呢?那么此时我们就需要使用ssl_trusted_certificate指令了,这也验证了nginx官方为什么说ssl_stapling_verify 需要 ssl_trusted_certificate配合方能生效。

不过有一种例外的情况,如果你的ssl_certificate配置的是一个完整的CA证书链,那么ssl_trusted_certificate 是可以不需要配置,而此时,nginx会复用ssl_certificate所获取到的证书文件。

总结

从上面的文章我们大致了解到了ssl_stapling_verify如何使用,因此我们不妨来总结一下:

  1. ssl_stapling_verify 会额外验证签名证书是否存在于服务端提供的证书链中,且有OCSP_TRUSTOTHER标记。
  2. 如果 ssl_certificate 提供的非CA证书链证书,那么需要使用 ssl_trusted_certificate 指令配置完整的CA证书链,ssl_stapling_verify 只能方才有效。