我想通过nginx代理请求标头'HTTP_X_SSL_CLIENT_S_DN'。
这是我们的服务器网络结构。
[front server:443] <---> [nginx proxy:8004] <---> [application server:8008]
(client cert auth)
当我尝试两台服务器([前台服务器]和[应用服务器])时,它运行正常。标题“HTTP_X_SSL_CLIENT_S_DN”已传递给应用程序服务器。
然后添加服务器[nginx proxy],标题'HTTP_X_SSL_CLIENT_S_DN'未传递给应用服务器。
我的nginx配置在下面。
server {
listen 8004;
index index.html;
location / {
proxy_pass_header Server;
proxy_pass_header X-Scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://app-server/;
# TODO: to proxy 'HTTP_X_SSL_CLIENT_S_DN'
# failed settings
# proxy_pass_request_headers on; # not worked (default: on)
# proxy_pass_header X-SSL-Client-S-DN; # none
# proxy_pass_header X_SSL_CLIENT_S_DN; # none
# proxy_pass_header HTTP_X_SSL_CLIENT_S_DN; # none
# proxy_pass_header HTTP-X-SSL-CLIENT-S-DN; # none
# proxy_set_header X-SSL-Client-S-DN $ssl_client_s_dn; # none
# proxy_set_header X_SSL_Client_S_DN $x_ssl_client_s_dn; # none
# proxy_set_header X-SSL-Client-S-DN $http_ssl_client_s_dn; # none
# proxy_set_header X-SSL-Client-S-DN $http_x_ssl_client_s_dn; # none
}
}
upstream app-server {
server 127.0.0.1:8008;
}
任何帮助申请。
答案 0 :(得分:6)
首先,请确保已配置nginx.conf来验证客户端证书!我遇到的问题完全相同。
server {
# ...
ssl_client_certificate /srv/ssl/self.crt;
ssl_verify_depth 1;
ssl_verify_client on;
# ...
location @app { # I'm using nginx+unicorn, don't blindly copy this! :)
# ...
proxy_set_header X-SSL-Client-Serial $ssl_client_serial;
proxy_set_header X-SSL-Client-Verify $ssl_client_verify;
proxy_set_header X-SSL-Client-S-DN $ssl_client_s_dn;
# ...
}
要对此进行测试,您需要一个单独的客户端密钥和使用根授权证书签名的证书。客户端凭据以“me”开头,我的根权限凭据在以下命令中以“self”开头。
为客户端生成私钥。
openssl genrsa -out me.key 1024
请求自我CA签名。
openssl req -new -key me.key -out me.csr
使用自CA签署请求以创建证书。
openssl x509 -req -days 365 -in me.csr -CA self.crt -CAkey self.key -set_serial 01 -out me.crt
试用新密钥。
curl -v -s -k --key me.key --cert me.crt https://fort-awesome-o
额外信用:生成可以导入浏览器的证书。
openssl pkcs12 -export -in me.crt -inkey me.key -certfile self.crt -out me.p12
我有一个简单的Sinatra Web应用程序转储HTTP环境,我看到以下内容:
“HTTP_X_SSL_CLIENT_SERIAL”=&gt;“01”,“HTTP_X_SSL_CLIENT_VERIFY”=&gt;“SUCCESS”,“HTTP_X_SSL_CLIENT_S_DN”=&gt;“/ C = US / ST = Maryland / L = Annapolis / O = Fort Kickass / CN = Jonathan Morton /emailAddress = jon@jonmorton.com“
答案 1 :(得分:2)
我遇到了与nginx相同的问题,因为代理删除了请求中的X_REQUESTED_WITH
字段。默认情况下,nginx将带有下划线的标头标记为无效,并忽略无效的标头。
您可以使用nginx指令在underscores_in_headers on;
的标头中允许下划线,或者不要忽略ignore_invalid_headers off;
的无效标头。
在我的具体案例中,我使用python请求作为客户端,django作为服务器,nginx作为代理,解决了我将X_REQUESTED_WITH
重命名为X-REQUESTED-WITH
的问题。 (在'HTTP_'
)中提供标题之前,Django会自动将request.META.
添加到x标题名称的开头
import requests
headers = {'X-REQUESTED-WITH':'XMLHttpRequest'}
r = requests.post(url, data=payload, headers=headers)