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

更新Google AMP缓存时出现URL签名验证错误求助

解决Google AMP缓存更新时的URL签名验证错误

兄弟,我帮你捋捋这个AMP缓存更新的签名问题——我之前也踩过类似的坑,这类验证错误基本都出在几个关键环节上,咱们一步步拆解:

首先先把你贴的代码片段补全并规范格式,方便排查:

Dim tStamp As String = GetUnixTimeStampFromDateTime(DateTime.Now).ToString()
Dim ampBaseUrl As String = "https://www-example-com.cdn.ampproject.org"
Dim signatureUrl As String = "/update-cache/c/s/www.example.com/articles/278/myarticle/amp?amp_action=flush&amp_ts=" + tStamp
Dim rsa As RSA = certificate.GetRSAPrivateKey()
Dim data() As Byte = System.Text.Encoding.Unicode.GetBytes(signatureUrl)
' (后续签名生成和URL拼接代码)

最可能的几个问题点及修复方案

  • 编码格式错误:你用了System.Text.Encoding.Unicode(也就是UTF-16)来转换签名数据,但AMP官方要求必须用UTF-8编码,这是最常见的触发验证失败的原因!直接把编码换成System.Text.Encoding.UTF8就能解决一大半问题。

  • 时间戳不规范:AMP要求的是秒级Unix时间戳,如果你的GetUnixTimeStampFromDateTime方法返回的是毫秒级时间戳,会导致时间戳无效。建议直接用UTC时间生成,避免时区问题:

    Dim tStamp As String = Math.Floor(DateTime.UtcNow.Subtract(New DateTime(1970, 1, 1)).TotalSeconds).ToString()
    
  • 签名生成与编码不符合规范:AMP要求签名必须用SHA256withRSA算法,并且签名结果要做URL安全的Base64编码——把+替换成-,/替换成_,去掉末尾的=符号。你需要确保签名后的处理逻辑符合这个要求:

    ' 生成SHA256withRSA签名
    Dim signatureBytes As Byte() = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1)
    ' 转换为URL安全Base64
    Dim signatureBase64 As String = Convert.ToBase64String(signatureBytes)
    signatureBase64 = signatureBase64.Replace("+", "-").Replace("/", "_").TrimEnd("="c)
    
  • URL参数顺序与格式问题:待签名的URL参数必须严格按字母升序排列,并且不能有多余的转义字符。比如amp_action要在amp_ts前面(刚好你的代码里是对的,但要确保没有额外的空格或错误的&转义——在代码里直接用&拼接参数即可,不要用HTML转义的&)。

完整修正后的代码示例

' 生成标准秒级Unix时间戳(UTC时间)
Dim tStamp As String = Math.Floor(DateTime.UtcNow.Subtract(New DateTime(1970, 1, 1)).TotalSeconds).ToString()
Dim ampCacheDomain As String = "https://www-example-com.cdn.ampproject.org"
' 原始AMP页面的路径(不带域名)
Dim rawAmpPath As String = "/articles/278/myarticle/amp"
' 按字母顺序排列的查询参数
Dim queryString As String = $"amp_action=flush&amp_ts={tStamp}"
' 待签名的完整路径(AMP要求的格式)
Dim signatureTarget As String = $"/update-cache/c/s/www.example.com{rawAmpPath}?{queryString}"

' 1. 用UTF-8编码转换待签名数据
Dim dataBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(signatureTarget)

' 2. 用私钥生成SHA256withRSA签名
Dim rsa As RSA = certificate.GetRSAPrivateKey()
Dim signatureBytes As Byte() = rsa.SignData(dataBytes, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1)

' 3. 转换为URL安全的Base64编码
Dim urlSafeSignature As String = Convert.ToBase64String(signatureBytes)
urlSafeSignature = urlSafeSignature.Replace("+", "-").Replace("/", "_").TrimEnd("="c)

' 4. 构造最终的缓存更新URL
Dim finalFlushUrl As String = $"{ampCacheDomain}{signatureTarget}&amp_signature={urlSafeSignature}"

额外验证步骤

  1. 检查证书:确保你使用的是在Google Search Console中配置的AMP专用证书,私钥未过期且为RSA类型;
  2. 对比签名结果:可以用OpenSSL工具手动生成签名和代码结果对比,验证逻辑是否正确:
    echo -n "/update-cache/c/s/www.example.com/articles/278/myarticle/amp?amp_action=flush&amp_ts=1699999999" | openssl dgst -sha256 -sign your-private-key.pem | base64 | tr '+/=' '-_ ' | sed 's/ //g'
    
  3. 测试时间戳:用在线工具确认你的时间戳是当前UTC的秒级时间,避免服务器时间偏差过大导致验证失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:31:02