Мне нужно взаимодействовать с AWS EC2 API, используя pure / bin / sh, поэтому я не могу использовать ни один из Amazon SDK. Для запросов API требуется, чтобы подпись ключа добавлялась к заголовку аутентификации в запросе http. Сигнатура создается из серии вложенных вызовов аутентификации сообщений на основе хеширования (hma c), функций:
hmac0(key, data)
hmac1(hmac0,data)
hmac2(hmac1,data)
...
...
...
Amazon предоставляет схему практики и некоторые практические значения, чтобы убедиться, что все работает.
Вот схема практики:
kSecret = your secret access key
kDate = HMAC("AWS4" + kSecret, Date)
kRegion = HMAC(kDate, Region)
kService = HMAC(kRegion, Service)
kSigning = HMAC(kService, "aws4_request")
Вот значения практики:
secret = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'
date = '20120215'
region = 'us-east-1'
service = 'iam'
Вот то, к чему должны вычисляться значения при хешировании:
kDate = '969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d'
kRegion = '69daa0209cd9c5ff5c8ced464a696fd4252e981430b10e3d3fd8e2f197d7a70c'
kService = 'f72cfd46f26bc4643f06a11eabb6c0ba18780c19a8da0c31ace671265e3c87fa'
kSigning = 'f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d'
Вот мои значения:
969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d
d5283a1e52c40d102c9d079674392d795194b78c03cc7e115d5c2581f8db44a6
49b3571d4532b7d85f1c1529a13d9482578d93fb32f5458f3a2767864e218666
18d7bdb43f9843d73d8547b90e9c8ed5ac8f61d2f55086f354b9e8366cfe7
Мое первое значение верное, но остальные неверны.
Вот как я подошел к этому:
#!/bin/sh
KEY="wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"
KEY_TAG="AWS4"
TAGGED_KEY="$KEY_TAG$KEY"
DATE="20120215"
REGION="us-east-1"
SERVICE="iam"
SIGNING="aws4_request"
kDate() {
echo -n $DATE | openssl dgst -sha256 -hmac $TAGGED_KEY | sed 's/^.* //'
}
kRegion() {
echo -n $REGION | openssl dgst -sha256 -hmac kDate | sed 's/^.* //'
}
kService() {
echo -n $SERVICE | openssl dgst -sha256 -hmac kRegion | sed 's/^.* //'
}
kSigning() {
echo -n $SIGNING | openssl dgst -sha256 -hmac kService | sed 's/^.* //'
}
# Print values
kDate
kRegion
kService
kSigning
Даже когда я использую литеральные значения вместо функций, они ошибаются. Также вот еще один тест, который я позаимствовал из Википедии, чтобы проверить свою функцию, и он работает:
TEST="The quick brown fox jumps over the lazy dog"
KEY="key"
kTest() {
echo -n $TEST | openssl dgst -sha256 -hmac $KEY | sed 's/^.* //'
}
f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8
Что мне здесь не хватает?