gpt4 book ai didi

c# - 如何使用固定策略加密 Amazon CloudFront 签名以访问私有(private)内容

转载 作者:太空狗 更新时间:2023-10-29 20:03:55 27 4
gpt4 key购买 nike

有没有使用 .net 的人真正弄清楚如何成功签署签名以用于 CloudFront 私有(private)内容?经过几天的尝试,我只能得到拒绝访问。

我一直在使用以下代码的变体,也尝试使用 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 中的内容是否正确设置。他们是怎么做到的?

任何想法将不胜感激。谢谢

最佳答案

如果有人感兴趣,这里是完整的代码:

internal class CloudFrontSecurityProvider
{
private readonly RSACryptoServiceProvider privateKey;
private readonly string privateKeyId;
private readonly SHA1Managed sha1 = new SHA1Managed();

public CloudFrontSecurityProvider(string privateKeyId, string privateKey)
{
this.privateKey = new RSACryptoServiceProvider();
RSACryptoServiceProvider.UseMachineKeyStore = false;

this.privateKey.FromXmlString( privateKey );
this.privateKeyId = privateKeyId;
}
private static int GetUnixTime(DateTime time)
{
DateTime referenceTime = new DateTime(1970, 1,1);
return (int) (time - referenceTime).TotalSeconds;

}

public string GetCannedUrl(string url, DateTime expiration)
{

string expirationEpoch = GetUnixTime( expiration ).ToString();

string policy =
@"{""Statement"":[{""Resource"":""<url>"",""Condition"":{""DateLessThan"":{""AWS:EpochTime"":<expiration>}}}]}".
Replace( "<url>", url ).
Replace( "<expiration>", expirationEpoch );


string signature = GetUrlSafeString( Sign( policy ) );

return url + string.Format("?Expires={0}&Signature={1}&Key-Pair-Id={2}", expirationEpoch, signature, this.privateKeyId);
}

private static string GetUrlSafeString(byte[] data)
{
return Convert.ToBase64String( data ).Replace( '+', '-' ).Replace( '=', '_' ).Replace( '/', '~' );
}

private byte[] Sign(string data)
{
byte[] plainbytes = Encoding.UTF8.GetBytes(data);

byte[] hash = sha1.ComputeHash(plainbytes);

return this.privateKey.SignHash(hash, "SHA1");
}

}

关于c# - 如何使用固定策略加密 Amazon CloudFront 签名以访问私有(private)内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2284206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com