翻译自: ngx.ssl - Lua API for controlling NGINX downstream SSL handshakes

1. 概要

# 注意:如果你使用的是 OpenResty 1.9.7.2+,则不需要该行
lua_package_path "/path/to/lua-resty-core/lib/?.lua;;";server {listen 443 ssl;server_name test.com;# useless placeholders: just to shut up NGINX configuration# loder errors:ssl_certificate /path/to/fallback.crt;ssl_certificate_key /path/to/fallback.key;ssl_certificate_by_lua_block {local ssl = require "ngx.ssl"-- clear the fallback certificates and private keys-- set by the ssl_certificate and ssl_certificate_key-- directives above:local ok, err = ssl.clear_certs()if not ok thenngx.log(ngx.ERR, "failed to clear existing (fallback) certificates")return ngx.exit(ngx.ERROR)end-- assuming the user already the my_load_certificate_chain()-- herself.local pem_cert_chain = assert(my_load_certifiate_chain())local der_cert_chain, err = ssl.cert_pem_to_der(pem_cert_chain)if not der_cert_chain thenngx.log(ngx.ERR, "failed to convert certificate chain ","from PEM to DER: ", err)return ngx.exit(ngx.ERROR)endlocal ok, err = ssl.set_der_cert(der_cert_chain)if not ok thenngx.log(ngx.ERR, "failed to set DER cert: ", err)return ngx.exit(ngx.ERROR)end-- assuming the user already defined the my_load_private_key()-- function herself.local pem_pkey = assert(my_load_private_key())local der_pkey, err = ssl.priv_key_pem_to_der(pem_pkey)if not der_pkey thenngx.log(ngx.ERR, "failed to convert private key ","from PEM to DER: ", err)return ngx.exit(ngx.ERROR)endlocal ok, err = ssl.ser_der_priv_key(der_pkey)if not ok thenngx.log(ngx.ERR, "failed to set DER private key: ", err)return ngx.exit(ngx.ERROR)end}location / {root html;}
}

2. 描述

该 Lua 模块提供 API 函数来控制类似 ssl_certificate_by_lua*(ngx_lua 模块) 等上下文的 SSL 握手过程。

OpenSSL 允许我们动态地设置证书和私钥,因此期望可以在建立连接前才设置证书和私钥,这样,可以结合 SNI,针对不同的请求域名动态设置不同的证书和私钥,而无需事先把可能用到的证书和私钥都准备好。该 lua 模块提供的 API 以在 ssl_certificate_by_lua* 指令的上下文中支持此种情况。

在 Lua 中加载 ngx.ssl 模块,因如下:

local ssl = require "ngx.ssl"

3. 方法

3.1 clear_certs

语法:ok, err = ssl.clear_certs()
上下文:ssl_certificate_by_lua*
  • 清除在当前 SSL 连接中设置的任何已经存在的 SSL 证书和私钥。
  • 成功返回 true,失败返回一个 nil 值并且通过字符串描述错误。

3.2 cert_pem_to_der

语法:der_cert_chain, err = ssl.cert_pem_to_der(pem_cert_chain)
上下文:任意
  • 将 PEM 格式的 SSL 证书链数据转换为 DER 格式(转换后的 der 格式数据将用于 set_der_cert 函数)。
  • 失败,则返回 nil 值,并且通过字符串描述错误。
  • openssl 命令行工具可能无法正确将 SSL 证书链从 PEM 格式转换为 DER,因此总是使用该 Lua 函数进行转换。你可以总是使用类似 lua-resty-lrucache 或者 ngx_lua API(如 lua_shared_dict)等库来缓存 DER 格式的结果。
  • 该函数可以在任何上下文中使用。

3.3 set_der_cert

语法:ok, err = ssl.set_der_cert(der_cert_chain)
上下文:ssl_certificate_by_lua*
  • 为当前的 SSL 连接设置 DER 格式的 SSL 证书链数据。注意,该 DER 数据是直接保存在 Lua 字符串参数中的。不需要外部文件支持。
  • 若成功返回 true,否则返回 nil 并且通过字符串描述错误。
  • 注意,SSL 证书链通常以 PEM 格式编码,因此首先需要使用 cert_perm_to_der 函数进行转换。

