我们已设置 Kong API 网关(在后台运行 NGINX),其中一个上游是 apache 服务器,我们想要在其上进行客户端证书验证。
我正在运行测试,curl
我请求 kong(nginx),他将请求转发给 apache。我正在使用curl --cert cert.crt --key key.key "https://kongurl.com/blabla"
在 nginx 端,我设置了一个自定义日志来查看证书(至少是序列号)是否正在发送,并且我可以看到它:
log_format combined_sslclient '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$ssl_client_s_dn($ssl_client_serial)"';
access_log log/access.log combined_sslclient;
然后我看到了这个log/access.log
:
123.123.123.123 - - [01/Oct/2020:15:52:33 +0200] "GET /my/custom/path HTTP/1.1" 204 0 "-" "curl/7.68.0" "CN=CERT_CN,OU=CERT_OU,O=CERT_O,C=CERT_C(CERT_SERIAL_NUMBER)"
然后在 NGINX 上我也具有这些 SSL 属性:
server {
...
proxy_set_header X-SSL-CERT $ssl_client_serial;
ssl_verify_client on;
...
}
然后在 apache 端,我设置了取证模块来读取传入请求的所有标头,但我只能看到其他内容……而不是 X-SSL-CERT。以下是 apache 端取证的日志:
+289:5f75df21:1|GET /my/custom/path HTTP/1.1|Host:mykonghost%3a8412|Connection:keep-alive|X-Forwarded-For:10.1.1.1|X-Forwarded-Proto:https|X-Forwarded-Host:mykonghost|X-Forwarded-Port:8443|X-Real-IP:10.1.1.1|User-Agent:curl/7.68.0|Accept:*/*|X-Consumer-ID:d853e4d0-f8f1-4dcf-8fa7-58d3b2c67ee0|X-Consumer-Username:anonymous|X-Consumer-Custom-ID:nil|X-Anonymous-Consumer:true
-289:5f75df21:1
正如您所看到的... 有一些其他的标头传过来了,但是没有传过来有关证书的内容。
我已经尝试发送不同的 nginx ssl 变量,但到目前为止没有运气...我遗漏了什么吗?
更新:
看起来问题甚至不在于证书变量...我将 nginx 更改为:
proxy_set_header HTTP_X_TESTING 'bar';
我仍然无法在 apache 端看到它
答案1
我可以通过将 放在proxy_set_header
里面location{}
而不是server{}
块中来解决这个问题。