.net を使用している人は、CloudFront プライベート コンテンツで使用する署名に署名する方法を実際に考え出したことがありますか? 数日間試行した後、アクセスが拒否されました。
私は次のコードのバリエーションを使用しており、OpenSSL.Net と AWSSDK も使用してみましたが、RSA-SHA1 の署名方法はまだありません。
署名(データ)は次のようになります
{"Statement":[{"Resource":"http://xxxx.cloudfront.net/xxxx.jpg","Condition":{"DateLessThan":{"AWS:EpochTime":1266922799}}}]}
更新: 上記の署名で単一のスペースを削除することで、これらすべてを解決しました。
もっと早く気づいていれば!
このメソッドは、既定の URL で使用する署名に署名しようとします。そのため、バリエーションには、has で使用されるパディングのチャンディングと、明らかに OpenSSL がこのように行うように署名する前に byte[] を反転することが含まれています。
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 で正しくセットアップされていることを確認したことに注意してください。どうやってやっているの?
どんなアイデアでも大歓迎です。ありがとう