3.4 priv_key_pem_to_der

语法:der_priv_key, err = ssl.priv_key_perm_to_der(perm_priv_key)
上下文:任意
  • 将 PEM 格式的 SSL 私钥数据转换为 DER 格式(用于 set_der_priv_key 函数)。
  • 失败,返回 nil 并通过字符串描述错误。
  • 可选地,你可以使用 openssl 命令行工具脱机下执行 PEM 转换为 DER,如下:
openssl rsa -in key.pem -outform DER -out key.der
  • 该函数可以在任意上下文中调用。

3.5 set_der_priv_key

语法:ok, err = ssl.set_der_priv_key(der_priv_key)
上下文:ssl_certificate_by_lua*
  • 为当前 SSL 连接设置 DER 格式的私钥。
  • 成功返回 true,失败返回 nil 并通过字符串描述错误。
  • 通常,私钥是以 PEM 格式编码的。可以使用 priv_key_perm_to_der 函数或者使用 openssl 命令行工具脱机将 PEM 转换为 DER,如下:
openssl rsa -in key.pem -outform DER -out key.der

3.6 server_name

语法:name, err = ssl.server_name()
上下文:任意
  • 返回由客户端设置的 TLS SNI(Server Name Indication) 名。若客户端没有设置则返回 nil。
  • 失败,返回 nil 并通过字符串描述错误。
  • 通常我们使用 SNI 名作为域名(如 www.openresty.org)来标识当前的 web 站点,同时为当该网站加载相应的 SSL 证书链和私钥。
  • 注意,并不是所有的 https 客户端都设置 SNI 名,因此当从客户端握手请求中缺失 SNI 名时,我们可以使用客户端访问的服务器 IP 地址来标识该网站。有关更多详细信息,参阅 raw_server_addr 方法。
  • 可以在下游 https 的任何上下文中调用该函数。

3.7 raw_server_addr

语法:addr_data, addr_type, err = ssl.raw_server_addr()
上下文:任意
  • 返回当前 SSL 连接中客户端实际访问的原始服务器地址。
  • 前两个返回值分别表示地址数据和地址类型的字符串,根据地址类型值对地址值进行不同的解释:
    • unix: 地址数据是 UNIX 域套接字的文件路径。
    • inet:地址数据是 4 字节长的二进制 IPv4 地址。
    • inet6:地址数据时 16 字节长的二进制 IPv6 地址。
  • 失败返回 nil,并通过字符串描述错误。
  • 以下代码显示如何将 UNIX 域套接字和 IPv4 地址打印为人类可读的字符串:
local ssl = require "ngx.ssl"
local byte = string.bytelocal addr, addrtyp, err = ssl.raw_server_addr()
if not addr thenngx.log(ngx.ERR, "failed to fetch raw server addr: ", err)return
endif addrtyp == "inet" then  -- IPv4ip = string.format("%d.%d.%d.%d", byte(addr, 1), byte(addr, 2),byte(addr, 3), byte(addr, 4))print("Using IPv4 address: ", ip)elseif addrtyp == "unix" then  -- UNIXprint("Using unix socket file ", addr)else  -- IPv6-- leave as an exercise for the readers
end
  • 可以在下游 https 的任何上下文中调用该函数。

3.8 raw_client_addr

语法:addr_data, addr_type, err = ssl.raw_client_addr()
上下文:任意

转载于:https://www.cnblogs.com/jimodetiantang/p/9260698.html

