400 طلب غير صالح - تم إرسال طلب HTTP عادي إلى منفذ HTTPS

يتم الآن عرض مستندات Apigee Edge.
انتقِل إلى مستندات Apigee X.
المعلومات

المشكلة

يتلقّى تطبيق العميل استجابة HTTP 400 Bad Request بالرسالة The plain HTTP request was sent to HTTPS port.

رسالة الخطأ

يحصل تطبيق العميل على رمز الاستجابة التالي:

HTTP/1.1 400 Bad Request

متبوعة بصفحة خطأ HTML التالية:

<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
</body>
</html>

الأسباب المحتملة

السبب الوصف تعليمات تحديد المشاكل وحلّها السارية على
طلب HTTP إلى مضيف افتراضي تم ضبط بروتوكول أمان طبقة النقل (TLS) فيه يُرسِل العميل طلب HTTP إلى مضيف افتراضي تم ضبط بروتوكول أمان طبقة النقل (TLS) فيه. مستخدمو Edge العام والخاص على السحابة الإلكترونية
طلب HTTP إلى نقطة نهاية مستهدفة تم ضبطها باستخدام بروتوكول أمان طبقة النقل (TLS) تم تقديم طلب HTTP إلى خادم خلفية تم تفعيل بروتوكول أمان طبقة النقل (TLS) فيه في نقطة النهاية المستهدفة. مستخدمو Edge العام والخاص على السحابة الإلكترونية
ضبط الخادم الهدف غير صحيح تم إعداد الخادم الهدف باستخدام المنفذ الآمن 443 ولكن طبقة المقابس الآمنة (SSL) غير مفعّلة. مستخدمو Edge العام والخاص على السحابة الإلكترونية

السبب: طلب HTTP إلى مضيف افتراضي تم ضبط بروتوكول أمان طبقة النقل (TLS) فيه

يحدث هذا الخطأ عندما يحاول العميل الاتصال بواجهة برمجة تطبيقات على Apigee، ويتم إعداد المضيف الافتراضي المذكور لاستخدام طبقة المقابس الآمنة ويتلقى طلب HTTP بدلاً من ذلك.

التشخيص

بما أنّ هذه المشكلة تحدث في نقطة نهاية Northbound وتفشل طلبات واجهة برمجة التطبيقات عند تفاعل نقطة الدخول بين تطبيق العميل وجهاز التوجيه، لا يتم تسجيل رسائل الخطأ هذه في سجلات وصول جهاز التوجيه NGINX. وبالتالي، لن يتم تسجيل هذه الطلبات في أدوات مثل "مراقبة واجهة برمجة التطبيقات" و"أداة التتبُّع".

  1. تحقَّق من طلب بيانات من واجهة برمجة التطبيقات واكتشِف ما إذا كنت تنشئ طلب HTTP لاسم مضيف مستعار تم إعداده لقبول الطلبات فقط على المنفذ الآمن 443. إذا كان الأمر كذلك، يكون هذا هو سبب المشكلة.

    نموذج طلب غير صحيح من واجهة برمجة التطبيقات:

    curl http://org-test.apigee.net:443/400-demo
    
    <html>
    <head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
    <body>
    <center><h1>400 Bad Request</h1></center>
    <center>The plain HTTP request was sent to HTTPS port</center>
    <hr><center>server</center>
    </body>
    </html>
    
  2. في نموذج الطلب أعلاه، يُرجى العلم أنّه يتم إرسال طلب HTTP إلى الاسم المستعار للمضيف myorg-test.apigee.net على المنفذ الآمن 443. وهذا هو سبب الخطأ 400 Bad Request.

درجة الدقّة

عليك التحقّق مما إذا كان العميل يستخدم HTTP بدلاً من HTTPs وتقديم الطلب الصحيح كما هو موضّح أدناه:

نموذج طلب البيانات من واجهة برمجة التطبيقات:

curl https://org-test.apigee.net:443/400-demo

أو

curl https://org-test.apigee.net/400-demo
< HTTP/1.1 200 OK
< Date: Thu, 25 Feb 2021 13:01:43 GMT
< Content-Type: text/xml;charset=UTF-8
< Content-Length: 403
< Connection: keep-alive
< Server: gunicorn/19.9.0
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true

