المقدمة
يوضح هذا المستند كيفية التعرف على خطاف ويب في Intersight.
المتطلبات الأساسية
عندما يرسل Cisco Intersight خطاف ويب إلى التطبيق الخاص بك، فإنه يرسل بشكل أساسي حدثا (مثل تنبيه الخادم). ولكن كيف تعرف أن الرسالة جاءت بالفعل من Cisco ولم يتم إرسالها من قبل شخص آخر يحاول إطلاق إجراء وهمي في نظامك؟
لحل هذه المشكلة، يستخدم Intersight سر ويب هوك. فكروا فيها كفقمة على ظرف: إذا كسر الختم أو بدا مختلفا عن المتوقع، لا تثق بالحرف.
ضبط السر
تتمثل الخطوة الأولى في تكوين WebHook في Intersight وإنشاء سر مشترك.
- تسجيل الدخول إلى Cisco Intersight.
- انتقل إلى الإعدادات > WebHoks.
- عندما تقوم بإنشاء أو تحرير WebHook، يمكنك رؤية حقل مسمىSecret.
- قم بتعريف هذه السلسلة بنفسك (على سبيل المثال، plesecret). بمجرد الحفظ، يستخدم Intersight هذا لتوقيع كل رسالة يرسلها.
- هام: احفظ هذا السر بطريقة آمنة ولا تشاركه علنا.

منطق التحقق من الصحة
الخطوة 1: التحقق من الختم (ملخص الجسم)
أول شيء يجب التحقق منه هو ما إذا كان جسم الرسالة قد تغير أثناء رحلته. إننا نقوم بذلك باستخدام تجزئة (على وجه التحديد SHA-256).
ما هي التجزئة؟
انها كبصمة اصبع. حتى إذا قمت بتغيير فاصلة واحدة في وثيقة ذات 10 صفحات، فإن بصمة الإصبع تتغير تماما.
المنطق:
- خذ نص الطلب الخام (نص JSON كما وصل تماما).
- قم بتشغيله من خلال وظيفة SHA-256التجزئة.
- قم بتحويل بصمة الإصبع الثنائية هذه إلى سلسلة يمكن قراءتها باستخدام ترميز Base64.
- قارن نتائجك بDigesthetheader المرسل من Intersight.
- يجب أن يكون الأمر كما يلي:SHA-256=your_calculated_string.
الخطوة 2: إعداد هدف الطلب
يتضمن Intersight وجهة الرسالة في توقيعها لمنع هجمات إعادة التشغيل (حيث يسرق شخص رسالة صحيحة ويرسلها إلى نقطة نهاية مختلفة).
المنطق:إنشاء سلسلة تجمع بين طريقة HTTP والمسار.
التنسيق:(الطلب-الهدف): نشر /your/endpoint/path
الخطوة 3: إنشاء سلسلة التوقيع
يجب أن يكون متبعا بترتيب صارم.
هذا حيث يواجه معظم المطورين مشاكل. يكون Intersight صارما جدا حول الترتيب، حساسية الحالة، وتنسيق الرؤوس المستخدمة للتوقيع. يجب إنشاء كتلة واحدة من النص حيث يكون كل سطر اسم الرأس: القيمة.
الأمر المطلوب بدقة:
- (الطلب-الهدف) (من الخطوة 2)
- مضيف
- تاريخ
- ملخص (القيمة الكاملة لرأس الملخص من الخطوة 1)
- المحتوى - النوع
- المحتوى - الطول
(request-target): post /api/webhook
host: myapp.example.com
date: Mon, 09 Mar 2026 12:50:29 GMT
digest: SHA-256=L6Y...
content-type: application/json
content-length: 542
الخطوة 4: إنشاء التوقيع (HMAC)
الآن يمكنك إستخدام المفتاح السري (من واجهة مستخدم Intersight) لتوقيع السلسلة التي أنشأناها للتو. نستخدم طريقة تسمى HMAC-SHA256.
ما هو HMAC؟
إنها طريقة لتوقيع رسالة باستخدام مفتاح سري. فقط شخص ما بنفس المفتاح السري يستطيع إنتاج نفس التوقيع.
المنطق:
- إدخال:سلسلة التوقيع من الخطوة 3.
- المفتاح:سر WebHook.
- العملية:تشغيل خوارزمية HMAC-SHA256.
- المخرجات:خذ البيانات الثنائية الناتجة وترميز Base64.
الخطوة 5: المقارنة النهائية
يرسل Intersight رأس تخويل. تحتاج إلى إعادة بناء ما تتوقع أن يبدو ذلك الرأس باستخدام التوقيع الذي قمت بتوليده للتو.
إذا تطابقت السلسلة المحسوبة لديك مع رأس التفويض المتوفر في الطلب، تكون الرسالة أصلية.
اعتبارات هامة
- انحراف الساعة: تحقق دائما من رأس البيانات. إذا كان الطلب قديما أكثر من 5 دقائق مقارنة بالوقت الذي يستغرقه الخادم، فارفض الطلب لمنع هجمات إعادة التشغيل.
- الجسم الخام: لا تقم بتحليل JSON ثم أعد تنسيقه قبل التحقق من صحة الملخص. تضيف المكتبات المختلفة مسافات مختلفة، والتي سوف تكسر التجزئة.
- ترتيب الرأس: يتحقق Intersight من صحة التوقيع بناء على الأمر المعرف في رؤوس الصفحات=...."قسم رأس التخويل. تأكد من أن السلسلة الخاصة بك توقع التطابقات التي تم طلبها بالضبط.
أمثلة قابلة للتحقق
لمساعدتك على إختبار التعليمات البرمجية الخاصة بك، فيما يلي مثال يستند إلى حمولة ويب حقيقية مرسلة من Intersight.

