簡體   English   中英

更新 Google AMP 緩存網址簽名驗證錯誤

[英]Update Google AMP cache URL signature verification error

我正在嘗試在 Google AMP 緩存中更新我的 Google AMP 頁面,但收到 URL 簽名驗證錯誤。

我的代碼:

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)
Dim sig() As Byte = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1)

Dim AMPURLSignature As String = EncodeTo64(sig.ToString)

編碼功能:

Public Shared Function EncodeTo64(ByVal toEncode As String) As String
    Dim toEncodeAsBytes As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode)
    Dim returnValue As String = System.Convert.ToBase64String(toEncodeAsBytes)
    Return returnValue
End Function

我嘗試使用此 URL調用 Google AMP 緩存。

現在,我收到 403 錯誤:

您的客戶無權獲取 URL /update-cache/c/s/www.example.com/articles/278/myarticle/amp?amp_action=flush&amp_ts=1523016476&amp_url_signature=U2lzdGVtLkJ5dGVbdQ。 URL 簽名驗證錯誤。 這就是我們所知道的。

我發現 Google 示例代碼不夠清楚: https : //developers.google.com/amp/cache/update-cache

我的問題圍繞簽名 URL:

  1. 使用文章 AMP URL 還是常規 URL?
  2. 我需要在我的簽名 URL 中包含查詢字符串參數amp_actionamp_ts嗎? 或者我是否在簽署 URL 后添加這些內容?
  3. 我應該將上面的ampBaseUrl到我的signatureUrl變量還是不需要?

更新 1

根據@CodeFuller 的建議,我檢查了 URL 並收到一條Verified OK消息。 我還處理了第 2 步:

  1. APIkeys 匹配: https://www.toptrouwen.nl/.well-known/amphtml/apikey.pub匹配https://www-toptrouwen-nl.cdn.ampproject.org/r/s/www.toptrouwen.nl/ .well-known/amphtml/apikey.pub
  2. 從我的服務器提供 apikey.pub 作為文本/純文本
  3. 通過 https 和公開服務 apikey.pub
  4. 在機器人中添加了禁止:用戶代理:* 禁止:/.well-known/amphtml/apikey.pub

更新 2

是的,新的代碼我也得到Verified OK的驗證。

生成此 URL: https://www-toptrouwen-nl.cdn.ampproject.org/update-cache/c/s/www.toptrouwen.nl/artikelen/132/het-uitwisselen-van-de-trouwringen-hoe-voorkom-je-bloopers/amp?amp_action=flush&_ts=1523138180&_url_signature=tKPO3k624ybwxoEynqN8oI3/UDxhq1TF8jX9aKeVyL0IWLUODXuMB7ansP0t1+/5Lm2V7RYZbUWxt2Whh7+LFEmfQFGJJE/iPtoBVsqrdb5356QwiIrDHOzY+3z5dASZxYlAwlfzUFdonGyDsh/UlCjjvvNahFEWzHOpB5JQxJQ1Wn0kGLQUF1v2u47abbae6cNQBm3YB/0Z1FLfTJLM1oOEOSDh9vQH1SqO/6SoYtUhSQjSrYdl/g5O0QJ7A9pKUxOPfgVJM0l8Sgb66cVeWWoWq0WIFe24RPXUMl9tIFFZ1TY2R+ZpIMvpEAPDjCsdGPo7KTWqGb4qfoTBINJmtQ== : https://www-toptrouwen-nl.cdn.ampproject.org/update-cache/c/s/www.toptrouwen.nl/artikelen/132/het-uitwisselen-van-de-trouwringen-hoe-voorkom-je-bloopers/amp?amp_action=flush&_ts=1523138180&_url_signature=tKPO3k624ybwxoEynqN8oI3/UDxhq1TF8jX9aKeVyL0IWLUODXuMB7ansP0t1+/5Lm2V7RYZbUWxt2Whh7+LFEmfQFGJJE/iPtoBVsqrdb5356QwiIrDHOzY+3z5dASZxYlAwlfzUFdonGyDsh/UlCjjvvNahFEWzHOpB5JQxJQ1Wn0kGLQUF1v2u47abbae6cNQBm3YB/0Z1FLfTJLM1oOEOSDh9vQH1SqO/6SoYtUhSQjSrYdl/g5O0QJ7A9pKUxOPfgVJM0l8Sgb66cVeWWoWq0WIFe24RPXUMl9tIFFZ1TY2R+ZpIMvpEAPDjCsdGPo7KTWqGb4qfoTBINJmtQ==