السبب: طلب HTTP إلى نقطة نهاية مستهدفة تم إعدادها لبروتوكول أمان طبقة النقل (TLS)

يحدث هذا الخطأ إذا ضبطت طلبات HTTP بشكل غير صحيح على خادم خلفية تم تفعيل بروتوكول أمان طبقة النقل (TLS) فيه في نقطة النهاية المستهدفة لخادم وكيل لواجهة برمجة التطبيقات.

التشخيص

اتّبِع الخطوات التالية لتشخيص الخطأ باستخدام أداة "تتبُّع":

  1. فعِّل Trace في واجهة مستخدم Apigee للخادم الوكيل لواجهة برمجة التطبيقات المتأثرة.
  2. يمكنك تقديم طلبات إلى الخادم الوكيل لواجهة برمجة التطبيقات.
  3. اختَر أحد طلبات البيانات من واجهة برمجة التطبيقات التي تعذّر تنفيذها برمز الاستجابة 400.
  4. تنقل عبر المراحل المختلفة وحدد مكان حدوث الفشل.
  5. ستظهر عادةً استجابة الخطأ 400 من الخادم الخلفية. وهذا يعني أنّه ستظهر لك استجابة الخطأ 400 في مرحلة الاستجابة المستلمة من الخادم الهدف كما هو موضّح أدناه:

  6. حدِّد نقطة النهاية المستهدفة التي تم تقديم الطلب من أجلها عن طريق النقر على رمز AX (بيانات "إحصاءات Google" المسجّلة) في التتبُّع.

  7. تذكّر target.url الذي يحتوي على البروتوكول، والاسم المستعار لمضيف خادم الخلفية، وفي بعض الأحيان رقم المنفذ. المنفذ المستخدَم لعنوان URL المستهدَف هو 443 في حين أنّ البروتوكول هو HTTP.
  8. راجِع تعريف نقطة النهاية المستهدفة لفهم الإعدادات.
  9. تحقَّق من أنّ مضيف خادم الخلفية آمن ويستمع إلى منفذ آمن مثل 443. في حال استخدام البروتوكول على أنّه http في العنصر <URL>، يكون سبب هذه المشكلة.

    نموذج ضبط نقطة النهاية المستهدفة:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <TargetEndpoint name="default">
        <Description/>
        <FaultRules/>
        <PreFlow name="PreFlow">
            <Request/>
            <Response/>
        </PreFlow>
        <PostFlow name="PostFlow">
            <Request/>
            <Response/>
        </PostFlow>
        <Flows/>
        <HTTPTargetConnection>
            <Properties/>
            <URL>http://somehost.org:443/get</URL>
        </HTTPTargetConnection>
    </TargetEndpoint>
    

    يوضح المثال أعلاه أنّك تستخدم بروتوكول HTTP، لكنّ المنفذ المستخدَم هو المنفذ الآمن 443. يؤدي ذلك إلى استجابة خادم الخلفية باستخدام 400 Bad Request ورسالة الخطأ The plain HTTP request was sent to HTTPS port.

درجة الدقّة

  1. إذا كان خادم الخلفية آمنًا/مفعّلاً ببروتوكول أمان طبقة النقل (TLS)، تأكَّد من استخدام البروتوكول كـ https في العنصر <URL> في نقطة النهاية المستهدفة كما هو موضّح في المثال التالي:

    نموذج ضبط نقطة النهاية المستهدفة:

    <HTTPTargetConnection>
        <Properties/>
        <URL>https://somehost.org:443/get</URL>
    </HTTPTargetConnection>
    
  2. إذا كان خادم الخلفية غير آمن، سيحدث ما يلي:

    • لا تذكر رقم المنفذ الآمن، مثل 443.
    • ليس عليك ذكر رقم المنفذ على الإطلاق، إذا كان خادم الخلفية استماع إلى منفذ عادي غير آمن.
    • اذكر رقم المنفذ إذا كنت تستخدم أي منفذ آخر غير آمن، على سبيل المثال: 9080

    نموذج ضبط نقطة النهاية المستهدفة:

    <HTTPTargetConnection>
        <Properties/>
        <URL>http://somehost.org/get</URL>
    </HTTPTargetConnection>
    
    or
    
    <HTTPTargetConnection>
        <Properties/>
        <URL>http://somehost.org:9080/get</URL>
    </HTTPTargetConnection>
    

