PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → API SIGNATURE V4 AMAZON
API SIGNATURE V4 AMAZON
Débuté par gshunway, 27 déc. 2021 07:44 - 22 réponses
Posté le 27 décembre 2021 - 07:44
Bonjour,

Nous venons vers la communauté pour votre aide sur un problème déjà identifié sur ce forum mais sans réponse.
Nous basculons nos applications qui dialoguent avec AWS V2 vers SP-API de AMAZON.
Obligation faite par l'obsolescence de AWS V2 qui arrive bientôt.

Nous rencontrons un problème lors du Hash en HMAC_SHA_256 d'une chaine.
La signature finale calculée par le code de test ci-dessous ne correspond pas à la signature attendue fournie par la Spec Amazon.

Pour simplifier notre requête de test, nous utilisons les données de la spécification AMAZON que vous pouvez trouver aux adresses ci-dessous (voir code).
Pour résumer :
Nous avons une chaine de test.
Nous avons la clé.
Nous avons la signature attendue.
Nous connaissons l'algo.
Nous devons avec notre code retrouver la même signature

Protocole de test :
Utilisation de WINDEV 25 dans sa dernière mise à jour.
Projet créé uniquement pour ce test en 32 et 64 bits
Projet en ANSI
PC sous Windows 11 (Non testé sur Windows 10 ou inférieur)
Création d'une fenêtre simple avec un bouton et le code ci-dessous.

Nous avons aussi testé la chaine, sa clé et son algo en ligne sur :
https://fr.rakko.tools/tools/10/
La chaine retournée correspond à la chaine de notre code.

