动态加载证书和 OCSP stapling
一个标准的 Nginx ssl 配置必然包含这两行:
ssl_certificate example.com.crt;
ssl_certificate_key example.com.key;
Nginx 启动时会读取配置的证书内容,并经过一系列解析后,最终通过调用 OpenSSL 的 SSL_use_certificate 来设置证书。
对于匹配的私钥,Nginx 调用的是 SSL_use_PrivateKey。
于是有了个新的想法:既然 OpenSSL 允许我们动态地设置证书和私钥,也许我们可以在建立连接前才设置证书和私钥呢?
这样一来,我们可以结合 SNI,针对不同的请求域名动态设置不同的证书和私钥,而无需事先把可能用到的证书和私钥都准备好。
动态加载证书
借助 OpenResty,我们可以轻易地把这个想法变成现实。
所需的,是 ssl_certificate_by_lua* 指令和来自 lua-resty-core 的 ngx.ssl 模块。另外,编译 OpenResty 时指定的
OpenSSL 需要 1.0.2e 或以上的版本。
见下面的示例代码:
server{
listen443ssl;
server_name test.com;
# 用于满足 Nginx 配置的占位符
ssl_certificate fake.crt;
ssl_certificate_key fake.key;
ssl_certificate_by_lua_block{
localssl=require"ngx.ssl"
--清除之前设置的证书和私钥
localok,err=ssl.clear_certs()
ifnotokthen
ngx.log(ngx.ERR,"failed to clear existing (fallback) certificates")
returnngx.exit(ngx.ERROR)
end
--后续代码见下文
}
}
证书/私钥的格式分两种,一种是文本格式的 PEM,另一种是二进制格式的 DER。我们看到的证书一般是 PEM 格式的。
这