几个月来,我一直在使用 Google Cloud CDN 缓存 GCS 存储桶中的内容。直到昨天(2019/09/19),我注意到我无法访问名称中包含空格的对象。通常,我encodeURIComponent
在签署整个 URL 之前申请对象的名称,直到昨天它一直运行良好。
这是我迄今为止尝试过的gcloud
实用程序:
对 URL 进行签名,而不对文件名进行 URL 编码:
$ gcloud compute sign-url --key-name my-key --key-file my-key --expires-in 15m "https://cdn.example.com/file-with-white space.txt"
然后我访问了带有和不带有
%20
. 结果是403,如图所示。使用 URL 编码文件的名称对 URL 进行签名(这是我几个月来一直在做的事情,而且效果很好):
$ gcloud compute sign-url --key-name my-key --key-file my-key --expires-in 15m "https://cdn.example.com/file-with-white%20space.txt"
结果也是 403 但有不同的消息:
匿名调用者没有 storage.objects.get 访问存储桶/文件名的权限
我还尝试使用此链接中的 Go 代码。结果是一样的。
请注意,名称中没有空格的文件仍然可以通过 CDN 成功访问。
更新
- 澄清一下,我认为 CDN 的行为已经改变。
- 我已授予 CDN 访问 GCS 存储桶的权限。这就是为什么 CDN 之前可以正常工作的原因。我实际上已经跑
gsutil iam ch serviceAccount:service-PROJECT_NUM@cloud-cdn-fill.iam.gserviceaccount.com:objectViewer gs://[BUCKET]
了两次来确保这一点。 - 我曾尝试
gsutil
直接使用而不使用 CDN 对 GCS URL 进行签名,并且签名的 URL 有效。
更新 2
我已经尝试了该--validate
选项。这就是我得到的:
$ gcloud compute sign-url --key-name cdn-signing-key \
--key-file cdn-signing-key --expires-in 15m \
--validate "https://cdn.domain.com/file%20with%20space"
signedUrl: https://cdn.domain.com/file%20with%20space?Expires=1569075302&KeyName=cdn-signing-key&Signature=e3SANudKHIT5txHWVlO1oijItXw=
validationResponseCode: 200
然而,通过浏览器访问“signedUrl”时,我仍然收到 403。结果是一个带有<Code>AccessDenied</Code>
.