I\'m making a HttpWebRequest to S3, and I\'m trying to set the Date header to something like this:
\"Mon, 16 Jul 2012 01:16:18 -0000\"
You should use "X-Amz-Date" header.
public void GetObject(string AccessKeyID, string SecretKey){
/*objectKey = folder/folder/filename.zzz*/
var url = "http://somehost/bucket/objectkey"
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
/*Fiddler proxy*/
/*request.Proxy = new WebProxy("http://127.0.0.1:8888");*/
request.Headers.Add("X-Amz-Date",String.Format("{0:ffffd,' 'dd' 'MMM' 'yyyy' 'HH':'mm':'ss' 'K}", DateTime.Now));
request.Headers.Add("Authorization", $"AWS {AccessKeyID}:{SignAuthorizationString(request, SecretKey)}");
WebResponse response = request.GetResponse();
}
private string SignAuthorizationString(HttpWebRequest request, string SecretKey){
//TODO: DOCS - http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html
string canonicalizedResource = request.RequestUri.PathAndQuery;
string canonicalizedAmzHeaders = ComposeSignatureAmzHeadersForSigning(request);
string stringToSign = request.Method + "\n"
+ request.Headers.Get("Content-MD5") + "\n"
+ request.ContentType + "\n"
+ request.Headers.Get("Date") + "\n" /*Here the date will be blank*/
+ canonicalizedAmzHeaders + canonicalizedResource;
return GetSignedMessage(SecretKey, stringToSign);
}
private string ComposeSignatureAmzHeadersForSigning(HttpWebRequest request){
SortedDictionary headersDictionary = new SortedDictionary(StringComparer.OrdinalIgnoreCase);
foreach (string _key in request.Headers.Keys)
{
key = _key.ToLower();
if (key.StartsWith("x-amz"))
{
if ("x-amz-meta-reviewedby".Equals(key))
{
if (headersDictionary.ContainsKey(key))
headersDictionary[key] = headersDictionary[key] + "," + request.Headers[key];
else
headersDictionary[key] = request.Headers[key];
}
else
headersDictionary[key] = request.Headers.Get(key);
}
}
StringBuilder stringBuilder = new StringBuilder();
foreach (var pair in headersDictionary)
{
stringBuilder.Append(pair.Key)
.Append(":")
.Append(pair.Value)
.Append("\n");
}
return stringBuilder.ToString();
}
private static string GetSignedMessage(string key, string message){
var crypt = HMACSHA1.Create();
crypt.Key = Encoding.ASCII.GetBytes(key);
crypt.ComputeHash(Encoding.UTF8.GetBytes(message));
return Convert.ToBase64String(crypt.Hash);
}