更新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&_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}&_signature={urlSafeSignature}"
额外验证步骤
- 检查证书:确保你使用的是在Google Search Console中配置的AMP专用证书,私钥未过期且为RSA类型;
- 对比签名结果:可以用OpenSSL工具手动生成签名和代码结果对比,验证逻辑是否正确:
echo -n "/update-cache/c/s/www.example.com/articles/278/myarticle/amp?amp_action=flush&_ts=1699999999" | openssl dgst -sha256 -sign your-private-key.pem | base64 | tr '+/=' '-_ ' | sed 's/ //g' - 测试时间戳:用在线工具确认你的时间戳是当前UTC的秒级时间,避免服务器时间偏差过大导致验证失败。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