Piste d'erreur :
Mauvaise interprétation du caractère "\n" ou caract(10) dans la chaine de base en Hash de notre code.
Le calcul de Amazon dans sa spec est peut être faux (nous avons envoyé une demande d'info à notre contact Amazon).
La fonction Hash de Windev en défaut.

Merci pour votre aide.

Code :
//Fin de ligne soit testée avec Caract(10), soit testé avec "\n"
M_LF est une chaîne =Caract(10) //"\n"

//Exemple de chaine canonique fournie dans la spec AMAZON https://docs.aws.amazon.com/fr_fr/general/latest/gr/sigv4-create-string-to-sign.html
Machaine est une chaîne ="AWS4-HMAC-SHA256"+M_LF...
+"20150830T123600Z"+M_LF...
+"20150830/us-east-1/iam/aws4_request"+M_LF...
+"f536975d06c0309214f805bb90ccff089219ecd68b2577efef23edd43b7e1a59"

//Clé dérivée fournie dans la spec AMAZON https://docs.aws.amazon.com/fr_fr/general/latest/gr/sigv4-calculate-signature.html
MaCle est une chaîne ="c4afb1cc5771d871763a393e44b703571b55cc28424d1a5e86da6ed3c154a4b9"

//Hash de la chaine selon Algo (voir spec) et sa clé
MBuff est un Buffer
//Test avec UTF8 ou sans pour blinder nos tests
MBuff=HashChaîne(HA_HMAC_SHA_256,ChaîneVersUTF8(Machaine),ChaîneVersUTF8(MaCle))
//MBuff=HashChaîne(HA_HMAC_SHA_256,Machaine,MaCle)
//On transforme en HEXA pour lecture des caractères non imprimables et aussi demandé dans la spec AMAZON
MaSignature est une chaîne =Remplace(Minuscule(BufferVersHexa(MBuff,1,32))," ","")
//Affichage
Trace(MaSignature)
//Signature retournée par ce code = fe52b221b5173b501c9863cec59554224072ca34c1c827ec5fb8a257f97637b1

//Signature attendue donnée dans la Spec Amazon sur la base de la chaine et clé fournies dans cette même spec (Voir lien de spec ci-dessus)
//Signature attendue = 5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7
Posté le 27 décembre 2021 - 10:46
Bonjour,

Je ne vois pas d'erreur sur votre code, dans mon cas je ne met pas les ChaineVersUTF8 dans le calcul de la signature
Je met ci-dessous le code que j'utilise en AWS4 pour nos connexion S3

Bon courage,

Franck R.

PROCÉDURE pglb_EnteteAWS4(sReqType est une chaîne, sURL est une chaîne, sTmpParam est une chaîne, sNomBucket est une chaîne, sWebUrl est une chaîne, sHashSHA est une chaîne)
sDateUTC est une chaîne
sDateJour est une chaîne
sSection est une chaîne
sFinal est une chaîne
sCanonic est une chaîne
sTmp est une chaîne
AWS_RC est une chaîne = Caract(10)
sSignature est une chaîne
sEnteteHTTP est une chaîne

sAWS_REGION est une chaîne
sAWS_PM_PAS est une chaîne
sAWS_PM_LOG est une chaîne

sAWS_PM_LOG = "votre login AWS"
sAWS_PM_PAS = "votre mot de passe AWS"
sAWS_REGION = "us-east-1"

sDateUTC = interne_DateHeureVersISO8601()
sDateJour = DateDuJour()
sSection = "s3" // ou autre service "iam"
sFinal = "aws4_request"

SELON sReqType
CAS "GET"
// Requête de type GET
sCanonic = "GET" + AWS_RC + sURL + AWS_RC + sTmpParam + AWS_RC + ...
"host:" + sNomBucket + "." + sWebUrl + AWS_RC + ...
"x-amz-date:" + sDateUTC + AWS_RC + ...
AWS_RC + "host;x-amz-date" + AWS_RC + interne_CalculHashSha256("")

CAS "PUT"
// Requête de type PUT, POST, PATCH...
sCanonic = "PUT" + AWS_RC + sURL + AWS_RC + "" + AWS_RC + ...
"host:" + sNomBucket + "." + sWebUrl + AWS_RC + ...
"x-amz-content-sha256:" + sHashSHA + AWS_RC + ...
"x-amz-date:" + sDateUTC + AWS_RC + ...
AWS_RC + "host;x-amz-content-sha256;x-amz-date" + AWS_RC + sHashSHA

AUTRE CAS

FIN

sTmp = "AWS4-HMAC-SHA256" + AWS_RC + sDateUTC + AWS_RC + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + AWS_RC + ...
interne_CalculHashSha256(sCanonic, Faux)

sSignature = interne_AWS4_SigDerivee("s3")
sSignature = HashChaîne(HA_HMAC_SHA_256, sTmp, sSignature)

SELON sReqType
CAS "GET"
// Chaine à transmettre dans l'entête
sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ...
"x-amz-content-sha256:" + interne_CalculHashSha256("") + RC + ...
"Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ...
", SignedHeaders=host;x-amz-date, Signature=" + interne_Hexa(sSignature)

CAS "PUT"
sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ...
"x-amz-content-sha256:" + sHashSHA + RC + ...
"Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ...
", SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=" + interne_Hexa(sSignature)

AUTRE CAS

FIN

RENVOYER sEnteteHTTP


PROCÉDURE INTERNE interne_CalculHashSha256(LOCAL sData est une chaîne, bIsFile est un booléen = Faux)
sSigningKey est une chaîne

SI bIsFile = Vrai ALORS
sSigningKey = HashFichier(HA_SHA_256, sData)
SINON
sSigningKey = HashChaîne(HA_SHA_256, sData)
FIN
RENVOYER interne_Hexa(sSigningKey)
FIN

PROCÉDURE INTERNE interne_Hexa(sData est une chaîne, sSepFin est une chaîne = "")
sSign est une chaîne
nInd est un entier
nVal est un entier

sSign = ""
POUR nInd = 1 _À_ Taille(sData)
nVal = Asc(sData[[nInd]])
sSign += NumériqueVersChaîne(nVal, "02x") + sSepFin
FIN

RENVOYER sSign
FIN

PROCÉDURE INTERNE interne_DateHeureVersISO8601()
// Conversion de l'heure locale en heure UTC
dhDateHeure est un DateHeure

AWS_ISO8601_FORMAT est une chaîne = "%1%2%3T%4%5%6Z"

dhUTC est un DateHeure = DateHeureLocaleVersUTC(dhDateHeure)

sDateHeureIso est une chaîne = ChaîneConstruit(AWS_ISO8601_FORMAT,...
NumériqueVersChaîne(dhUTC..Année,"04d"),...
NumériqueVersChaîne(dhUTC..Mois,"02d"),...
NumériqueVersChaîne(dhUTC..Jour,"02d"),...
NumériqueVersChaîne(dhUTC..Heure,"02d"),...
NumériqueVersChaîne(dhUTC..Minute,"02d"),...
NumériqueVersChaîne(dhUTC..Seconde,"02d"),...
NumériqueVersChaîne(dhUTC..Milliseconde,"03d"))

RENVOYER sDateHeureIso
FIN

PROCÉDURE INTERNE interne_AWS4_SigDerivee(sMethode est une chaîne)
sDateKey est une chaîne
sDateRegionKey est une chaîne
sDateRegionServiceKey est une chaîne
sSigningKey est une chaîne

sDateKey = HashChaîne(HA_HMAC_SHA_256, DateDuJour(), "AWS4"+ sAWS_PM_PAS)
sDateRegionKey = HashChaîne(HA_HMAC_SHA_256, sAWS_REGION, sDateKey)
sDateRegionServiceKey = HashChaîne(HA_HMAC_SHA_256, sMethode, sDateRegionKey)
sSigningKey = HashChaîne(HA_HMAC_SHA_256, "aws4_request", sDateRegionServiceKey)

RENVOYER sSigningKey
FIN
Posté le 27 décembre 2021 - 10:46
Bonjour,

Je ne vois pas d'erreur sur votre code, dans mon cas je ne met pas les ChaineVersUTF8 dans le calcul de la signature
Je met ci-dessous le code que j'utilise en AWS4 pour nos connexion S3

Bon courage,

Franck R.

PROCÉDURE pglb_EnteteAWS4(sReqType est une chaîne, sURL est une chaîne, sTmpParam est une chaîne, sNomBucket est une chaîne, sWebUrl est une chaîne, sHashSHA est une chaîne)
sDateUTC est une chaîne
sDateJour est une chaîne
sSection est une chaîne
sFinal est une chaîne
sCanonic est une chaîne
sTmp est une chaîne
AWS_RC est une chaîne = Caract(10)
sSignature est une chaîne
sEnteteHTTP est une chaîne

sAWS_REGION est une chaîne
sAWS_PM_PAS est une chaîne
sAWS_PM_LOG est une chaîne

sAWS_PM_LOG = "votre login AWS"
sAWS_PM_PAS = "votre mot de passe AWS"
sAWS_REGION = "us-east-1"

sDateUTC = interne_DateHeureVersISO8601()
sDateJour = DateDuJour()
sSection = "s3" // ou autre service "iam"
sFinal = "aws4_request"

SELON sReqType
CAS "GET"
// Requête de type GET
sCanonic = "GET" + AWS_RC + sURL + AWS_RC + sTmpParam + AWS_RC + ...
"host:" + sNomBucket + "." + sWebUrl + AWS_RC + ...
"x-amz-date:" + sDateUTC + AWS_RC + ...
AWS_RC + "host;x-amz-date" + AWS_RC + interne_CalculHashSha256("")

CAS "PUT"
// Requête de type PUT, POST, PATCH...
sCanonic = "PUT" + AWS_RC + sURL + AWS_RC + "" + AWS_RC + ...
"host:" + sNomBucket + "." + sWebUrl + AWS_RC + ...
"x-amz-content-sha256:" + sHashSHA + AWS_RC + ...
"x-amz-date:" + sDateUTC + AWS_RC + ...
AWS_RC + "host;x-amz-content-sha256;x-amz-date" + AWS_RC + sHashSHA

AUTRE CAS

FIN

sTmp = "AWS4-HMAC-SHA256" + AWS_RC + sDateUTC + AWS_RC + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + AWS_RC + ...
interne_CalculHashSha256(sCanonic, Faux)

sSignature = interne_AWS4_SigDerivee("s3")
sSignature = HashChaîne(HA_HMAC_SHA_256, sTmp, sSignature)

SELON sReqType
CAS "GET"
// Chaine à transmettre dans l'entête
sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ...
"x-amz-content-sha256:" + interne_CalculHashSha256("") + RC + ...
"Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ...
", SignedHeaders=host;x-amz-date, Signature=" + interne_Hexa(sSignature)

CAS "PUT"
sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ...
"x-amz-content-sha256:" + sHashSHA + RC + ...
"Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ...
", SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=" + interne_Hexa(sSignature)

AUTRE CAS

FIN

RENVOYER sEnteteHTTP


PROCÉDURE INTERNE interne_CalculHashSha256(LOCAL sData est une chaîne, bIsFile est un booléen = Faux)
sSigningKey est une chaîne

SI bIsFile = Vrai ALORS
sSigningKey = HashFichier(HA_SHA_256, sData)
SINON
sSigningKey = HashChaîne(HA_SHA_256, sData)
FIN
RENVOYER interne_Hexa(sSigningKey)
FIN

PROCÉDURE INTERNE interne_Hexa(sData est une chaîne, sSepFin est une chaîne = "")
sSign est une chaîne
nInd est un entier
nVal est un entier

sSign = ""
POUR nInd = 1 _À_ Taille(sData)
nVal = Asc(sData[[nInd]])
sSign += NumériqueVersChaîne(nVal, "02x") + sSepFin
FIN

RENVOYER sSign
FIN

PROCÉDURE INTERNE interne_DateHeureVersISO8601()
// Conversion de l'heure locale en heure UTC
dhDateHeure est un DateHeure

AWS_ISO8601_FORMAT est une chaîne = "%1%2%3T%4%5%6Z"

dhUTC est un DateHeure = DateHeureLocaleVersUTC(dhDateHeure)

sDateHeureIso est une chaîne = ChaîneConstruit(AWS_ISO8601_FORMAT,...
NumériqueVersChaîne(dhUTC..Année,"04d"),...
NumériqueVersChaîne(dhUTC..Mois,"02d"),...
NumériqueVersChaîne(dhUTC..Jour,"02d"),...
NumériqueVersChaîne(dhUTC..Heure,"02d"),...
NumériqueVersChaîne(dhUTC..Minute,"02d"),...
NumériqueVersChaîne(dhUTC..Seconde,"02d"),...
NumériqueVersChaîne(dhUTC..Milliseconde,"03d"))

RENVOYER sDateHeureIso
FIN

PROCÉDURE INTERNE interne_AWS4_SigDerivee(sMethode est une chaîne)
sDateKey est une chaîne
sDateRegionKey est une chaîne
sDateRegionServiceKey est une chaîne
sSigningKey est une chaîne

sDateKey = HashChaîne(HA_HMAC_SHA_256, DateDuJour(), "AWS4"+ sAWS_PM_PAS)
sDateRegionKey = HashChaîne(HA_HMAC_SHA_256, sAWS_REGION, sDateKey)
sDateRegionServiceKey = HashChaîne(HA_HMAC_SHA_256, sMethode, sDateRegionKey)
sSigningKey = HashChaîne(HA_HMAC_SHA_256, "aws4_request", sDateRegionServiceKey)

RENVOYER sSigningKey
FIN
Membre enregistré
6 messages
Posté le 06 janvier 2022 - 15:07
Bonjour,
Merci pour ces codes mais je suis perdu avec le calcul des signatures aws.
Quelqu'un peut-il m'aider, je cherche à créer une signature pour API Get AssumeRole
Je pense que c'est la construction de la demande canonique dans mon cas qui ne fonctionne pas.


Franck R. a écrit :
Bonjour,

Je ne vois pas d'erreur sur votre code, dans mon cas je ne met pas les ChaineVersUTF8 dans le calcul de la signature
Je met ci-dessous le code que j'utilise en AWS4 pour nos connexion S3

Bon courage,

Franck R.

PROCÉDURE pglb_EnteteAWS4(sReqType est une chaîne, sURL est une chaîne, sTmpParam est une chaîne, sNomBucket est une chaîne, sWebUrl est une chaîne, sHashSHA est une chaîne)
sDateUTC est une chaîne
sDateJour est une chaîne
sSection est une chaîne
sFinal est une chaîne
sCanonic est une chaîne
sTmp est une chaîne
AWS_RC est une chaîne = Caract(10)
sSignature est une chaîne
sEnteteHTTP est une chaîne

sAWS_REGION est une chaîne
sAWS_PM_PAS est une chaîne
sAWS_PM_LOG est une chaîne

sAWS_PM_LOG = "votre login AWS"
sAWS_PM_PAS = "votre mot de passe AWS"
sAWS_REGION = "us-east-1"

sDateUTC = interne_DateHeureVersISO8601()
sDateJour = DateDuJour()
sSection = "s3" // ou autre service "iam"
sFinal = "aws4_request"

SELON sReqType
CAS "GET"
// Requête de type GET
sCanonic = "GET" + AWS_RC + sURL + AWS_RC + sTmpParam + AWS_RC + ...
"host:" + sNomBucket + "." + sWebUrl + AWS_RC + ...
"x-amz-date:" + sDateUTC + AWS_RC + ...
AWS_RC + "host;x-amz-date" + AWS_RC + interne_CalculHashSha256("")

CAS "PUT"
// Requête de type PUT, POST, PATCH...
sCanonic = "PUT" + AWS_RC + sURL + AWS_RC + "" + AWS_RC + ...
"host:" + sNomBucket + "." + sWebUrl + AWS_RC + ...
"x-amz-content-sha256:" + sHashSHA + AWS_RC + ...
"x-amz-date:" + sDateUTC + AWS_RC + ...
AWS_RC + "host;x-amz-content-sha256;x-amz-date" + AWS_RC + sHashSHA

AUTRE CAS

FIN

sTmp = "AWS4-HMAC-SHA256" + AWS_RC + sDateUTC + AWS_RC + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + AWS_RC + ...
interne_CalculHashSha256(sCanonic, Faux)

sSignature = interne_AWS4_SigDerivee("s3")
sSignature = HashChaîne(HA_HMAC_SHA_256, sTmp, sSignature)

SELON sReqType
CAS "GET"
// Chaine à transmettre dans l'entête
sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ...
"x-amz-content-sha256:" + interne_CalculHashSha256("") + RC + ...
"Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ...
", SignedHeaders=host;x-amz-date, Signature=" + interne_Hexa(sSignature)

CAS "PUT"
sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ...
"x-amz-content-sha256:" + sHashSHA + RC + ...
"Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ...
", SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=" + interne_Hexa(sSignature)

AUTRE CAS

FIN

RENVOYER sEnteteHTTP


PROCÉDURE INTERNE interne_CalculHashSha256(LOCAL sData est une chaîne, bIsFile est un booléen = Faux)
sSigningKey est une chaîne

SI bIsFile = Vrai ALORS
sSigningKey = HashFichier(HA_SHA_256, sData)
SINON
sSigningKey = HashChaîne(HA_SHA_256, sData)
FIN
RENVOYER interne_Hexa(sSigningKey)
FIN

PROCÉDURE INTERNE interne_Hexa(sData est une chaîne, sSepFin est une chaîne = "")
sSign est une chaîne
nInd est un entier
nVal est un entier

sSign = ""
POUR nInd = 1 _À_ Taille(sData)
nVal = Asc(sData[[nInd]])
sSign += NumériqueVersChaîne(nVal, "02x") + sSepFin
FIN

RENVOYER sSign
FIN

PROCÉDURE INTERNE interne_DateHeureVersISO8601()
// Conversion de l'heure locale en heure UTC
dhDateHeure est un DateHeure

AWS_ISO8601_FORMAT est une chaîne = "%1%2%3T%4%5%6Z"

dhUTC est un DateHeure = DateHeureLocaleVersUTC(dhDateHeure)

sDateHeureIso est une chaîne = ChaîneConstruit(AWS_ISO8601_FORMAT,...
NumériqueVersChaîne(dhUTC..Année,"04d"),...
NumériqueVersChaîne(dhUTC..Mois,"02d"),...
NumériqueVersChaîne(dhUTC..Jour,"02d"),...
NumériqueVersChaîne(dhUTC..Heure,"02d"),...
NumériqueVersChaîne(dhUTC..Minute,"02d"),...
NumériqueVersChaîne(dhUTC..Seconde,"02d"),...
NumériqueVersChaîne(dhUTC..Milliseconde,"03d"))

RENVOYER sDateHeureIso
FIN

PROCÉDURE INTERNE interne_AWS4_SigDerivee(sMethode est une chaîne)
sDateKey est une chaîne
sDateRegionKey est une chaîne
sDateRegionServiceKey est une chaîne
sSigningKey est une chaîne

sDateKey = HashChaîne(HA_HMAC_SHA_256, DateDuJour(), "AWS4"+ sAWS_PM_PAS)
sDateRegionKey = HashChaîne(HA_HMAC_SHA_256, sAWS_REGION, sDateKey)
sDateRegionServiceKey = HashChaîne(HA_HMAC_SHA_256, sMethode, sDateRegionKey)
sSigningKey = HashChaîne(HA_HMAC_SHA_256, "aws4_request", sDateRegionServiceKey)

RENVOYER sSigningKey
FIN
Membre enregistré
6 messages
Posté le 06 janvier 2022 - 23:03
Bonsoir,
Avez-vous trouvé une solution ?
Je cherche également à créer une signature AWS pour signer l'APi Get AssumeRole
https://sts.amazonaws.com/…}}
Quelqu'un a-t-il déjà réussi à créer la signature ?
J'arrive à retrouver les valeurs fournies dans les exemples AMAZON mais n'arrive pas à créer la signature pour cette api.
Posté le 16 janvier 2022 - 18:19
Bonjour,

Je pense que la fonction Windev "HASHCHAINE" est incorrecte

si je compare le résultat de:

gsSrequest est une chaîne ANSI ="The quick brown fox jumps over the lazy dog"
gsPrivatekey est une chaîne ANSI = "key"

gbufSEncrypt est un Buffer

gbufSEncrypt= HashChaîne(HA_SHA_160, gsSrequest, gsPrivatekey)


avec ce que l'on obtient sur
https://www.liavaag.org/English/SHA-Generator/HMAC/
ou encore
https://asecuritysite.com/encryption/hmac

avec windev : 2FD4E1C67A2D28FCED849EE1BB76E7391B93EB12

sur les deux sites: DE7C9B85B8B78AA6BC8A7A36F70A90701C9DB4D9

(j'ai essayé avec CHAINE / CHAINE ANSI / BUFFER le résultat n'est jamais le bon)
Posté le 16 janvier 2022 - 18:21
Bonjour,

Je pense que la fonction Windev "HASHCHAINE" est incorrecte

si je compare le résultat de:

gsSrequest est une chaîne ANSI ="The quick brown fox jumps over the lazy dog"
gsPrivatekey est une chaîne ANSI = "key"

gbufSEncrypt est un Buffer

gbufSEncrypt= HashChaîne(HA_SHA_160, gsSrequest, gsPrivatekey)


avec ce que l'on obtient sur
https://www.liavaag.org/English/SHA-Generator/HMAC/
ou encore
https://asecuritysite.com/encryption/hmac

avec windev : 2FD4E1C67A2D28FCED849EE1BB76E7391B93EB12

sur les deux sites: DE7C9B85B8B78AA6BC8A7A36F70A90701C9DB4D9

(j'ai essayé avec CHAINE / CHAINE ANSI / BUFFER le résultat n'est jamais le bon)
Membre enregistré
6 messages
Posté le 16 janvier 2022 - 18:22
Bonjour,

Je pense que la fonction Windev "HASHCHAINE" est incorrecte

si je compare le résultat de:

gsSrequest est une chaîne ANSI ="The quick brown fox jumps over the lazy dog"
gsPrivatekey est une chaîne ANSI = "key"

gbufSEncrypt est un Buffer

gbufSEncrypt= HashChaîne(HA_SHA_160, gsSrequest, gsPrivatekey)


avec ce que l'on obtient sur
https://www.liavaag.org/English/SHA-Generator/HMAC/
ou encore
https://asecuritysite.com/encryption/hmac

avec windev : 2FD4E1C67A2D28FCED849EE1BB76E7391B93EB12

sur les deux sites: DE7C9B85B8B78AA6BC8A7A36F70A90701C9DB4D9

(j'ai essayé avec CHAINE / CHAINE ANSI / BUFFER le résultat n'est jamais le bon)
Membre enregistré
124 messages
Posté le 16 janvier 2022 - 20:42
Hi all

On the english forum there was a similar request that got solved it seems.
https://www.wxforum.info/read.php…

--
Peter Holemans
www.mcs2.eu | www.pixontri.eu
Posté le 17 janvier 2022 - 00:42
les liens fournis contiennent le mot "HMAC" qui est une option de la fonction hash, mais cette option n'est pas utilisé dans ton code.

donc utilise la même option des deux cotés si tu veux avoir le même résultat
Membre enregistré
351 messages
Posté le 17 janvier 2022 - 09:04
Bonjour,

En fait le code de ton premier post était presque bon ... l'erreur que tu fais est de passer la clé en hexadécimal alors qu'il faut la passer sous forme de buffer !
//Exemple de chaine canonique fournie dans la spec AMAZON https://docs.aws.amazon.com/fr_fr/general/latest/gr/sigv4-create-string-to-sign.html
Machaine est une chaîne ="AWS4-HMAC-SHA256"+M_LF...
+"20150830T123600Z"+M_LF...
+"20150830/us-east-1/iam/aws4_request"+M_LF...
+"f536975d06c0309214f805bb90ccff089219ecd68b2577efef23edd43b7e1a59"

//Clé dérivée fournie dans la spec AMAZON https://docs.aws.amazon.com/fr_fr/general/latest/gr/sigv4-calculate-signature.html
MaCle est une chaîne ="c4afb1cc5771d871763a393e44b703571b55cc28424d1a5e86da6ed3c154a4b9"

Trace(Minuscule(BufferVersHexa(HashChaîne(HA_HMAC_SHA_256,Machaine,HexaVersBuffer(MaCle)),SansRegroupement,SansLigne)))

et tu obtiendras ce que tu désires :
5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7

Note bien que toutes les fonctions de hachage de Windev fonctionnent sans aucun problème !

--
Bon développement, Patrick [3po.fr]
Membre enregistré
6 messages
Posté le 17 janvier 2022 - 10:43
Arghh,

Merci, je suis un âne, "HA_SHA_160" au lieu de "HA_HMAC_SHA_160", cela va tout de suite mieux avec le bon paramètre ;)

