Hmac-auth eklentisi, HTTP istekleri için HMAC algoritmasına dayalı sahtelenemez imzalar oluşturur ve kimlik doğrulama amacıyla bu imzaları kullanır.
Eklenti türü
Kimlik doğrulama ve yetkilendirme.
Alanlar
Kimlik doğrulama yapılandırması
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
consumers içindeki alanlar:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(İsteğe bağlı) Yetkilendirme yapılandırması
|
|
|
|
|
|
|
|
|
|
|
|
Yetkilendirme ve kimlik doğrulama yapılandırmaları aynı kuralda birlikte bulunamaz.
Kimliği doğrulanmış istekler için, çağrıyı tanımlamak amacıyla
X-Mse-Consumerbaşlığı eklenir.
Örnekler
Kimlik doğrulamayı genel olarak yapılandırma ve rotalar için yetkilendirme ayarlama
Aşağıdaki örnek, belirli rotalar veya alan adları için hmac-auth kimlik doğrulamasını etkinleştirir. key alanı benzersiz olmalıdır.
Aşağıdaki eklenti yapılandırmalarını örnek düzeyinde uygulayın:
global_auth: false
consumers:
- key: appKey-example-1
secret: appSecret-example-1
name: consumer-1
- key: appKey-example-2
secret: appSecret-example-2
name: consumer-2
Aşağıdaki eklenti yapılandırmasını route-a ve route-b rotalarına uygulayın:
allow:
- consumer1
Aşağıdaki eklenti yapılandırmasını *.example.com ve test.com alan adlarına uygulayın:
allow:
- consumer2
Bu örnekte
route-averoute-brotaları, ağ geçidi rotaları oluşturulurken belirtilen rotalardır. Bir istemci isteği bu rotalardan biriyle eşleşirse,namedeğericonsumer1olan çağrı ağ geçidine erişebilir. Diğer çağrılar erişemez.Bu örnekte
*.example.comvetest.comalan adları, isteklerdeki alan adlarıyla eşleşmek için kullanılır. Bir istemci isteği bu alan adlarından biriyle eşleşirse,namedeğericonsumer2olan çağrı ağ geçidine erişebilir. Diğer çağrılar erişemez.
Ağ geçitleri için traffic-tag eklentisini etkinleştirme
global_auth: true
consumers:
- key: appKey-example-1
secret: appSecret-example-1
name: consumer-1
- key: appKey-example-2
secret: appSecret-example-2
name: consumer-2
İmzalama mekanizması
Yapılandırma hazırlıkları
İmza oluşturmak ve doğrulamak için aşağıdaki kimlik bilgilerini yapılandırın:
key:
x-ca-keyistek başlığında kullanılır.secret: İstek imzasını oluşturmak için kullanılır.
İstemcide imza oluşturma
Süreç
İstemci şu adımları izleyerek bir imza oluşturur:
Orijinal istekten anahtar verileri çıkararak bir imza dizesi oluşturun.
Yapılandırılmış
secretile imza dizesini şifreleyerek imzayı üretin.Tüm imza ile ilgili başlıkları orijinal HTTP isteğine ekleyin.
İmza dizesi çıkarma
İstemci, HTTP isteğinden anahtar verileri çıkarır ve bunları aşağıdaki biçimde bir imza dizesi halinde birleştirir:
HTTPMethod
Accept
Content-MD5
Content-Type
Date
Headers
PathAndParameters
Bu alanlar \n karakteriyle ayrılır. Headers alanı boşsa \n gerekmez. Diğer boş alanlar için \n karakteri korunmalıdır. İmza büyük/küçük harfe duyarlıdır.
Her alan için çıkarma kuralları:
HTTPMethod: HTTP yöntemi (örneğin POST). Büyük harfle yazılmalıdır.
Accept: Accept istek başlığının değeri. Boş bırakılabilir. Bazı HTTP istemcileri varsayılan olarak
*/*değerini kullandığından imza doğrulamasının başarısız olmasına neden olabilir; bu nedenle Accept başlığını açıkça ayarlamanız önerilir.-
Content-MD5: Content-MD5 başlığının değeri. Boş bırakılabilir. Yalnızca istek form dışı bir gövde içerdiğinde hesaplanır. Java örneği:
String content-MD5 = Base64.encodeBase64(MD5(bodyStream.getbytes("UTF-8"))); Content-Type: Content-Type başlığının değeri. Boş bırakılabilir.
Date: Date başlığının değeri; saat farkı doğrulaması için kullanılır.
date_offsetyapılandırılmamışsa boş bırakılabilir.-
Headers: İmzaya dahil edilen başlıklar. Birleştirme kuralları:
-
Başlık anahtarlarını alfabetik olarak sıralayın ve aşağıdaki gibi birleştirin:
HeaderKey1 + ":" + HeaderValue1 + "\n"\+ HeaderKey2 + ":" + HeaderValue2 + "\n"\+ ... HeaderKeyN + ":" + HeaderValueN + "\n" Bir başlık değeri boşsa imza için HeaderKey + ":" + "\n" kullanın. Anahtar ve iki nokta üst üste işareti (:) korunmalıdır.
İmza için kullanılan başlık anahtarları virgülle (,) ayrılır ve
X-Ca-Signature-Headersbaşlığına yerleştirilir.Aşağıdaki başlıklar imza hesaplamasında kullanılamaz: X-Ca-Signature, X-Ca-Signature-Headers, Accept, Content-MD5, Content-Type ve Date.
-
-
PathAndParameters: Yol, sorgu ve form parametrelerini içerir.
Path + "?" + Key1 + "=" + Value1 + "&" + Key2 + "=" + Value2 + ... "&" + KeyN + "=" + ValueN
Sorgu ve form parametresi anahtarları alfabetik olarak sıralanır ve yukarıda açıklandığı gibi birleştirilir.
Sorgu ve form parametreleri boşsa, imza bilgisi eklemeden yalnızca yol kullanılır.
Aynı anahtara sahip ancak farklı değerlere sahip dizi parametreleri için imza hesaplamasında yalnızca ilk değer kullanılır.
İmza dizesi çıkarma örneği
İlk HTTP isteği:
POST /http2test/test?param1=test HTTP/1.1
host:api.alibabacloud.com
accept:application/json; charset=utf-8
ca_version:1
content-type:application/x-www-form-urlencoded; charset=utf-8
x-ca-timestamp:1525872629832
date:Wed, 09 May 2018 13:30:29 GMT+00:00
user-agent:ALIYUN-ANDROID-DEMO
x-ca-nonce:c9f15cbf-f4ac-4a6c-b54d-f51abf4b5b44
content-length:33
username=xiaoming&password=123456789
Oluşturulan imza dizesi:
POST
application/json; charset=utf-8
application/x-www-form-urlencoded; charset=utf-8
Wed, 09 May 2018 13:30:29 GMT+00:00
x-ca-key:203753385
x-ca-nonce:c9f15cbf-f4ac-4a6c-b54d-f51abf4b5b44
x-ca-signature-method:HmacSHA256
x-ca-timestamp:1525872629832
/http2test/test?param1=test&password=123456789&username=xiaoming
İmza hesaplama
İmza dizesini oluşturduktan sonra istemci, bunu şifreleyip kodlayarak nihai imzayı üretir.
Bu kodda stringToSign çıkarılan imza dizesidir, secret eklenti yapılandırmasından alınır ve sign nihai imzadır.
Mac hmacSha256 = Mac.getInstance("HmacSHA256");
byte[] secretBytes = secret.getBytes("UTF-8");
hmacSha256.init(new SecretKeySpec(secretBytes, 0, secretBytes.length, "HmacSHA256"));
byte[] result = hmacSha256.doFinal(stringToSign.getBytes("UTF-8"));
String sign = Base64.encodeBase64String(result);
stringToSign UTF-8 bayt dizisine dönüştürülür, HMAC algoritmasıyla şifrelenir ve ardından imzayı üretmek için Base64 ile kodlanır.
İmza ekleme
Cloud-native API Gateway'e gönderilen isteklere imza doğrulaması için aşağıdaki başlıkları dahil edin:
x-ca-key: AppKey. Zorunludur.
x-ca-signature-method: İmzalama algoritması. İsteğe bağlıdır. Geçerli değerler: HmacSHA256 ve HmacSHA1. Varsayılan değer: HmacSHA256.
x-ca-signature-headers: Tüm imza başlığı anahtarları, virgülle (,) ayrılmış şekilde. İsteğe bağlıdır.
x-ca-signature: İmza. Zorunludur.
İmza içeren örnek HTTP isteği:
POST /http2test/test?param1=test HTTP/1.1
host:api.alibabacloud.com
accept:application/json; charset=utf-8
ca_version:1
content-type:application/x-www-form-urlencoded; charset=utf-8
x-ca-timestamp:1525872629832
date:Wed, 09 May 2018 13:30:29 GMT+00:00
user-agent:ALIYUN-ANDROID-DEMO
x-ca-nonce:c9f15cbf-f4ac-4a6c-b54d-f51abf4b5b44
x-ca-key:203753385
x-ca-signature-method:HmacSHA256
x-ca-signature-headers:x-ca-timestamp,x-ca-key,x-ca-nonce,x-ca-signature-method
x-ca-signature:xfX+bZxY2yl7EB/qdoDy9v/uscw3Nnj1pgoU+Bm6xdM=
content-length:33
username=xiaoming&password=123456789
Sunucu tarafında imzayı doğrulama
Süreç
Sunucu, istemci imzasını şu adımlarla doğrular:
İstekten anahtar verileri çıkararak bir imza dizesi elde edin.
İstekteki
keydeğerini okuyun ve karşılık gelensecretdeğerini bulun.secretile imza dizesini şifreleyerek bir imza oluşturun.Sunucu tarafındaki imzayı, istekteki istemci tarafı imzasıyla karşılaştırın.
İmza hatalarını giderme
İmza doğrulaması başarısız olduğunda sunucu, sunucu tarafındaki StringToSign değerini X-Ca-Error-Message yanıt başlığında döndürür. Farklılığı tespit etmek için bunu istemci tarafındaki StringToSign değeriyle karşılaştırın.
İki değer eşleşiyorsa imza hesaplaması için kullanılan AppSecret değerini doğrulayın.
HTTP başlıkları satır sonlarını desteklemediğinden StringToSign içindeki satır sonları # karakteriyle değiştirilir.
X-Ca-Error-Message: Server StringToSign:`GET#application/json##application/json##X-Ca-Key:200000#X-Ca-Timestamp:1589458000000#/app/v1/config/keys?keys=TEST`
Hata kodları
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DownstreamConnectionBufferLimits değerini artırmak ağ geçidinin bellek kullanımını önemli ölçüde artırır. Dikkatli olun.