You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Varnish 7开源版如何实现字符串哈希?如SHA256算法

Varnish 7开源版实现SHA256哈希的替代方案

Varnish 7开源版确实没有内置企业版的digest VMOD,但可以通过以下两种方案实现你需要的SHA256哈希功能,适配Docker环境:

方案一:使用开源vmod_crypto(推荐)

vmod_crypto是Varnish官方生态的开源VMOD,支持SHA256等多种哈希算法,性能与企业版digest VMOD接近。

步骤1:构建包含vmod_crypto的Docker镜像

官方Varnish镜像默认不带该VMOD,需要自定义编译安装:

FROM varnish:7.0

# 安装编译依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential \
    pkg-config \
    libvarnishapi-dev \
    libssl-dev \
    git

# 克隆并编译vmod_crypto
RUN git clone https://github.com/varnish/vmod-crypto.git /tmp/vmod-crypto && \
    cd /tmp/vmod-crypto && \
    ./autogen.sh && \
    ./configure VARNISHSRC=/usr/include/varnish && \
    make && \
    make install

# 清理冗余依赖和文件
RUN apt-get purge -y build-essential pkg-config libvarnishapi-dev libssl-dev git && \
    apt-get autoremove -y && \
    rm -rf /tmp/vmod-crypto /var/lib/apt/lists/*

步骤2:修改VCL实现哈希逻辑

替换原有的digest调用为crypto VMOD:

import crypto;

sub vcl_hash {
    hash_data(req.url);
    hash_data(req.http.Host);

    if (req.http.Client-Cert) {
        # 计算Client-Cert的SHA256哈希(返回十六进制字符串)
        hash_data(crypto.hash(req.http.Client-Cert, "sha256"));
    }

    return (lookup);
}

crypto.hash()的参数说明:

  • 第一个参数:待哈希的输入字符串
  • 第二个参数:哈希算法名称(支持sha256、sha1、md5等)

方案二:调用外部工具(低流量场景可选)

如果无法构建自定义镜像,可通过std.run()调用容器内的sha256sum工具计算哈希,但该方案会带来性能损耗,不适合高流量场景。

步骤1:在容器内安装依赖

修改Dockerfile添加coreutils包(提供sha256sum):

FROM varnish:7.0
RUN apt-get update && apt-get install -y --no-install-recommends coreutils && \
    rm -rf /var/lib/apt/lists/*

步骤2:VCL实现逻辑

import std;

sub vcl_recv {
    if (req.http.Client-Cert) {
        # 调用sha256sum计算哈希,处理换行符避免命令执行异常
        set req.http.X-Client-Cert-Hash = std.run("/usr/bin/sha256sum", std.split(req.http.Client-Cert, "\n"));
        # 提取纯哈希值(去除输出末尾的连字符和换行)
        set req.http.X-Client-Cert-Hash = std.strtrim(req.http.X-Client-Cert-Hash, " -\n");
    }
}

sub vcl_hash {
    hash_data(req.url);
    hash_data(req.http.Host);

    if (req.http.X-Client-Cert-Hash) {
        hash_data(req.http.X-Client-Cert-Hash);
    }

    return (lookup);
}

内容的提问来源于stack exchange,提问作者Martynas Jusevičius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:33:21