Esta é uma maneira simples de gerar uma solicitação assinada para objetos no Amazon S3:
//request variables:
$awsKeyId = AWS_KEY_ID;
$awsSecret = AWS_SECRET;
$expires = time() + (5*60);
$httpVerb = "GET";
$contentMD5 = "";
$contentType = "";
$amzHeaders = "";
$amzResource = "/BUCKETNAME/" . $filename;
//request to be signed:
$request = sprintf("%sn%sn%sn%sn%s%s" , $httpVerb , $contentMD5 , $contentType , $expires , $amzHeaders , $amzResource );
//signing:
$base64signed = base64_encode( hash_hmac( 'sha1' , $request, $awsSecret , true ) );
//the final url:
$url = "http://s3.amazonaws.com%s?AWSAccessKeyId=%s&Expires=%s&Signature=%s";
$url = sprintf( $url , $amzResource , $awsKeyId , $expires , $base64signed );
O link final ficará disponível por apenas 5 minutos, olhe em $expires
.
O $httpVerb
pode ser alternado para HEAD se você quiser apenas verificar se a chave existe.
Este código é baseado em um exemplo de python que encontrei outro dia.