然后我得到錯誤Required query parameter 'amp_url_signature' missing. (與amp_參數被amp_早期問題有關。

然后我將 URL 參數重命名為它們的正確名稱: https://www-toptrouwen-nl.cdn.ampproject.org/update-cache/c/s/www.toptrouwen.nl/artikelen/132/het-uitwisselen-van-de-trouwringen-hoe-voorkom-je-bloopers/amp?amp_action=flush&amp_ts=1523138180&amp_url_signature=tKPO3k624ybwxoEynqN8oI3/UDxhq1TF8jX9aKeVyL0IWLUODXuMB7ansP0t1+/5Lm2V7RYZbUWxt2Whh7+LFEmfQFGJJE/iPtoBVsqrdb5356QwiIrDHOzY+3z5dASZxYlAwlfzUFdonGyDsh/UlCjjvvNahFEWzHOpB5JQxJQ1Wn0kGLQUF1v2u47abbae6cNQBm3YB/0Z1FLfTJLM1oOEOSDh9vQH1SqO/6SoYtUhSQjSrYdl/g5O0QJ7A9pKUxOPfgVJM0l8Sgb66cVeWWoWq0WIFe24RPXUMl9tIFFZ1TY2R+ZpIMvpEAPDjCsdGPo7KTWqGb4qfoTBINJmtQ== : https://www-toptrouwen-nl.cdn.ampproject.org/update-cache/c/s/www.toptrouwen.nl/artikelen/132/het-uitwisselen-van-de-trouwringen-hoe-voorkom-je-bloopers/amp?amp_action=flush&amp_ts=1523138180&amp_url_signature=tKPO3k624ybwxoEynqN8oI3/UDxhq1TF8jX9aKeVyL0IWLUODXuMB7ansP0t1+/5Lm2V7RYZbUWxt2Whh7+LFEmfQFGJJE/iPtoBVsqrdb5356QwiIrDHOzY+3z5dASZxYlAwlfzUFdonGyDsh/UlCjjvvNahFEWzHOpB5JQxJQ1Wn0kGLQUF1v2u47abbae6cNQBm3YB/0Z1FLfTJLM1oOEOSDh9vQH1SqO/6SoYtUhSQjSrYdl/g5O0QJ7A9pKUxOPfgVJM0l8Sgb66cVeWWoWq0WIFe24RPXUMl9tIFFZ1TY2R+ZpIMvpEAPDjCsdGPo7KTWqGb4qfoTBINJmtQ==

然后我得到: 404 Failed to decode amp_url_signature ,我認為這是因為 URL 中有+\\字符。 當我刪除那些時,我再次收到錯誤URL signature verification error

我不認為 UTC 時間戳目前是一個問題,因為我之前看到過,如果時間戳不正確,Google 會拋出錯誤。

URL signature verification error有兩個最常見的原因:

  1. 簽名計算不正確。

    因此,首先要驗證簽名是否確實有效。 將簽名的 URL 和結果簽名保存到一些文件:

     Dim signatureUrl As String = "/update-cache/c/s/www.example.com/articles/278/myarticle/amp?amp_action=flush&amp_ts=" + tStamp ' ... Dim sig() As Byte = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1) File.WriteAllText("url.txt", signatureUrl) File.WriteAllBytes("signature.bin", sig)

    然后用openssl工具驗證簽名:

    openssl.exe dgst -sha256 -signature signature.bin -verify publickey.pem url.txt

    如果輸出是

    驗證正常

    那么您的簽名就可以了,您應該在其他地方搜索問題(請參閱第 2 項)。

    如果輸出是

    驗證失敗

    那么你應該重新檢查簽名計算的程序。

    上面命令中的 publickey.pem 是 PEM 格式的公鑰。 它應該從以下行開始:

    -----BEGIN PUBLIC KEY-----

    如果您有證書文件(以-----BEGIN CERTIFICATE-----開頭),則可以使用以下命令為其獲取 PEM

    openssl.exe x509 -pubkey -noout -in publickey.cer > publickey.pem

  2. 如果簽名驗證成功,那么您應該檢查您的公鑰是否可以通過 Web 訪問。 更新 AMP 內容聲明以下要求:

    對於簽名驗證,您必須在 AMP 文檔域的固定位置提供公共 RSA 密鑰(要生成密鑰,請參閱生成 RSA 密鑰)。 例如:

    https://example.com/.well-known/amphtml/apikey.pub

    • 公鑰不能被機械化。

    • URL 必須是 HTTPS。

    • 該域必須是您要更新的確切域,而不是子域或超級域。

    • 您必須以 PEM 格式發布密鑰並提供內容類型為“text/plain”的密鑰。

    因此,如果您的 AMP 基本 URL 是https://www.test.com ,請檢查您的公鑰是否可以通過以下 URL 訪問: https://www.test.com/.well-known/amphtml/apikey.pub : https://www.test.com/.well-known/amphtml/apikey.pub

以下是您其他問題的答案:

我需要在我的簽名 URL 中包含查詢字符串參數 amp_action 和 amp_ts 嗎? 或者我是否在簽署 URL 后添加這些內容?

是的,您應該在計算簽名的 URL 中包含amp_actionamp_ts

我應該將上面的 ampBaseUrl 附加到我的 signatureUrl 變量還是不需要?

正如更新 AMP 內容文章所述:

AMP Cache 主機名 (cdn.ampproject.org) 從簽名中排除,以允許向多個 AMP Cache 運營商提交相同的簽名請求。

因此,您不應將ampBaseUrl包含在為其計算簽名的 URL 中。

更新

我在將簽名附加到 URL 的代碼中發現了另一個錯誤:

Dim AMPURLSignature As String = EncodeTo64(sig.ToString)

sig.ToString將導致將"System.Byte[]"字符串傳遞給EncodeTo64 ,而不是實際的簽名字節。 結果不正確的簽名被附加到更新緩存 URL。 用以下EncodeTo64替換上面的調用(不再需要EncodeTo64 ):

Dim AMPURLSignature As String = System.Convert.ToBase64String(sig)

另一個可能的問題是您使用的時間戳不滿足以下要求

該值應以秒為單位的當前時間,必須在當前時間之前或之后的1 分鍾內。

您將DateTime.Now傳遞給GetUnixTimeStampFromDateTime()但它應該是 UTC 時間,而不是本地時間。 嘗試將tStamp計算替換為:

Dim tStamp As String = CInt((DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds).ToString

還要確保在生成后立即調用update-cache URL,以便與時間戳相比,當前時間在 1 分鍾間隔內。 你的系統時間應該是精確的。

請在上述修復后重新檢查簽名驗證是否通過。

更新 2 (關於簽名中的+/字符)

AMP 緩存更新簽名應該采用 base4 編碼的變體:

使用base64網絡安全變體對二進制 RSA 簽名進行編碼

所以另一個必需的修復是用-_替換+/字符。

更改以下調用

Dim AMPURLSignature As String = System.Convert.ToBase64String(sig)

與:

Dim AMPURLSignature As String = ToWebSafeBase64(sig)

' ...

Private Function ToWebSafeBase64([data]() As Byte) As String
    Dim base64 = System.Convert.ToBase64String(data)
    base64 = base64.Replace("+", "-")
    base64 = base64.Replace("/", "_")
    Return base64
End Function

更新 3

以下是應生成正確update-cache URL 的最終代碼(基於可用文檔):

Module MainModule

    Sub Main()

        Dim tStamp As String = CInt((DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds).ToString
        Dim ampBaseUrl = "https://www-toptrouwen-nl.cdn.ampproject.org"
        Dim signatureUrl As String = "/update-cache/c/s/www.toptrouwen.nl/artikelen/132/het-uitwisselen-van-de-trouwringen-hoe-voorkom-je-bloopers?amp_action=flush&amp_ts=" + tStamp

        Dim data() As Byte = System.Text.Encoding.ASCII.GetBytes(signatureUrl)

        Dim certificate = New X509Certificate2("d:\temp\keys\keys.pfx", "12345")
        Dim rsa As RSA = certificate.GetRSAPrivateKey()
        Dim sig() As Byte = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1)

        Dim ampUrlSignature As String = ToWebSafeBase64(sig)
        Dim url As String = ampBaseUrl + signatureUrl + "&amp_url_signature=" + ampUrlSignature

        Console.WriteLine(url)

    End Sub

    Private Function ToWebSafeBase64([data]() As Byte) As String
        Dim base64 = System.Convert.ToBase64String(data)
        base64 = base64.Replace("+", "-")
        base64 = base64.Replace("/", "_")
        Return base64
    End Function

End Module

GitHub 上的示例項目

它產生以下 URL:

https://www-toptrouwen-nl.cdn.ampproject.org/update-cache/c/s/www.toptrouwen.nl/artikelen/132/het-uitwisselen-van-de-trouwringen-hoe-voorkom-je-忌諱?amp_action =平齊&amp_ts = 1523188941&amp_url_signature = bZJTE4IjlxGhlU79etivzUPpGFoyKvCxqPO1IOPHfzDKQVt-fA8Mte20SeXjTQs24Uy4RD9lmbS2aXlcCTpOYatF2l8PQ-31kR-lKVnuduSZIrg93g2YrvO7x-a6dr19hN74LywgBw4C_JfuocCuGfVvr-mD40tuwkBrsLgmI9E =

此簽名已使用 opensll 工具成功驗證,但獲取此 URL 仍會返回URL signature verification error. . 但是現在我們這邊一切似乎都很好。 在 github 上發現了相關問題 AMP 項目貢獻者有以下聲明

首先,我確定 AMP Cache 無法正確處理更新緩存驗證密鑰的 HTTP 刷新:如果您發出更新緩存請求,然后使用不同的密鑰交換 /.well-known/amphtml/apikey.pub,我們無限期地繼續使用舊的密鑰材料。 更糟糕的是,404 響應也被永久緩存:-(

我提交了一份內部錯誤報告,但修復程序可能需要一些時間才能投入生產。 同時,我可以手動刷新無效密鑰。 只需在 GitHub 或 amphtml.slack.com 上給我發送私信即可。 為沒有早點發現這一點而道歉。

似乎這是當前錯誤的根本原因。 您已嘗試在https://www.toptrouwen.nl/.well-known/amphtml/apikey.pub沒有可用公鑰時更新緩存(當我第一次檢查時,它導致 404 錯誤)。 谷歌已經緩存了這個結果,現在即使證書可用,它也沒有實際使用。

似乎此時唯一可能的解決方法是聯系 codewiz 並要求他刷新緩存的密鑰錯誤。 在 AMP 系統使用有效的公鑰之前,無法進行簽名驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM