跳转至

encrypted-session: 加密和解密 NGINX 变量值

安装

您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:

  • RedHat Enterprise Linux 7, 8, 9 和 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-encrypted-session
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-encrypted-session

通过在 /etc/nginx/nginx.conf 的顶部添加以下内容来启用该模块:

load_module modules/ngx_http_encrypted_session_module.so;

本文档描述了 nginx-module-encrypted-session v0.9,发布于 2021 年 11 月 18 日。


## key 必须为 32 字节长
encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";

## iv 不能超过 16 字节
## 默认: "deadbeefdeadbeef" (不带引号)
encrypted_session_iv "1234567812345678";

## 默认: 1d (1 天)
encrypted_session_expires 3600; # 以秒为单位

location /encrypt {
    set $raw 'text to encrypted'; # 来自 ngx_rewrite 模块
    set_encrypt_session $session $raw;
    set_encode_base32 $session; # 来自 ngx_set_misc 模块

    add_header Set-Cookie 'my_login=$session';  # 来自 ngx_headers 模块

    # 您的内容处理程序在这里...
}

location /decrypt {
    set_decode_base32 $session $cookie_my_login; # 来自 ngx_set_misc 模块
    set_decrypt_session $raw $session;

    if ($raw = '') {
        # 无效会话
    }

    # 您的内容处理程序在这里...
}

描述

该模块提供基于 AES-256 和 Mac 的 NGINX 变量的加密和解密支持。

该模块通常与 ngx_set_misc module 和标准重写模块的指令一起使用。

该模块可用于实现简单的用户登录和 ACL。

通常,您只需在 NGINX 层解密数据,并将未加密的数据传递给您的 FastCGI/HTTP 后端,如下所示:

location /blah {
    set_decrypt_session $raw_text $encrypted;

    # 此指令来自 ngx_set_misc 模块
    set_escape_uri $escaped_raw_text $raw_text;

    fastcgi_param QUERY_STRING "uid=$uid";
    fastcgi_pass unix:/path/to/my/php/or/python/fastcgi.sock;
}

直接在 ngx_lua 上运行的 Lua Web 应用程序可以直接从 Lua 代码中调用该模块的指令:

local raw_text = ndk.set_var.set_decrypt_session(encrypted_text)

指令

encrypted_session_key

语法: encrypted_session_key <key>

默认:

上下文: http, server, server if, location, location if

设置用于加密的密钥(必须为 32 字节长)。例如,

encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";

encrypted_session_iv

语法: encrypted_session_iv <iv>

默认: encrypted_session_iv "deadbeefdeadbeef";

上下文: http, server, server if, location, location if

设置用于加密的初始向量(必须不超过 16 字节)。

例如,

encrypted_session_iv "12345678";

encrypted_session_expires

语法: encrypted_session_expires <time>

默认: encrypted_session_expires 1d;

上下文: http, server, server if, location, location if

设置过期时间差(默认以秒为单位)。

例如,考虑以下配置:

encypted_session_expires 1d;

当您的会话被生成时,ngx_encrypted_session 将在加密会话字符串中植入一个过期时间(在此示例中为 1 天),以便在稍后解密会话时,服务器可以从会话中提取过期时间并与服务器的当前系统时间进行比较。无论您如何传输和存储会话,例如使用 cookies、URI 查询参数或其他方式。

人们可能会将此设置与 HTTP cookies 的过期日期混淆。该指令仅控制会话何时过期;它与 HTTP cookies 无关。即使最终用户自己从 cookie 中拦截了此会话并稍后手动使用,服务器仍会在过期时间过后拒绝该会话。

set_encrypt_session

语法: set_encrypt_session $target <value>

默认:

上下文: http, server, server if, location, location if

加密由 value 参数指定的字符串值,并将结果保存到由 $target 指定的变量中。

例如,

set_encrypt_session $res $value;

将把变量 $value 中的值加密到目标变量 $res 中。

value 参数也可以是一个 NGINX 字符串值,例如,

set_encrypt_session $res "my value = $value";

生成的数据可以通过 set_decrypt_session 指令稍后解密。

set_decrypt_session

语法: set_decrypt_session $target <value>

默认:

上下文: http, server, server if, location, location if

类似于 set_encrypt_session,但执行反向操作,即解密。

另见

GitHub

您可以在 nginx-module-encrypted-session 的 GitHub 仓库 中找到有关此模块的其他配置提示和文档。