Bonne journée
Posté le 16 mars 2023 - 16:06
Bonjour,
Pourrais-je savoir comment passer les paramètres de requête HTTP lors de l'envoi ? J'ai beau respecter l'algo AWS mais je reçois l'erreur 403...
Posté le 05 juillet 2023 - 10:18
Bonjour,

est-ce que quelqu'un a une classe qui fonctionne, car quand je prend les différents code, j'ai des problèmes de clés

Avec mes meilleures salutations
Fabrice
Posté le 18 juillet 2023 - 14:25
Bonjour,

est-ce qu'une personne à un bout de code pour l'enregistrement d'une image dans S3.

Merci de votre aide
Fabrice
Posté le 23 mars 2025 - 19:01
a écrit :
Bonjour,

Je ne vois pas d'erreur sur votre code, dans mon cas je ne met pas les ChaineVersUTF8 dans le calcul de la signature
Je met ci-dessous le code que j'utilise en AWS4 pour nos connexion S3

Bon courage,

Franck R.

Procedure pglb_EnteteAWS4(sReqType est une chaîne, sURL est une chaîne, sTmpParam est une chaîne, sNomBucket est une chaîne, sWebUrl est une chaîne, sHashSHA est une chaîne)
sDateUTC est une chaîne
sDateJour est une chaîne
sSection est une chaîne
sFinal est une chaîne
sCanonic est une chaîne
sTmp est une chaîne
AWS_RC est une chaîne = Caract(10)
sSignature est une chaîne
sEnteteHTTP est une chaîne