السبب: إعدادات الخادم الهدف غير صحيحة

في حال ضبط الخادم الهدف باستخدام منفذ آمن مثل 443 بدون تفعيل طبقة المقابس الآمنة، سيؤدي ذلك إلى إرسال "معالج الرسائل" في Apigee Edge إلى خادم مستهدف آمن أو تم ضبطه من خلال بروتوكول أمان طبقة النقل (TLS)، ما يؤدي إلى حدوث هذه المشكلة.

التشخيص

اتّبِع الخطوات التالية لتشخيص الخطأ باستخدام أداة "تتبُّع":

  1. فعِّل Trace في واجهة مستخدم Apigee للخادم الوكيل لواجهة برمجة التطبيقات المتأثرة.
  2. يمكنك تقديم طلبات إلى الخادم الوكيل لواجهة برمجة التطبيقات.
  3. اختَر أحد طلبات البيانات من واجهة برمجة التطبيقات التي تعذّر تنفيذها مع ظهور رمز الاستجابة 400.
  4. تنقل عبر المراحل المختلفة وحدد مكان حدوث الفشل.
  5. ستظهر لك عادةً استجابة الخطأ 400 من الخادم الخلفية. ويعني ذلك ظهور استجابة الخطأ 400 في مرحلة الاستجابة المُستلَمة من الخادم الهدف كما هو موضّح أدناه:

  6. حدِّد نقطة النهاية المستهدفة التي تم تقديم الطلب من أجلها عن طريق النقر على رمز AX (بيانات "إحصاءات Google" المسجّلة) في التتبُّع.

  7. دوِّن target.name الذي يمثّل اسم نقطة النهاية المستهدَفة.

    في نموذج ملف التتبُّع أعلاه، تكون قيمة target.name هي default. ويشير هذا إلى أنّ نقطة النهاية المستهدفة المستخدَمة لهذا الطلب هي نقطة النهاية التلقائية.

  8. راجِع تعريف نقطة النهاية المستهدفة لفهم الإعدادات.

    نموذج ضبط نقطة النهاية المستهدفة:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <TargetEndpoint name="default">
        <Description/>
        <FaultRules/>
        <PreFlow name="PreFlow">
            <Request/>
            <Response/>
        </PreFlow>
        <PostFlow name="PostFlow">
            <Request/>
            <Response/>
        </PostFlow>
        <Flows/>
        <HTTPTargetConnection>
            <Properties/>
            <LoadBalancer>
            <Server name="faulty-target"/>
            </LoadBalancer>
        </HTTPTargetConnection>
    </TargetEndpoint>
    

    يوضِّح نموذج إعداد نقطة النهاية المستهدفة أعلاه أنّك تستخدم خادمًا مستهدفًا باسم faulty-target.

  9. بعد الحصول على اسم الخادم الهدف، يمكنك استخدام إحدى الطرق التالية للتحقق من إعدادات الخادم الهدف:

    • واجهة مستخدم Edge
    • واجهة برمجة التطبيقات لإدارة Google Analytics

واجهة مستخدم Edge

  1. انتقِل إلى Apigee Edge > المشرف > البيئات > الخوادم المستهدفة.
  2. اختَر الخادم الهدف المحدَّد الذي تم تحديده من الخادم الوكيل لواجهة برمجة التطبيقات وانقر على تعديل.
  3. تحقَّق من المنفذ المحدّد للخادم الهدف ومعلومات طبقة المقابس الآمنة.
  4. في حال ضبط الخادم الهدف باستخدام منفذ آمن (مثل: 443) مع عدم تفعيل طبقة المقابس الآمنة، يكون هذا هو سبب هذه المشكلة.

    كما ترى في لقطة الشاشة أعلاه، المنفذ المستخدَم هو 443 إلا أنّ طبقة المقابس الآمنة (SSL) غير مفعّلة لهذا المنفذ في ضبط الخادم الهدف. يؤدي ذلك إلى إرسال "معالج الرسائل" في Apigee Edge إلى المنفذ الآمن 443. لذلك، تظهر لك رسالة الخطأ 400 Bad Request مع الرسالة The plain HTTP request was sent to HTTPS port.

