Кто-нибудь, использующий .net, действительно придумал, как успешно подписать подпись для использования с частным контентом CloudFront? После нескольких дней попыток все, что я могу получить, - Доступ запрещен.
Я работал с вариантами следующего кода, а также пытался использовать OpenSSL.Net и AWSSDK, но у него пока нет метода подписи для RSA-SHA1.
Подпись (данные) выглядит так
{"Statement":[{"Resource":"http://xxxx.cloudfront.net/xxxx.jpg","Condition":{"DateLessThan":{"AWS:EpochTime":1266922799}}}]}
Обновление: все это решено путем удаления одного пробела в подписи выше.
Если бы я только заметил это раньше!
Этот метод пытается подписать подпись для использования в постоянном URL. Таким образом, в число вариантов входит изменение заполнения, используемого в has, а также обращение байта [] до подписания, так как 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);
}
}
Полезно отметить, что я проверил правильность настройки контента в S3 и CloudFront, сгенерировав стандартный URL-адрес CloudFront с помощью моего CloudBerry Explorer. Как они это делают?
Любые идеи будут высоко оценены. Спасибо