Как зашифровать подпись Amazon CloudFront для доступа к частному контенту с помощью стандартной политики - PullRequest
7 голосов
/ 17 февраля 2010

Кто-нибудь, использующий .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. Как они это делают?

Любые идеи будут высоко оценены. Спасибо

Ответы [ 3 ]

7 голосов
/ 30 марта 2010

Вот полный код, если кто-то заинтересован:

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");
    }

}
3 голосов
/ 08 мая 2013

Теперь вы можете сделать это с помощью SDK:

http://docs.aws.amazon.com/sdkfornet/v3/apidocs/Index.html

Перейдите к Amazon.CloudFront > AmazonCloudFrontUrlSigner

3 голосов
/ 17 января 2011

Я сделал сообщение в блоге о том, что мне нужно было сделать, чтобы оно заработало:

http://anthonyvscode.com/2011/01/11/using-amazon-s3-cloudfront-to-distribute-your-private-files/

может помочь другим попытаться решить проблемы, с которыми я столкнулся при запуске и запуске

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...