التزويد والتصنيع
التزويد هو كل ما يقع بين "البرنامج الثابت يُبنى" و"يفتح العميل علبة جهاز يعمل ومحصّن". لجهاز هواية واحد هو خمس دقائق مع flash.sh؛ أما هذا الفصل فالنسخة القابلة للتكرار، حيث تفرض هوية كل جهاز وحرق eFuse غير القابل للتراجع ترتيباً للعمليات.
ما يجعل الجهاز فرداً
| العنصر | المصدر | أين يستقر |
|---|---|---|
| عناوين MAC | محروقة في المصنع من Espressif | eFuse (موجودة أصلاً) |
| رمز API | يولده البرنامج الثابت عند أول إقلاع | NVS |
| شهادة TLS | اختيارياً لكل جهاز عند التزويد | قسم التخزين |
| الإعدادات المبذورة مسبقاً (المنطقة الزمنية، افتراضيات المنطقة) | خط التزويد | صورة NVS |
| حالة الإقلاع الآمن وتشفير الفلاش | خط التزويد | eFuse، غير قابلة للتراجع |
خط بذر NVS المسبق
شحن الأجهزة بافتراضيات سليمة (وقيم لكل جهاز في حالة الدفعات) يستخدم أدوات صورة NVS في ESP-IDF ملفوفة بـtools/nvs_mass_provisioning.py: بيان CSV (صف لكل جهاز، وأعمدة لأي مفاتيح NVS) يتحول إلى ملفات قسم NVS لكل جهاز، تُكتب على الفلاش عند إزاحة nvs إلى جانب البرنامج الثابت. لا يميز البرنامج الثابت القيم المبذورة مسبقاً عن تلك التي كتبها بنفسه، وهذا هو المقصود: لا يوجد مسار كود خاص بـ"وضع المصنع" يفسد.
يرتب tools/provision_device.sh تسلسل الجهاز الواحد من البداية إلى النهاية وهو ممل القراءة عن قصد: اكتب الصور على الفلاش، ابذر NVS، شغل الفحوص، اطبع رمز API الظاهر على المنفذ التسلسلي لملصق العلبة إذا أراده إجراء عملك. ملصق العلبة الذي يطبعه يحمل PoP إلى جانب اسم مستخدم التزويد safi (الثابت PROV_USERNAME على مستوى البرنامج الثابت في main/wifi_manager.c)، وهو ما يطلبه تطبيق ESP SoftAP Provisioning قبل PoP.
PoP الخاص بالتزويد يُشتق ولا يُخزن
لا يُكتب PoP في NVS أبداً. يشتقه برنامج الإنتاج الثابت عند الإقلاع من HMAC-SHA256(السر المصنعي، عنوان MAC الأساسي لـWiFi) (main/pop_derive.c، تشفير PSA)، وتشتق أدوات المصنع القيمة نفسها دون اتصال من MAC نفسه:
- يقرأ
tools/nvs_mass_provisioning.pyعمودmacالخاص بكل جهاز في البيان ويكتب PoP المشتق فيlabels.csv(serial,cn,fingerprint,pop). - يقرأ
tools/provision_device.shعنوان MAC الأساسي عبرesptool.py read_macعندما لا يُمرر--pop، ويطبع PoP المشتق على ملصق العلبة.
تتطلب الأداتان SAFI_POP_FACTORY_SECRET (>= 32 محرفاً سداسياً عشرياً)، وهو ما تتحقق منه tools/production_preflight.sh أيضاً. بنيات التطوير بلا سر وتبقي المسار الاحتياطي القديم لـPoP العشوائي (يُولد عند أول إقلاع ويُطبع مرة واحدة على المنفذ التسلسلي)، لذا لا تتأثر الكتابة اليومية على الفلاش.
الشهادات
تتشارك لوحات التطوير شهادة المستودع الموقعة ذاتياً. للإنتاج، تسك tools/generate_production_certs.sh مفتاحاً وشهادة لكل جهاز، خارج شجرة git، تُكتبان في صورة تخزين ذلك الجهاز. مفاتيح لكل جهاز تعني أن المفتاح الواحد المستخرج يخترق جهازاً واحداً، والإبطال هو "ذلك الجهاز"، لا "كل جهاز شُحن يوماً". قصة ثقة المتصفح لم تتغير (توقيع ذاتي في الحالتين، وفق فصل HTTPS)؛ ما يتغير هو مدى الانفجار.
الخطوات غير القابلة للتراجع، بالترتيب
تُحرق eFuses مرة واحدة. التسلسل الذي لا يستطيع شلّ دفعة:
- كل ما هو قابل للتراجع أولاً: اكتب البرنامج الثابت والتخزين وNVS على الفلاش على المنضدة، مع اختبار وظيفي كامل (تقرير الإقلاع هو قائمة التحقق: يجب أن يكون فارغاً).
tools/production_preflight.shيتحقق من أن البناء هو فعلاً ملف الإنتاج (البوابات مفعلة، المفاتيح موجودة،SAFI_POP_FACTORY_SECRETمضبوط، الخيارات غير الآمنة معطلة بنيوياً؛ انظر الأمان).- eFuse الإقلاع الآمن على لوحة تجريبية واحدة من كل دفعة أو خط برنامج ثابت أولاً. تأكد أنها تقلع الصور الموقعة وترفض غير الموقعة.
- تشفير الفلاش ومفتاح HMAC الخاص بـNVS (
tools/provision_device.sh --burn-efuses): مفتاح تشفير الفلاش XTS إلى BLOCK_KEY1، ومفتاح HMAC العشوائي لكل جهاز (HMAC_UP) إلى BLOCK_KEY2، ثم صمامات تفعيل وضع الإصدار. أول إقلاع مشفر يعيد تشفير الفلاش في مكانه؛ يجب ألا ينقطع التيار أثناء ذلك، لذا يحدث هذا على المنضدة، لا عند عميل أبداً. يحمل BLOCK_KEY0 بالفعل ملخص الإقلاع الآمن، فلا تتشارك الأغراض الثلاثة كتلة مفتاح واحدة (انظر تخطيط eFuse). - عندها فقط، بقية الدفعة.
خطوة اللوحة التجريبية ليست خرافة: ملخص مفتاح خاطئ في الخطوة 3 يصنع لوحة معطوبة، والفرق بين لوحة معطوبة واحدة وطبق منها هو هذه الفقرة.
إعادة التزويد في الميدان
- إعادة ضبط المصنع (لوحة التحكم أو مسار الضغط المطول) تولد رمز API من جديد وتمسح الإعدادات؛ عناصر الهوية في eFuse لا تُمَس بالتصميم.
- الجهاز المشفر ذو الإقلاع الآمن يقبل برنامجاً ثابتاً جديداً فقط عبر OTA بصور موقعة؛ إعادة الكتابة عبر USB تتطلب مفتاح التوقيع ومواد مفتاح التشفير. هذا التباين (سهل لك، صعب لكل من سواك) هو نتاج هذا الفصل كله.