sAWS_REGION est une chaîne
sAWS_PM_PAS est une chaîne
sAWS_PM_LOG est une chaîne

sAWS_PM_LOG = "votre login AWS"
sAWS_PM_PAS = "votre mot de passe AWS"
sAWS_REGION = "us-east-1"

sDateUTC = interne_DateHeureVersISO8601()
sDateJour = DateDuJour()
sSection = "s3" // ou autre service "iam"
sFinal = "aws4_request"

SELON sReqType
CAS "GET"
// Requête de type GET
sCanonic = "GET" + AWS_RC + sURL + AWS_RC + sTmpParam + AWS_RC + ...
"host:" + sNomBucket + "." + sWebUrl + AWS_RC + ...
"x-amz-date:" + sDateUTC + AWS_RC + ...
AWS_RC + "host;x-amz-date" + AWS_RC + interne_CalculHashSha256("")

CAS "PUT"
// Requête de type PUT, POST, PATCH...
sCanonic = "PUT" + AWS_RC + sURL + AWS_RC + "" + AWS_RC + ...
"host:" + sNomBucket + "." + sWebUrl + AWS_RC + ...
"x-amz-content-sha256:" + sHashSHA + AWS_RC + ...
"x-amz-date:" + sDateUTC + AWS_RC + ...
AWS_RC + "host;x-amz-content-sha256;x-amz-date" + AWS_RC + sHashSHA

