Nginx 映射正则表达式和 MTLS

问题描述 投票:0回答:1

我需要更改客户端证书的传出格式:

这是 nginx 的用途

$ssl_client_raw (\x0A):

-----BEGIN CERTIFICATE-----\x0AMIIGujCCBaKgAwIBAgITWg...



$ssl_client_escaped_cert (%20 | %0A):

-----BEGIN%20CERTIFICATE-----%0AMIIGujCCBaKgAwIBAgITWg...



$ssl_client_cert (\x0A | \x09):

-----BEGIN CERTIFICATE-----\x0A\x09MIIGujCCBaKgAwIBAgITWg...

我需要的是一个“干净”的文本/证书,我认为使用 nginx 中的地图来做到这一点是个好主意:

map $ssl_client_raw_cert $regex {
    "~(-+BEGIN\sCERTIFICATE-+)|(?:\\x0A)(.{64})|(?:\\x0A)(-+END\sCERTIFICATE-+)(?:\\x0A)"    $1$2$3;
}

.
.
.

location / {
    ...
    proxy_set_header        X-SSL-CERT $regex;
    ...
}

所以...第一个正则表达式到目前为止可以工作,但 nginx 股票在第二个(顺便说一句:正则表达式参数“全局”和“多行”怎么了?)

有什么想法如何让它发挥作用吗?

非常感谢...

尝试了多个 nginx 版本、多个正则表达式...现在我在开发系统上使用 1.24。

regex nginx client-certificates
1个回答
0
投票

用 OpenResty 和 Lua 找到了它:

   location / {
        set $ssl_cert "${ssl_client_raw_cert}";

        access_by_lua_block {
            ngx.log(ngx.DEBUG, "*** start access_by_lua_block ***")
            local cert = ngx.var.ssl_cert
            local modified_cert = string.gsub(cert, "[\n\r]", "")
            ngx.log(ngx.DEBUG, "DEBUG modiified_cert: ", modified_cert)
            ngx.var.ssl_cert = modified_cert
            ngx.log(ngx.DEBUG, "*** end access_by_lua_block ***")
        }

        proxy_set_header    Host $host;
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-SSL-CERT $ssl_cert;
        proxy_pass          https://yourmachine;
    }

谢谢你的提示杰里米:

不幸的是,我无法说出 nginx 的“不当行为”发生在哪里。然而,我们发现,从 Nginx 发送到后端系统的证书包含换行符,由于字符“\x0A”(十六进制换行符),后端系统无法正确处理换行符。

我们无法直接在 Nginx 中删除不必要的字符(或者我做错了什么),只有使用 OpenResty(= Nginx & Lua 组件)才能通过简单的“替换”来删除换行符 或者 没有任何内容”,或“将十六进制 \x0A(换行)或十六进制 \x0D(回车)替换为任何内容”。

local modified_cert = string.gsub(cert, "[\n\r]", "")

Nginx变量

$ssl_client_raw_cert
转换为
$ssl_cert
,然后在Lua块中处理并通过
proxy_set_header X-SSL-CERT $ssl_cert
传递到后端系统。

希望对您有一点帮助。

© www.soinside.com 2019 - 2024. All rights reserved.