واجهة برمجة التطبيقات لإدارة Google Analytics

  1. نفِّذ واجهة برمجة تطبيقات الحصول على الخادم الهدف للحصول على تفاصيل حول ضبط الخادم الهدف المحدّد كما هو موضّح أدناه:

    مستخدم السحابة الإلكترونية العامة:

    curl -v 'https://api.enterprise.apigee.com/v1/organizations/ORG_NAME/environments/ENV_NAME>/targetservers/TARGET_SERVER_NAME' \
    -H "Content-Type:application/xml" \
    -H "Authorization:Bearer $TOKEN"
    

    مستخدم Cloud خاص:

    curl -v 'http://MANAGEMENT_IP:8080/v1/organizations/ORG_NAME/environments/ENV_NAME/targetservers/TARGET_SERVER_NAME' \
    -H "Content-Type:application/xml" \
    -H "Authorization:Bearer $TOKEN"
    
  2. تحقَّق من المنفذ المحدّد للخادم الهدف ومعلومات طبقة المقابس الآمنة.
  3. في حال إعداد الخادم الهدف باستخدام منفذ آمن (مثل: 443)، ولكن لم يتم تحديد القسم SSLInfo أو لم يتم تفعيله، هذا هو سبب هذه المشكلة.

    نموذج ضبط الخادم الهدف:

    {
      "host" : "somehost.org",
      "isEnabled" : true,
      "name" : "faulty-target",
      "port" : 443
    }
    

    في نموذج الإخراج أعلاه، يمكننا ملاحظة أنّ المنفذ المستخدَم للاتصال الهدف هو 443، ولكن ما مِن مجموعة إعدادات SSLInfo غير متوفّرة.

    يؤدي ذلك إلى إرسال "معالج الرسائل" في Apigee Edge إلى المنفذ الآمن 443. لذلك، تظهر لك رسالة الخطأ 400 Bad Request مع الرسالة The plain HTTP request was sent to HTTPS port.

درجة الدقّة

إذا كان الخادم المستهدف آمنًا أو تم ضبطه من خلال بروتوكول أمان طبقة النقل (TLS)، عليك تفعيل طبقة المقابس الآمنة للخادم الهدف المحدَّد.

ويمكنك إجراء ذلك باستخدام أحد الخيارات التالية:

  • واجهة مستخدم Edge
  • واجهة برمجة التطبيقات لإدارة Google Analytics

واجهة مستخدم Edge

  1. انتقِل إلى الخادم الهدف في واجهة مستخدم Edge > المشرف > البيئات > الخوادم المستهدفة.
  2. اختَر الخادم الهدف المحدَّد وانقر على تعديل.
  3. إذا كان الخادم الهدف آمنًا ويستخدم منفذًا مثل 443، يمكنك تفعيل طبقة المقابس الآمنة من خلال وضع علامة في مربع الاختيار بجانب خيار طبقة المقابس الآمنة.
  4. اضبط Truststore وCiphers وProtocols. (عند الطلب فقط)

واجهة برمجة التطبيقات لإدارة Google Analytics

استخدِم واجهة برمجة تطبيقات الإدارة لإعداد الخادم الهدف كما هو موضّح في مستندات تعديل إعدادات الخادم الهدف.

ضرورة جمع معلومات التشخيص

في حال استمرار المشكلة حتى بعد اتّباع التعليمات الواردة أعلاه، يُرجى جمع معلومات التشخيص التالية، ثم التواصل مع فريق دعم Apigee Edge.

  1. إذا كنت من مستخدمي Public Cloud، قدّم المعلومات التالية:
    • اسم المؤسسة
    • اسم البيئة
    • اسم الخادم الوكيل لواجهة برمجة التطبيقات
    • إكمال أمر curl لإعادة إظهار الخطأ
    • نتائج أداة التتبُّع (إذا كنت قادرًا على التقاط الصورة الخاصة بالطلب الذي يتعذّر تنفيذه)
  2. إذا كنت أحد مستخدمي السحابة الإلكترونية الخاصة، يُرجى تقديم المعلومات التالية:
    • تم رصد رسالة خطأ مكتملة.
    • اسم البيئة
    • حزمة الخادم الوكيل لواجهة برمجة التطبيقات
    • تعريف الخادم الهدف (إذا كنت تستخدم الخادم الهدف في نقطة النهاية)
    • نتائج أداة التتبُّع (إذا كنت قادرًا على التقاط الصورة الخاصة بالطلب الذي يتعذّر تنفيذه)