如何在Nginx中获取客户端证书的颁发者哈希值?
在Nginx中获取客户端证书颁发者哈希并传递给后端服务
我希望将客户端证书的颁发者哈希值传递给Nginx后方的服务。通过命令行的openssl工具,可以用以下命令获取该哈希值:
openssl x509 -in B0100002230000023.crt -noout -issuer_hash- 示例输出:
529e9f5d
但我无法在Nginx配置中直接获取这个值,以下是我的示例配置,其中[SOME_VAR_TO_GET_HASH]位置需要填入对应的变量或函数,目前尚未找到合适的选项:
server { listen 443 ssl; listen [::]:443 ssl; server_name example.com; ssl_certificate /etc/nginx/ssl/live/example.com/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/live/example.com/privkey.pem; ssl_client_certificate /etc/nginx/client-cer/ROOT.crt; ssl_verify_client optional; location /default/controller/ { if ($ssl_client_verify != SUCCESS) { return 403; } proxy_pass http://app.behind:8080; proxy_set_header Host $http_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-Issuer-Hash-1 [SOME_VAR_TO_GET_HASH]; } }
解决方案
Nginx原生变量中没有直接提供颁发者哈希的选项,可通过以下两种方式实现:
方法一:预计算哈希硬编码(适用于颁发者固定场景)
如果客户端证书的颁发者是固定的,提前用openssl x509 -in ROOT.crt -noout -issuer_hash计算出哈希值,直接写入配置:
proxy_set_header X-Ssl-Issuer-Hash-1 529e9f5d;
方法二:用Lua模块动态计算(适用于多颁发者场景)
借助lua-nginx-module(推荐使用OpenResty集成)实时计算哈希:
- 确保Nginx已安装该模块
- 修改配置添加Lua逻辑:
location /default/controller/ { if ($ssl_client_verify != SUCCESS) { return 403; } set $issuer_hash ""; access_by_lua_block { local issuer_dn = ngx.var.ssl_client_i_dn -- 实现与openssl issuer_hash一致的计算逻辑:对DN做MD5哈希,取后8字节转小写 local md5 = require "resty.md5" local str = require "resty.string" local md5_ctx = md5:new() md5_ctx:update(issuer_dn) local digest = md5_ctx:final() local hash = str.to_hex(digest):sub(16, 32):lower() ngx.var.issuer_hash = hash } proxy_pass http://app.behind:8080; proxy_set_header Host $http_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-Issuer-Hash-1 $issuer_hash; }
内容的提问来源于stack exchange,提问作者Yusufss
相关产品推荐
相关产品推荐