محددات الاختبار
Secret:secret
Host:webhook.site
Path:/1ac92110-de44-47ae-93e0-50c1a29bc327
Date:Mon, 09 Mar 2026 13:01:51 GMT
Content-Length:419
Payload:{"ObjectType":"mo.WebhookResult","ClassId":"mo.WebhookResult","AccountMoid":"61a779717564612d33ae624b","DomainGroupMoid":"61a779717564612d33ae624d","EventObjectType":"","Event":null,"Operation":"None","Subscription":{"ObjectType":"notification.AccountSubscription","ClassId":"mo.MoRef","Moid":"691d25b97375733001299f29","link":"https://intersight.com/api/v1/notification/AccountSubscriptions/691d25b97375733001299f29"}}
Expected Signature:LSziO6ZXlgZizJsqsaIWqkqNHxkMFy3VWq3NRxLkvWo=
التحقق من Bash و OpenSSL
#!/bin/bash
# 1. Setup the inputs
SECRET="secret"
EXPECTED_SIG="LSziO6ZXlgZizJsqsaIWqkqNHxkMFy3VWq3NRxLkvWo="
PAYLOAD='{"ObjectType":"mo.WebhookResult","ClassId":"mo.WebhookResult","AccountMoid":"61a779717564612d33ae624b","DomainGroupMoid":"61a779717564612d33ae624d","EventObjectType":"","Event":null,"Operation":"None","Subscription":{"ObjectType":"notification.AccountSubscription","ClassId":"mo.MoRef","Moid":"691d25b97375733001299f29","link":"https://intersight.com/api/v1/notification/AccountSubscriptions/691d25b97375733001299f29"}}'
# 2. Calculate the Body Digest
# We use echo -n to ensure no trailing newline is added to the payload
DIGEST=$(echo -n "$PAYLOAD" | openssl dgst -sha256 -binary | openssl base64)
FULL_DIGEST="SHA-256=$DIGEST"
# 3. Build the Signing String (Strict Order!)
# Note: The format must be exactly: header: value\n
SIGNING_STR="(request-target): post /1ac92110-de44-47ae-93e0-50c1a29bc327
host: webhook.site
date: Mon, 09 Mar 2026 13:01:51 GMT
digest: $FULL_DIGEST
content-type: application/json
content-length: 419"
# 4. Generate the HMAC-SHA256 Signature
CALCULATED_SIG=$(echo -n "$SIGNING_STR" | openssl dgst -sha256 -hmac "$SECRET" -binary | openssl base64)
# 5. Output the results for comparison
echo "--- Verification Results ---"
echo "Expected Signature: $EXPECTED_SIG"
echo "Calculated Signature: $CALCULATED_SIG"
if [ "$EXPECTED_SIG" == "$CALCULATED_SIG" ]; then
echo "SUCCESS: The signatures match!"
else
echo "FAILURE: The signatures do not match."
fi
التحقق من PowerShell
# 1. Setup the inputs
$Secret = "secret"
$ExpectedDigest = "5dMQrSnQQU6PYZ91vA8lf0hFo6mIotGxolFS9lekPEM="
$ExpectedSig = "LSziO6ZXlgZizJsqsaIWqkqNHxkMFy3VWq3NRxLkvWo="
$Payload = '{"ObjectType":"mo.WebhookResult","ClassId":"mo.WebhookResult","AccountMoid":"61a779717564612d33ae624b","DomainGroupMoid":"61a779717564612d33ae624d","EventObjectType":"","Event":null,"Operation":"None","Subscription":{"ObjectType":"notification.AccountSubscription","ClassId":"mo.MoRef","Moid":"691d25b97375733001299f29","link":"https://intersight.com/api/v1/notification/AccountSubscriptions/691d25b97375733001299f29"}}'
# 2. Calculate the Body Digest
$Sha256 = [System.Security.Cryptography.SHA256]::Create()
$PayloadBytes = [System.Text.Encoding]::UTF8.GetBytes($Payload)
$HashBytes = $Sha256.ComputeHash($PayloadBytes)
$CalculatedDigest = [Convert]::ToBase64String($HashBytes)
# 3. Build the Signing String (Strict Order!)
# Note: `n is the PowerShell newline character.
# The string must match the order in the Authorization header exactly.
$SigningStr = "(request-target): post /1ac92110-de44-47ae-93e0-50c1a29bc327`n" +
"host: webhook.site`n" +
"date: Mon, 09 Mar 2026 13:01:51 GMT`n" +
"digest: SHA-256=$CalculatedDigest`n" +
"content-type: application/json`n" +
"content-length: 419"
# 4. Generate the HMAC-SHA256 Signature
$Hmac = New-Object System.Security.Cryptography.HMACSHA256
$Hmac.Key = [System.Text.Encoding]::UTF8.GetBytes($Secret)
$SigBytes = $Hmac.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($SigningStr))
$CalculatedSig = [Convert]::ToBase64String($SigBytes)
# 5. Output the results for comparison
Write-Host "--- Verification Results ---" -ForegroundColor Cyan
Write-Host "Digest Match: " -NoNewline
if ($CalculatedDigest -eq $ExpectedDigest) {
Write-Host "SUCCESS" -ForegroundColor Green
} else {
Write-Host "FAILED" -ForegroundColor Red
}
Write-Host "Expected Signature: $ExpectedSig"
Write-Host "Calculated Signature: $CalculatedSig"
if ($CalculatedSig -eq $ExpectedSig) {
Write-Host "SUCCESS: The signatures match!" -ForegroundColor Green
} else {
Write-Host "FAILURE: The signatures do not match." -ForegroundColor Red
}
معلومات ذات صلة