OpenResty之ngx.ssl相关推荐

  1. 基于OpenResty的弹性网关实践(二)

    五.11个指令介绍 OpenResty 有 11 个 *_by_lua指令,它们和 NGINX 阶段的关系如下图所示 其中, init_by_lua 只会在 Master 进程被创建时执行,init_ ...

  2. 高性能web平台【OpenResty入门与实战】

    一.OpenResty概述 1 OpenResty 背景 随着宽带网络的快速普及和移动互联网的高速发展,网站需要为越来越多的用户提供服务,处理越来越多的并发请求,要求服务器必须具有很高的性能才能应对不 ...

  3. OpenResty 动态SNI

    应用场景 SNI主要解决一台服务器只能使用一个证书(一个域名)的缺点,随着服务器对虚拟主机的支持,一个服务器上可以为多个域名提供服务,因此SNI必须得到支持才能满足需求. 解决方案 OpenResty ...

  4. ocsp和ldap 区别_HTTPS 时代 - 动态加载证书和 OCSP stapling - 《OpenResty 最佳实践》 - 书栈网 · BookStack...

    动态加载证书和 OCSP stapling 一个标准的 Nginx ssl 配置必然包含这两行: ssl_certificate example.com.crt; ssl_certificate_ke ...

  5. CDN通过openresty库实现ocsp stapling,有效提升客户端回源效率

    背景 最近在开发CDN在线加速功能,各个CDN厂商都支持了oscp stapling 功能,所以我们的产品必须也要实现它.实现它的好处就是:可以省掉浏览器和CA机构的服务器校验证书的时间,这样可以提高 ...

  6. OpenResty搭建游戏服务器(一)开始

    参考:   OpenResty® - 中文官方站   OpenResty最佳实践   Lua | NGINX   Nginx - 指南 | Guides - 开发者手册 - 云+社区 - 腾讯云 开发 ...

  7. acme申请泛域名SSL证书

    网上有太多的例子教程了,在这里只做一个简单的记录以便自己方便查询. 以下以阿里云为例 1. 登录阿里云管理后台创建Accesskey,记录Accesskey ID和Access Key Secret以 ...

  8. tengine简单安装_树莓派使用宝塔面板安装LNMP环境

    书接上回,前面说到我被垃圾Rock 64搞的死去活来,索性在树莓派上装了Ubuntu 20.04 LTS. 为了方便配置V2Ray,我忙活了一天终于把LNMP环境搞定了.下面说说怎么搞的,避免后面再踩 ...

  9. 常见漏洞知识库(原理/场景/修复)

    Jsonp漏洞 0x01 漏洞描述 1. 一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面.动态网页.web服务.WCF,只要是跨域请求,一律不准. 2. 不过我 ...

最新文章

  1. Google 修补多项 Android 高危漏洞
  2. CUDA Libraries简介
  3. 《深入理解Elasticsearch(原书第2版)》一2.2 查询改写
  4. 走在网页游戏开发的路上(十)
  5. 通过Blazor使用C#开发SPA单页面应用程序(1)
  6. 继承情况下构造方法的调用过程-java
  7. Python程序员之面试必回习题
  8. SQL Server 2005新增加的功能
  9. 区块链 以太坊 全局变量 msg包括哪些字段
  10. 前置指纹会逐步替代后置指纹
  11. 在美团,我从暑期实习到转正
  12. 南大计算机系统基础CMU‘s CSAPP——第一章
  13. 油烟机烟雾报警_基于STC89C51单片机
  14. 深度学习--基于队列的数据随机载入
  15. 计算机安全应急演练简报,开封市网络安全应急演练表彰大会在计算机与信息工程学院举行...
  16. 复旦黄萱菁:顶会也喜欢“搞事情”文章,提示学习等已成为NLP领域的研究重点...
  17. 超零协议(SERO)轻松入门——基于CENTOS7
  18. 画论22 韩拙《山水纯全集》
  19. RedisCluster redis集群配置
  20. mysql read buffer_mysql 参数read_rnd_buffer_size的真正含义

热门文章

  1. linux windows文件 编码_一站式解读彻底搞懂Python编码
  2. cmake 安装_linux下安装cmake
  3. RabbitMQ各个参数含义
  4. SpringCloud五大组件详解
  5. 客户端连接不上kafka的解决方案
  6. redhad6.4 安装zabbix2.4
  7. 美研计算机案例,美国研究生申请案例:耶鲁大学录取:计算机硕士【2010】
  8. python 生成器读取文件
  9. 前端名称命名--英文字母
  10. 快速实现MySQL迁移到Redis