AUTRE CAS

FIN

sTmp = "AWS4-HMAC-SHA256" + AWS_RC + sDateUTC + AWS_RC + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + AWS_RC + ...
interne_CalculHashSha256(sCanonic, Faux)

sSignature = interne_AWS4_SigDerivee("s3")
sSignature = HashChaîne(HA_HMAC_SHA_256, sTmp, sSignature)

SELON sReqType
CAS "GET"
// Chaine à transmettre dans l'entête
sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ...
"x-amz-content-sha256:" + interne_CalculHashSha256("") + RC + ...
"Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ...
", SignedHeaders=host;x-amz-date, Signature=" + interne_Hexa(sSignature)

CAS "PUT"
sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ...
"x-amz-content-sha256:" + sHashSHA + RC + ...
"Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ...
", SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=" + interne_Hexa(sSignature)

AUTRE CAS

FIN

RENVOYER sEnteteHTTP


PROCEDURE INTERNE interne_CalculHashSha256(LOCAL sData est une chaîne, bIsFile est un booléen = Faux)
sSigningKey est une chaîne

SI bIsFile = Vrai ALORS
sSigningKey = HashFichier(HA_SHA_256, sData)
SINON
sSigningKey = HashChaîne(HA_SHA_256, sData)
FIN
RENVOYER interne_Hexa(sSigningKey)
FIN

PROCEDURE INTERNE interne_Hexa(sData est une chaîne, sSepFin est une chaîne = "")
sSign est une chaîne
nInd est un entier
nVal est un entier

sSign = ""
POUR nInd = 1 _À_ Taille(sData)
nVal = Asc(sData[[nInd]])
sSign += NumériqueVersChaîne(nVal, "02x") + sSepFin
FIN

RENVOYER sSign
FIN

PROCEDURE INTERNE interne_DateHeureVersISO8601()
// Conversion de l'heure locale en heure UTC
dhDateHeure est un DateHeure

AWS_ISO8601_FORMAT est une chaîne = "%1%2%3T%4%5%6Z"

dhUTC est un DateHeure = DateHeureLocaleVersUTC(dhDateHeure)

sDateHeureIso est une chaîne = ChaîneConstruit(AWS_ISO8601_FORMAT,...
NumériqueVersChaîne(dhUTC..Année,"04d"),...
NumériqueVersChaîne(dhUTC..Mois,"02d"),...
NumériqueVersChaîne(dhUTC..Jour,"02d"),...
NumériqueVersChaîne(dhUTC..Heure,"02d"),...
NumériqueVersChaîne(dhUTC..Minute,"02d"),...
NumériqueVersChaîne(dhUTC..Seconde,"02d"),...
NumériqueVersChaîne(dhUTC..Milliseconde,"03d"))

