我需要更改客户端证书的传出格式:
这是 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。
用 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
传递到后端系统。
希望对您有一点帮助。