有没有人使用 .net 真正想出如何成功签署签名以与 CloudFront 私有内容一起使用?经过几天的尝试,我只能得到拒绝访问。
我一直在使用以下代码的变体,还尝试使用 OpenSSL.Net 和 AWSSDK,但它还没有 RSA-SHA1 的签名方法。
签名(数据)看起来像这样
{"Statement":[{"Resource":"http://xxxx.cloudfront.net/xxxx.jpg","Condition":{"DateLessThan":{"AWS:EpochTime":1266922799}}}]}
更新:通过删除上述签名中的一个空格来解决所有这些问题。
要是我早点注意到就好了!
此方法尝试对签名进行签名以在预设 url 中使用。因此,其中的一些变化包括更改 has 中使用的填充,以及在签名之前反转 byte[],因为 OpenSSL 以这种方式执行此操作。
public string Sign(string data)
{
using (SHA1Managed SHA1 = new SHA1Managed())
{
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
RSACryptoServiceProvider.UseMachineKeyStore = false;
// Amazon PEM converted to XML using OpenSslKey
provider.FromXmlString("<RSAKeyValue><Modulus>.....");
byte[] plainbytes = System.Text.Encoding.UTF8.GetBytes(data);
byte[] hash = SHA1.ComputeHash(plainbytes);
//Array.Reverse(sig); // I have see some examples that reverse the hash
byte[] sig = provider.SignHash(hash, "SHA1");
return Convert.ToBase64String(sig);
}
}
需要注意的是,我已通过使用我的 CloudBerry Explorer 生成 CloudFront 预设策略 URL,验证了 S3 和 CloudFront 中的内容设置是否正确。他们是如何做到的呢?
任何想法将不胜感激。谢谢