RENVOYER sDateHeureIso
FIN

PROCEDURE INTERNE interne_AWS4_SigDerivee(sMethode est une chaîne)
sDateKey est une chaîne
sDateRegionKey est une chaîne
sDateRegionServiceKey est une chaîne
sSigningKey est une chaîne

sDateKey = HashChaîne(HA_HMAC_SHA_256, DateDuJour(), "AWS4"+ sAWS_PM_PAS)
sDateRegionKey = HashChaîne(HA_HMAC_SHA_256, sAWS_REGION, sDateKey)
sDateRegionServiceKey = HashChaîne(HA_HMAC_SHA_256, sMethode, sDateRegionKey)
sSigningKey = HashChaîne(HA_HMAC_SHA_256, "aws4_request", sDateRegionServiceKey)

RENVOYER sSigningKey
FIN
Posté le 23 mars 2025 - 19:02
a écrit :
Bonjour,

Je ne vois pas d'erreur sur votre code, dans mon cas je ne met pas les ChaineVersUTF8 dans le calcul de la signature
Je met ci-dessous le code que j'utilise en AWS4 pour nos connexion S3

Bon courage,

Franck R.

Procedure pglb_EnteteAWS4(sReqType est une chaîne, sURL est une chaîne, sTmpParam est une chaîne, sNomBucket est une chaîne, sWebUrl est une chaîne, sHashSHA est une chaîne)
sDateUTC est une chaîne
sDateJour est une chaîne
sSection est une chaîne
sFinal est une chaîne
sCanonic est une chaîne
sTmp est une chaîne
AWS_RC est une chaîne = Caract(10)
sSignature est une chaîne
sEnteteHTTP est une chaîne

sAWS_REGION est une chaîne
sAWS_PM_PAS est une chaîne
sAWS_PM_LOG est une chaîne

sAWS_PM_LOG = "votre login AWS"
sAWS_PM_PAS = "votre mot de passe AWS"
sAWS_REGION = "us-east-1"

sDateUTC = interne_DateHeureVersISO8601()
sDateJour = DateDuJour()
sSection = "s3" // ou autre service "iam"
sFinal = "aws4_request"

SELON sReqType
CAS "GET"
// Requête de type GET
sCanonic = "GET" + AWS_RC + sURL + AWS_RC + sTmpParam + AWS_RC + ...
"host:" + sNomBucket + "." + sWebUrl + AWS_RC + ...
"x-amz-date:" + sDateUTC + AWS_RC + ...
AWS_RC + "host;x-amz-date" + AWS_RC + interne_CalculHashSha256("")

CAS "PUT"
// Requête de type PUT, POST, PATCH...
sCanonic = "PUT" + AWS_RC + sURL + AWS_RC + "" + AWS_RC + ...
"host:" + sNomBucket + "." + sWebUrl + AWS_RC + ...
"x-amz-content-sha256:" + sHashSHA + AWS_RC + ...
"x-amz-date:" + sDateUTC + AWS_RC + ...
AWS_RC + "host;x-amz-content-sha256;x-amz-date" + AWS_RC + sHashSHA

AUTRE CAS

FIN

sTmp = "AWS4-HMAC-SHA256" + AWS_RC + sDateUTC + AWS_RC + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + AWS_RC + ...
interne_CalculHashSha256(sCanonic, Faux)

sSignature = interne_AWS4_SigDerivee("s3")
sSignature = HashChaîne(HA_HMAC_SHA_256, sTmp, sSignature)

SELON sReqType
CAS "GET"
// Chaine à transmettre dans l'entête
sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ...
"x-amz-content-sha256:" + interne_CalculHashSha256("") + RC + ...
"Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ...
", SignedHeaders=host;x-amz-date, Signature=" + interne_Hexa(sSignature)

CAS "PUT"
sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ...
"x-amz-content-sha256:" + sHashSHA + RC + ...
"Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ...
", SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=" + interne_Hexa(sSignature)

AUTRE CAS

FIN

RENVOYER sEnteteHTTP


PROCEDURE INTERNE interne_CalculHashSha256(LOCAL sData est une chaîne, bIsFile est un booléen = Faux)
sSigningKey est une chaîne

SI bIsFile = Vrai ALORS
sSigningKey = HashFichier(HA_SHA_256, sData)
SINON
sSigningKey = HashChaîne(HA_SHA_256, sData)
FIN
RENVOYER interne_Hexa(sSigningKey)
FIN

PROCEDURE INTERNE interne_Hexa(sData est une chaîne, sSepFin est une chaîne = "")
sSign est une chaîne
nInd est un entier
nVal est un entier

sSign = ""
POUR nInd = 1 _À_ Taille(sData)
nVal = Asc(sData[[nInd]])
sSign += NumériqueVersChaîne(nVal, "02x") + sSepFin
FIN

RENVOYER sSign
FIN

PROCEDURE INTERNE interne_DateHeureVersISO8601()
// Conversion de l'heure locale en heure UTC
dhDateHeure est un DateHeure

AWS_ISO8601_FORMAT est une chaîne = "%1%2%3T%4%5%6Z"

dhUTC est un DateHeure = DateHeureLocaleVersUTC(dhDateHeure)

sDateHeureIso est une chaîne = ChaîneConstruit(AWS_ISO8601_FORMAT,...
NumériqueVersChaîne(dhUTC..Année,"04d"),...
NumériqueVersChaîne(dhUTC..Mois,"02d"),...
NumériqueVersChaîne(dhUTC..Jour,"02d"),...
NumériqueVersChaîne(dhUTC..Heure,"02d"),...
NumériqueVersChaîne(dhUTC..Minute,"02d"),...
NumériqueVersChaîne(dhUTC..Seconde,"02d"),...
NumériqueVersChaîne(dhUTC..Milliseconde,"03d"))

RENVOYER sDateHeureIso
FIN

PROCEDURE INTERNE interne_AWS4_SigDerivee(sMethode est une chaîne)
sDateKey est une chaîne
sDateRegionKey est une chaîne
sDateRegionServiceKey est une chaîne
sSigningKey est une chaîne

sDateKey = HashChaîne(HA_HMAC_SHA_256, DateDuJour(), "AWS4"+ sAWS_PM_PAS)
sDateRegionKey = HashChaîne(HA_HMAC_SHA_256, sAWS_REGION, sDateKey)
sDateRegionServiceKey = HashChaîne(HA_HMAC_SHA_256, sMethode, sDateRegionKey)
sSigningKey = HashChaîne(HA_HMAC_SHA_256, "aws4_request", sDateRegionServiceKey)

