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

如何在Java/SpringBoot API中生成GCP文件下载签名URL?

在Java中生成GCP存储签名URL(含x-goog-signature生成)

一、推荐方式:使用官方Cloud Storage客户端库

官方库会自动处理所有签名逻辑,包括x-goog-signature的生成,无需手动计算,简单且不易出错。

1. 添加依赖(Maven)

<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-storage</artifactId>
    <version>2.20.0</version> <!-- 使用最新稳定版 -->
</dependency>

2. 生成签名URL的代码示例

import com.google.cloud.storage.Blob;
import com.google.cloud.storage.BlobId;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import java.net.URL;
import java.util.concurrent.TimeUnit;

public class GcsSignedUrlGenerator {
    public static void main(String[] args) {
        // 替换为你的存储桶和对象名称
        String bucketName = "test_bucket";
        String objectName = "Test_Document.xlsx";
        // 过期时间和示例一致,30分钟(1800秒)
        long expirationSeconds = 1800;

        // 初始化Storage客户端(默认会加载本地服务账号密钥,或使用GCP环境内置凭证)
        Storage storage = StorageOptions.getDefaultInstance().getService();
        BlobId blobId = BlobId.of(bucketName, objectName);
        Blob blob = storage.get(blobId);

        // 生成签名URL
        URL signedUrl = blob.signUrl(expirationSeconds, TimeUnit.SECONDS);
        System.out.println("生成的签名URL:" + signedUrl.toString());
    }
}

运行后输出的URL会包含所有必要查询参数,和gsutil生成的格式完全一致。


二、手动生成x-goog-signature(仅用于理解原理)

如果必须手动构造查询字符串,需严格遵循GCP V4签名算法步骤,核心流程如下:

1. 准备基础参数

和你提供的示例保持一致:

  • 算法:GOOG4-RSA-SHA256
  • 请求日期:20220809T134421Z(UTC格式,精确到秒)
  • 凭证:abc.gserviceaccount.com%2F202208(服务账号邮箱 + 日期前缀YYYYMM)
  • 过期时间:1800(秒)
  • 签名头部:host

2. 构造待签名的字符串

待签名字符串必须严格按以下格式拼接(注意换行和空行):

GET
/test_bucket/Test_Document.xlsx

host:storage.googleapis.com
x-goog-date:20220809T134421Z

host;x-goog-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

说明:

  • 第一行是HTTP请求方法(GET)
  • 第二行是对象的完整路径(/存储桶名/对象名)
  • 第三行是空行(GET请求无请求参数,留空)
  • 接下来是签名头部的键值对,按字母排序(这里host在前)
  • 空行分隔头部和签名头部列表
  • 签名头部列表用分号分隔,按字母排序
  • 最后一行是空请求体的SHA256哈希值(固定为上述字符串)

3. 生成签名密钥

使用服务账号的RSA私钥,通过多轮HMAC-SHA256派生签名密钥:

  1. 第一步:密钥为GOOG4 + 服务账号私钥字节,消息为日期前缀20220809(x-goog-date的YYYYMMDD部分)
  2. 第二步:用第一步的结果作为密钥,消息为存储桶所在区域(例如us-central1)
  3. 第三步:用第二步的结果作为密钥,消息为storage
  4. 第四步:用第三步的结果作为密钥,消息为goog4_request

4. 计算x-goog-signature

用上述派生的签名密钥,对待签名字符串执行HMAC-SHA256哈希,将结果转为十六进制字符串,就是x-goog-signature的值。


注意事项

手动实现签名极易出错(比如日期格式、头部排序、哈希计算细节),生产环境强烈推荐使用官方客户端库。

内容的提问来源于stack exchange,提问作者Tinku

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 00:45:12