OpenResty 使用 lua-resty-auto-ssl 配置 https 证书

OpenResty Let's Encrypt HTTPS 大约 4927 字

lua-resty-auto-ssl 开源地址

https://github.com/auto-ssl/lua-resty-auto-ssl

lua-resty-auto-ssl 介绍

自动注册 Let's Encrypt 账号,以及自动更新https证书(Let's Encrypt颁发的证书3个月过期)。

支持OpenResty 1.9.7.2及以上版本(目前最新版本openresty-1.19.3.1)。

lua-resty-auto-ssl 安装

使用luarocks安装。

luarocks install lua-resty-auto-ssl

可能出现的错误

mkdir -p /tmp/luarocks_lua-resty-auto-ssl-0.13.1-1-K27taA/lua-resty-auto-ssl/build
rm -f /tmp/luarocks_lua-resty-auto-ssl-0.13.1-1-K27taA/lua-resty-auto-ssl/build/stamp-dehydrated-*
mkdir -p /tmp/luarocks_lua-resty-auto-ssl-0.13.1-1-K27taA/lua-resty-auto-ssl/build/bin
curl -sSLo /tmp/luarocks_lua-resty-auto-ssl-0.13.1-1-K27taA/lua-resty-auto-ssl/build/bin/dehydrated "https://raw.githubusercontent.com/lukas2511/dehydrated/05eda91a2fbaed1e13c733230238fc68475c535e/dehydrated"
curl: (7) Failed connect to raw.githubusercontent.com:443; Connection refused
make: *** [/tmp/luarocks_lua-resty-auto-ssl-0.13.1-1-K27taA/lua-resty-auto-ssl/build/stamp-dehydrated-2-05eda91a2fbaed1e13c733230238fc68475c535e] Error 7

Error: Build error: Failed building.

解决方法

到网站:https://www.ipaddress.com 输入域名查询到对应的最新IP

/etc/hosts文件中添加IP Address上查到的ip和域名。

199.232.96.133 raw.githubusercontent.com

创建自签名证书

用于Nginx启动。

openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 \
  -subj '/CN=sni-support-required-for-valid-ssl' \
  -keyout /usr/local/openresty/ssl/resty-auto-ssl-fallback.key \
  -out /usr/local/openresty/ssl/resty-auto-ssl-fallback.crt

可能出现的错误

找不到ssl文件夹。

[root@localhost ~]# openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 \
>   -subj '/CN=sni-support-required-for-valid-ssl' \
>   -keyout /usr/local/openresty/ssl/resty-auto-ssl-fallback.key \
>   -out /usr/local/openresty/ssl/resty-auto-ssl-fallback.crt
Generating a 2048 bit RSA private key
.........+++
.........................................+++
writing new private key to '/usr/local/openresty/ssl/resty-auto-ssl-fallback.key'
/usr/local/openresty/ssl/resty-auto-ssl-fallback.key: No such file or directory
139709433280400:error:02001002:system library:fopen:No such file or directory:bss_file.c:402:fopen('/usr/local/openresty/ssl/resty-auto-ssl-fallback.key','w')
139709433280400:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:404:

解决方法

创建文件夹

mkdir -p /usr/local/openresty/ssl

创建保存签名的文件夹

更改归属用户为nginx worker进程用户。

make -p /usr/local/openresty/ssl/resty-auto-ssl
chown nobody /usr/local/openresty/ssl/resty-auto-ssl
chgrp nogroup /usr/local/openresty/ssl/resty-auto-ssl

更改配置文件

events {
  worker_connections 1024;
}

http {
  # auto_ssl 共享内存用于处理证书数据。1MB大约能处理约 100 个单独的域名
  lua_shared_dict auto_ssl 1m;

  # auto_ssl_settings 共享内存用于临时存储各种设置,比如认证任务用到的密钥等,不能改变或去掉这个配置。
  lua_shared_dict auto_ssl_settings 64k;

  resolver 8.8.8.8;

  # 初始化设置任务
  init_by_lua_block {
    auto_ssl = (require "resty.auto-ssl").new()

    -- 用于保存配置、临时文件和证书文件的文件夹,文件夹必须保证 nginx worker 进程可写,默认/etc/resty-auto-ssl
    auto_ssl:set("dir", "/usr/local/openresty/ssl/resty-auto-ssl")

    -- 认证任务监听端口,默认8999
    auto_ssl:set("hook_server_port", 8999)

    -- 更新检查评率,单位秒,默认86400(一天)
    auto_ssl:set("renew_check_interval", 172800)

    -- 定义一个函数用于决定哪个域名自动处理和注册新证书。默认是不允许任务域名。所以该配置也是必须项。
    -- 替换 example.com 为自己的域名,直接返回 true 表示所有请求进来的域名都颁发证书
    auto_ssl:set("allow_domain", function(domain)
        return ngx.re.match(domain, "(example.com|example.net)$", "ijo")
        -- ^()& 是只能指定的域名,无法为二级域名颁发证书
        -- return ngx.re.match(domain, "^(example.com|example.net)$", "ijo")
        -- example.com$ 可以为所有 example.com 子域名颁发证书
        -- return ngx.re.match(domain, "example.com$", "ijo")
        -- return true
    end)

    auto_ssl:init()
  }

  init_worker_by_lua_block {
    auto_ssl:init_worker()
  }

  # HTTPS server
  server {
    listen 443 ssl;

    # 为 SNI 域名动态处理颁发或返回证书
    ssl_certificate_by_lua_block {
      auto_ssl:ssl_certificate()
    }

    # 定义静态的 ssl 证书文件用于 nginx 的启动
    #
    # 生成备用的自签名证书
    #
    # openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 \
    #   -subj '/CN=sni-support-required-for-valid-ssl' \
    #   -keyout /usr/local/openresty/ssl/resty-auto-ssl-fallback.key \
    #   -out /usr/local/openresty/ssl/resty-auto-ssl-fallback.crt
    ssl_certificate /usr/local/openresty/ssl/resty-auto-ssl-fallback.crt;
    ssl_certificate_key /usr/local/openresty/ssl/resty-auto-ssl-fallback.key;
  }

  # HTTP server
  server {
    listen 80;

    # 该节点路径用于 Let's Encrypt 域名校验
    location /.well-known/acme-challenge/ {
      content_by_lua_block {
        auto_ssl:challenge_server()
      }
    }

    location / {
        return 301 https://$host$request_uri;
    }

  }

  # 内部开启一个监听8999的服务用于处理认证任务
  server {
    listen 127.0.0.1:8999;

    # 增加 body buffer size 以保证所有的 POST 请求能正常解析返回的 POST 报文并保存到内存中
    client_body_buffer_size 128k;
    client_max_body_size 128k;

    location / {
      content_by_lua_block {
        auto_ssl:hook_server()
      }
    }
  }
}

启动 OpenResty

先检查一下配置是否正常。

nginx -t

如果返回test is successful,则可以启动了。

nginx
阅读 114 · 发布于 2021-05-07

————        END        ————

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批