RENVOYER sSigningKey
FIN
Posté le 23 mars 2025 - 19:04
a écrit :
Bonjour,

Je ne vois pas d'erreur sur votre code, dans mon cas je ne met pas les ChaineVersUTF8 dans le calcul de la signature
Je met ci-dessous le code que j'utilise en AWS4 pour nos connexion S3

Bon courage,

Franck R.

PROCÉDURE pglb_EnteteAWS4(sReqType est une chaîne, sURL est une chaîne, sTmpParam est une chaîne, sNomBucket est une chaîne, sWebUrl est une chaîne, sHashSHA est une chaîne)
sDateUTC est une chaîne
sDateJour est une chaîne
sSection est une chaîne
sFinal est une chaîne
sCanonic est une chaîne
sTmp est une chaîne
AWS_RC est une chaîne = Caract(10)
sSignature est une chaîne
sEnteteHTTP est une chaîne

sAWS_REGION est une chaîne
sAWS_PM_PAS est une chaîne
sAWS_PM_LOG est une chaîne

sAWS_PM_LOG = "votre login AWS"
sAWS_PM_PAS = "votre mot de passe AWS"
sAWS_REGION = "us-east-1"

sDateUTC = interne_DateHeureVersISO8601()
sDateJour = DateDuJour()
sSection = "s3" // ou autre service "iam"
sFinal = "aws4_request"

SELON sReqType
CAS "GET"
// Requête de type GET
sCanonic = "GET" + AWS_RC + sURL + AWS_RC + sTmpParam + AWS_RC + ...
"host:" + sNomBucket + "." + sWebUrl + AWS_RC + ...
"x-amz-date:" + sDateUTC + AWS_RC + ...
AWS_RC + "host;x-amz-date" + AWS_RC + interne_CalculHashSha256("")

CAS "PUT"
// Requête de type PUT, POST, PATCH...
sCanonic = "PUT" + AWS_RC + sURL + AWS_RC + "" + AWS_RC + ...
"host:" + sNomBucket + "." + sWebUrl + AWS_RC + ...
"x-amz-content-sha256:" + sHashSHA + AWS_RC + ...
"x-amz-date:" + sDateUTC + AWS_RC + ...
AWS_RC + "host;x-amz-content-sha256;x-amz-date" + AWS_RC + sHashSHA

AUTRE CAS

FIN

sTmp = "AWS4-HMAC-SHA256" + AWS_RC + sDateUTC + AWS_RC + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + AWS_RC + ...
interne_CalculHashSha256(sCanonic, Faux)

sSignature = interne_AWS4_SigDerivee("s3")
sSignature = HashChaîne(HA_HMAC_SHA_256, sTmp, sSignature)

SELON sReqType
CAS "GET"
// Chaine à transmettre dans l'entête
sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ...
"x-amz-content-sha256:" + interne_CalculHashSha256("") + RC + ...
"Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ...
", SignedHeaders=host;x-amz-date, Signature=" + interne_Hexa(sSignature)

CAS "PUT"
sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ...
"x-amz-content-sha256:" + sHashSHA + RC + ...
"Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ...
", SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=" + interne_Hexa(sSignature)

AUTRE CAS

FIN

RENVOYER sEnteteHTTP


PROCÉDURE INTERNE interne_CalculHashSha256(LOCAL sData est une chaîne, bIsFile est un booléen = Faux)
sSigningKey est une chaîne

SI bIsFile = Vrai ALORS
sSigningKey = HashFichier(HA_SHA_256, sData)
SINON
sSigningKey = HashChaîne(HA_SHA_256, sData)
FIN
RENVOYER interne_Hexa(sSigningKey)
FIN

PROCÉDURE INTERNE interne_Hexa(sData est une chaîne, sSepFin est une chaîne = "")
sSign est une chaîne
nInd est un entier
nVal est un entier

sSign = ""
POUR nInd = 1 _À_ Taille(sData)
nVal = Asc(sData[[nInd]])
sSign += NumériqueVersChaîne(nVal, "02x") + sSepFin
FIN

RENVOYER sSign
FIN

PROCÉDURE INTERNE interne_DateHeureVersISO8601()
// Conversion de l'heure locale en heure UTC
dhDateHeure est un DateHeure

AWS_ISO8601_FORMAT est une chaîne = "%1%2%3T%4%5%6Z"

dhUTC est un DateHeure = DateHeureLocaleVersUTC(dhDateHeure)

sDateHeureIso est une chaîne = ChaîneConstruit(AWS_ISO8601_FORMAT,...
NumériqueVersChaîne(dhUTC..Année,"04d"),...
NumériqueVersChaîne(dhUTC..Mois,"02d"),...
NumériqueVersChaîne(dhUTC..Jour,"02d"),...
NumériqueVersChaîne(dhUTC..Heure,"02d"),...
NumériqueVersChaîne(dhUTC..Minute,"02d"),...
NumériqueVersChaîne(dhUTC..Seconde,"02d"),...
NumériqueVersChaîne(dhUTC..Milliseconde,"03d"))

RENVOYER sDateHeureIso
FIN

PROCÉDURE INTERNE interne_AWS4_SigDerivee(sMethode est une chaîne)
sDateKey est une chaîne
sDateRegionKey est une chaîne
sDateRegionServiceKey est une chaîne
sSigningKey est une chaîne

sDateKey = HashChaîne(HA_HMAC_SHA_256, DateDuJour(), "AWS4"+ sAWS_PM_PAS)
sDateRegionKey = HashChaîne(HA_HMAC_SHA_256, sAWS_REGION, sDateKey)
sDateRegionServiceKey = HashChaîne(HA_HMAC_SHA_256, sMethode, sDateRegionKey)
sSigningKey = HashChaîne(HA_HMAC_SHA_256, "aws4_request", sDateRegionServiceKey)

RENVOYER sSigningKey
FIN


bonjour pouriez vous preciser ce qu il faut mettre dans laes arguments de votre procedure:
"sReqType est une chaîne, sURL est une chaîne, sTmpParam est une chaîne, sNomBucket est une chaîne, sWebUrl est une chaîne, sHashSHA est une chaîne)"
merci
Posté le 24 mars 2025 - 11:46
henri peuvrelle a écrit :

