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

ASP.NET:从文件读取公私钥签名URL以更新Google AMP缓存

我刚好处理过类似的场景,给你一套完整的Windows/IIS环境下不依赖系统证书存储的AMP缓存更新URL签名方案:

1. 生成独立的RSA密钥对(不碰系统证书存储)

你可以用OpenSSL工具生成密钥对(Windows上可以安装Git自带的OpenSSL,或者单独下载OpenSSL二进制包),执行以下命令:

  • 生成2048位私钥:openssl genrsa -out private_key.pem 2048
  • 从私钥导出公钥:openssl rsa -in private_key.pem -pubout -out public_key.pem

生成后,把public_key.pem的内容部署到你的域名的.well-known/amphtml/apikey.pub路径下(比如https://yourdomain.com/.well-known/amphtml/apikey.pub),这是Google验证签名合法性的必要步骤。

2. .NET代码中加载私钥并签名AMP URL

我们用BouncyCastle库来处理PEM格式的私钥(比自己解析简单),先通过NuGet安装:Install-Package Org.BouncyCastle

然后用下面的代码实现签名逻辑:

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Security;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

public static string GenerateSignedAmpCacheUrl(string targetAmpUrl, string privateKeyFilePath)
{
    // 构造AMP缓存要求的待签名字符串
    var uri = new Uri(targetAmpUrl);
    var pathToSign = $"/update-cache/c/s/{uri.Host}{uri.AbsolutePath}";

    // 加载PEM私钥
    AsymmetricPrivateKeyParameter privateKey;
    using (var reader = new StreamReader(privateKeyFilePath))
    {
        var pemReader = new PemReader(reader);
        privateKey = (AsymmetricPrivateKeyParameter)pemReader.ReadObject();
    }

    // 转换为.NET原生RSA对象
    var rsaParams = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)privateKey);
    using (var rsa = new RSACryptoServiceProvider())
    {
        rsa.ImportParameters(rsaParams);

        // SHA256签名
        var dataBytes = Encoding.UTF8.GetBytes(pathToSign);
        var signatureBytes = rsa.SignData(dataBytes, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);

        // 转换为AMP要求的Base64URL格式(替换特殊字符,去掉末尾等号)
        var base64Signature = Convert.ToBase64String(signatureBytes);
        var base64UrlSignature = base64Signature.Replace('+', '-').Replace('/', '_').TrimEnd('=');

        // 拼接最终的缓存更新URL
        return $"https://cdn.ampproject.org{pathToSign}?amp_action=flush&amp_url_signature={base64UrlSignature}";
    }
}
3. IIS环境下的部署注意事项
  • 把private_key.pem放在网站的App_Data文件夹下(IIS默认禁止外部访问这个目录,安全性更高)
  • 读取私钥时用Server.MapPath("~/App_Data/private_key.pem")获取文件路径
  • 给App_Data文件夹添加应用程序池身份的读取权限(比如IIS AppPool\YourAppPoolName),避免权限不足无法读取私钥
关键验证点
  • 确保待签名的路径完全符合格式:/update-cache/c/s/[域名][AMP页面路径],不能有多余的查询参数或空格
  • 公钥必须正确部署到.well-known路径,Google会自动抓取验证
  • 签名后的URL可以直接访问,访问后Google AMP缓存会在数分钟内更新对应页面

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:10:08