bonjour pouriez vous preciser ce qu il faut mettre dans laes arguments de votre procedure:
"sReqType est une chaîne, sURL est une chaîne, sTmpParam est une chaîne, sNomBucket est une chaîne, sWebUrl est une chaîne, sHashSHA est une chaîne)"
merci


Mettons que la requête souhaité soit celle-ci

https://nom-du-bucket-s3.s3.amazonaws.com/content/…

sReqType = "GET" // ou "PUT" ...
sUrl = "/content/"
sTmpParam = "list-type=2&prefix=images%2Fmini" // chaine vide ou paramètres de l'url par exemple
sNomBucket = "nom-du-bucket-s3"
sWebUrl = "s3.amazonaws.com" // ou avec la région "s3-eu-west-3.amazonaws.com"
sHashSHA = "" // ou Hash HashChaîne(HA_SHA_256, Body) du Body pour une requête de type PUT/POST/PATCH...

Par exemple pour récupérer ListAllMyBuckets de la région de Paris

sReqType = "GET"
sUrl = "/"
sTmpParam = ""
sNomBucket = "nom-du-bucket-s3"
sWebUrl = "s3-eu-west-3.amazonaws.com"
sHashSHA = ""

Cordialement,

Franck.
Posté le 25 mars 2025 - 14:26
Franck R a écrit :
henri peuvrelle a écrit :

bonjour pouriez vous preciser ce qu il faut mettre dans laes arguments de votre procedure:
"sReqType est une chaîne, sURL est une chaîne, sTmpParam est une chaîne, sNomBucket est une chaîne, sWebUrl est une chaîne, sHashSHA est une chaîne)"
merci

Mettons que la requête souhaité soit celle-ci

https://nom-du-bucket-s3.s3.amazonaws.com/content/…

sReqType = "GET" // ou "PUT" ...
sUrl = "/content/"
sTmpParam = "list-type=2&prefix=images%2Fmini" // chaine vide ou paramètres de l'url par exemple
sNomBucket = "nom-du-bucket-s3"
sWebUrl = "s3.amazonaws.com" // ou avec la région "s3-eu-west-3.amazonaws.com"
sHashSHA = "" // ou Hash HashChaîne(HA_SHA_256, Body) du Body pour une requête de type PUT/POST/PATCH...

Par exemple pour récupérer ListAllMyBuckets de la région de Paris

sReqType = "GET"
sUrl = "/"
sTmpParam = ""
sNomBucket = "nom-du-bucket-s3"
sWebUrl = "s3-eu-west-3.amazonaws.com"
sHashSHA = ""

Cordialement,

Franck.


merci , je ne m en sort pas voici ma requette "PUT"
"https://bibak-lambda-data.s3.eu-west-3.amazonaws.com/00002_20250303_110754.txt"
je dois faire une erreur dans les arguments de la requete
Posté le 26 mars 2025 - 10:39
henri peuvrelle a écrit :

merci , je ne m en sort pas voici ma requette "PUT"
"https://bibak-lambda-data.s3.eu-west-3.amazonaws.com/00002_20250303_110754.txt"
je dois faire une erreur dans les arguments de la requete


Je n'ai pas accès au lien <Code>AccessDenied</Code>.
mais si tu veux écraser ton fichier par un fichier contenant le mot : Bonjour

sReqType = "PUT"
sUrl = "/00002_20250303_110754.txt"
sTmpParam = ""
sNomBucket = "bibak-lambda-data"
sWebUrl = "s3-eu-west-3.amazonaws.com"
sHashSHA = "9172E8EEC99F144F72ECA9A568759580EDADB2CFD154857F07E657569493BC44"

et surtout il ne faut pas oublier de modifier la section du code :

sAWS_PM_LOG = "votre login AWS"
sAWS_PM_PAS = "votre mot de passe AWS"
sAWS_REGION = "eu-west-3"

Cordialement,

Franck.
Posté le 26 mars 2025 - 11:13
Franck R a écrit :

> sHashSHA = "9172E8EEC99F144F72ECA9A568759580EDADB2CFD154857F07E657569493BC44"

Oups, il faut que le hash soit en minuscule !

9172e8eec99f144f72eca9a568759580edadb2cfd154857f07e657569493bc44

Cordialement,

Franck.
Posté le 27 mars 2025 - 10:24
Franck R a écrit :
Franck R a écrit :

sHashSHA = "9172E8EEC99F144F72ECA9A568759580EDADB2CFD154857F07E657569493BC44"

Oups, il faut que le hash soit en minuscule !

9172e8eec99f144f72eca9a568759580edadb2cfd154857f07e657569493bc44

Cordialement,

Franck.


je t envoie mon code qui ne marches pas:
HTTPCréeFormulaire("Bibak")
HTTPAjouteFichier("Bibak","File","00002_20250303_110754.txt")
bib est une httpRequête
bib..URL="https://bibak-lambda-data.s3.eu-west-3.amazonaws.com/00002_20250303_110754.txt"//"…"

lheure est une chaîne= DateHeureVersChaîne(DateHeureLocaleVersUTC(DateHeureSys()),"AAAAMMJJTHHMMSSZ")
signa est une chaîne=pglb_EnteteAWS4("PUT" ,"/00002_20250303_110754.txt" ,"" , "bibak-lambda-data" , "s3.eu-west-3.amazonaws.com" , "9172e8eec99f144f72eca9a568759580edadb2cfd154857f07e657569493bc44" )
bib..URL="https://bibak-lambda-data.s3.eu-west-3.amazonaws.com/00002_20250303_110754.txt"+signa
//sReqType = "PUT"
//sUrl = "/00002_20250303_110754.txt"
//sTmpParam = ""
//sNomBucket = "bibak-lambda-data"
//sWebUrl = "s3-eu-west-3.amazonaws.com"
//sHashSHA = "9172E8EEC99F144F72ECA9A568759580EDADB2CFD154857F07E657569493BC44"
//trace(signa)

//signa=ExtraitChaîne(signa,3,",")
//signa=ExtraitChaîne(signa,2,"=")







//url_complete est une chaine="https://bibak-lambda-data.s3.eu-west-3.amazonaws.com/00002_20250303_110754.txt…()+"%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature="+signa


//



bib..Méthode=httpPut
//bib..URL=url_complete


//bib..Entête["AWS Region"]="eu-west-3"
//bib..Entête["Service Name"]="s3"
resp est une httpRéponse
resp=HTTPEnvoieFormulaire("Bibak",bib)
Info(resp..CodeEtat)
Info(resp..Contenu)