يوضح لك هذا الدرس كيفية إنشاء CSR لتطبيق Node.js. لا يحتوي Node.js على أداة مدمجة لإنشاء CSR، لذا فإنك تنشئ المفتاح الخاص وطلب توقيع الشهادة باستخدام OpenSSL على الجهاز الذي سيشغّل Node، ثم ترسل CSR إلى جهة إصدار الشهادات (CA) الخاصة بك، وبعد ذلك تُحمّل الشهادة الصادرة في تطبيقك باستخدام fs.readFileSync() وhttps.createServer().
تعمل الخطوات أدناه على أي نظام تشغيل يوفر OpenSSL، وهذا يشمل جميع توزيعات Linux الحالية، وmacOS، وWindows (عبر ملفات OpenSSL الثنائية الرسمية أو Git Bash). يقوم OpenSSL الحديث بتوقيع الطلبات باستخدام SHA-256 افتراضيًا، لذا لا تحتاج إلى إضافة علامة digest.
الخطوة 1: تأكد من تثبيت OpenSSL
تحقق من توفر OpenSSL على الجهاز الذي سيشغّل تطبيق Node.js الخاص بك:
openssl version
يجب أن ترى سطرًا مثل OpenSSL 3.0.x أو أحدث. إذا لم يتم العثور على الأمر، فقم بتثبيته لمنصتك:
- Debian, Ubuntu:
sudo apt update && sudo apt install openssl - RHEL, AlmaLinux, Rocky Linux, Amazon Linux:
sudo dnf install openssl(أوsudo yum install opensslفي الإصدارات الأقدم) - macOS: يتوفر OpenSSL (LibreSSL في بعض الإصدارات، وOpenSSL 3 إذا تم تثبيته عبر Homebrew) بالفعل في Terminal. لتثبيت النسخة الأصلية:
brew install openssl@3. - Windows: قم بتثبيت ملفات OpenSSL الثنائية الرسمية، أو استخدم Git Bash، الذي يأتي مزودًا بـ OpenSSL مثبتًا مسبقًا.
الخطوة 2: أنشئ المفتاح الخاص وطلب CSR
أنشئ المفتاح وطلب CSR على الجهاز الذي سيشغّل Node.js. يتم إنشاء المفتاح الخاص بجوار CSR ويجب أن يبقى على ذلك الجهاز. تشغيل هذه الأوامر في مكان آخر ثم نسخ المفتاح من مكان إلى آخر يُبطل الغرض من وجود مفتاح خاص من الأساس.
نفّذ الأمر التالي. سينشئ مفتاحًا خاصًا من نوع RSA بحجم 2048 بت وCSR مطابقًا في خطوة واحدة، مع تقديم الموضوع (subject) وأسماء بديلة للموضوع (SANs) بشكل مباشر بحيث لا يتوقف OpenSSL لطرح أسئلة:
openssl req -new -newkey rsa:2048 -nodes
-keyout yourdomain.key
-out yourdomain.csr
-subj "/C=US/ST=YourState/L=YourCity/O=YourCompany/CN=yourdomain.com"
-addext "subjectAltName=DNS:yourdomain.com,DNS:www.yourdomain.com"
وظيفة كل جزء:
- -newkey rsa:2048 ينشئ مفتاح RSA جديدًا بحجم 2048 بت. حجم 2048 بت هو الحد الأدنى الحالي الذي تقبله جهات إصدار الشهادات العامة؛ يمكنك استخدام rsa:4096 لمفتاح أكبر، أو التحول إلى ECDSA (انظر أدناه).
- -nodes يترك المفتاح الخاص غير مشفَّر بحيث يستطيع Node.js قراءته عند بدء التشغيل دون طلب عبارة مرور. يدعم وحدة https في Node خيار passphrase لمفتاح مشفَّر، لكن عبارة المرور لا تزال بحاجة إلى مصدر ما على الجهاز (ملف تكوين، أو متغير بيئة، أو مدير أسرار).
- -keyout و-out يحددان أسماء ملف المفتاح الخاص وملف CSR.
- -subj يقدم موضوع الشهادة. ضع اسم شركتك الحقيقي وولايتك ومدينتك هنا، وليس القيم النائبة. CN (الاسم الشائع) هو نطاقك الأساسي.
- -addext “subjectAltName=…” يسرد كل اسم مضيف يجب أن تغطيه الشهادة. تتحقق جهات إصدار الشهادات العامة من قائمة SAN، لذا أدرج الاسم الشائع هنا أيضًا. تتطلب علامة -addext إصدار OpenSSL 1.1.1 أو أحدث، وهو ما توفره جميع أنظمة التشغيل الحالية.
استبدل yourdomain.com باسم نطاقك الفعلي في كل مكان. لتغطية أسماء مضيف إضافية، أضفها إلى قائمة SAN مفصولة بفواصل، على سبيل المثال DNS:api.yourdomain.com. لشهادة wildcard، أدرج كلاً من الاسم النطاقي مع علامة النجمة والنطاق المجرد: DNS:*.yourdomain.com,DNS:yourdomain.com.
إذا كنت تفضل مفتاح ECDSA (أصغر حجمًا وأسرع، مع دعم واسع لمنحنى P-256)، فأنشئ المفتاح وCSR على النحو التالي بدلاً من ذلك:
openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -pkeyopt ec_param_enc:named_curve -nodes
-keyout yourdomain.key
-out yourdomain.csr
-subj "/C=US/ST=YourState/L=YourCity/O=YourCompany/CN=yourdomain.com"
-addext "subjectAltName=DNS:yourdomain.com,DNS:www.yourdomain.com"
الوضع التفاعلي (بدون -subj)
إذا كنت تفضل أن يطلب منك OpenSSL كل حقل على حدة، فاحذف علامة -subj:
openssl req -new -newkey rsa:2048 -nodes
-keyout yourdomain.key -out yourdomain.csr
-addext "subjectAltName=DNS:yourdomain.com,DNS:www.yourdomain.com"
سيطلب منك OpenSSL التفاصيل التالية:
- اسم الدولة (C): رمز الدولة المكون من حرفين وفق معيار ISO لمؤسستك (على سبيل المثال، US).
- اسم الولاية أو المقاطعة (S): الاسم الكامل للولاية أو المقاطعة التي سُجلت فيها شركتك (على سبيل المثال، California). لا تختصر الاسم.
- اسم المدينة (L): المدينة التي سُجل فيها عملك (على سبيل المثال، San Jose).
- اسم المؤسسة (O): الاسم القانوني لشركتك (على سبيل المثال، GPI Holding LLC). بالنسبة لشهادة DV (المصادقة على النطاق)، اتركه فارغًا واضغط Enter.
- اسم الوحدة التنظيمية (OU): أُهمل منذ سبتمبر 2022 وتتجاهله جهات إصدار الشهادات العامة. اتركه فارغًا.
- الاسم الشائع (CN): اسم النطاق المؤهل بالكامل (FQDN) الذي تقوم بتأمينه، على سبيل المثال yourdomain.com. بالنسبة لشهادة wildcard، استخدم *.yourdomain.com.
- عنوان البريد الإلكتروني: اختياري. اتركه فارغًا.
- كلمة مرور التحدي: غير مستخدمة حاليًا. اتركها فارغة.
الخطوة 3: حدد موقع ملفاتك واحمها
اعرض محتويات الدليل الحالي للتأكد من إنشاء كلا الملفين:
ls
يجب أن ترى ملفين جديدين:
- yourdomain.key: مفتاحك الخاص. احتفظ به على الخادم، ونسخه احتياطيًا بشكل آمن، ولا ترسله إلى أي أحد مطلقًا، بما في ذلك جهة إصدار الشهادات. أي شخص يحمل هذا المفتاح يمكنه انتحال هوية موقعك.
- yourdomain.csr: طلب توقيع الشهادة الخاص بك. هذا هو الملف الذي ترسله إلى مزود SSL.
على Linux أو macOS، اضبط أذونات صارمة على المفتاح الخاص على الفور بحيث يستطيع فقط المستخدم الذي يشغّل Node.js قراءته:
chmod 600 yourdomain.key
إذا كان Node.js يعمل ضمن حساب خدمة مخصص (على سبيل المثال، node أو www-data)، فاضبط أيضًا المالك بحيث تتمكن العملية من قراءة المفتاح:
sudo chown node:node yourdomain.key
الخطوة 4: تحقق من CSR (اختياري لكن مُوصى به)
قبل إرسال الطلب، تحقق من أن CSR يحتوي على الموضوع وأسماء SAN الصحيحة وأن توقيعه صالح. يقوم هذا الأمر بفك تشفير الطلب محليًا باستخدام OpenSSL:
openssl req -noout -text -verify -in yourdomain.csr
تأكد من أن سطر Subject يعرض تفاصيلك، وأن X509v3 Subject Alternative Name يسرد كل اسم مضيف تتوقعه، وأن فحص التوقيع يطبع verify OK. يجب أن تكون خوارزمية التوقيع sha256WithRSAEncryption (أو ecdsa-with-SHA256 لمفتاح ECDSA). إذا كنت تفضل عدم استخدام سطر الأوامر، الصق CSR في أداة فك تشفير CSR الخاصة بنا عبر الإنترنت لقراءة الحقول نفسها في المتصفح.
الخطوة 5: أرسل CSR الخاص بك
لنسخ CSR الخاص بطلبك، اطبع محتوياته:
cat yourdomain.csr
ستشاهد كتلة نص مثل هذه:
-----BEGIN CERTIFICATE REQUEST-----
MIIBozCB... (a long string of characters)
-----END CERTIFICATE REQUEST-----
انسخ الكتلة بأكملها، بما في ذلك سطري —–BEGIN CERTIFICATE REQUEST—– و—–END CERTIFICATE REQUEST—– (لكل علامة خمس شرطات على كل جانب). هذه الكتلة بأكملها هي CSR الخاص بك. الصقها في نموذج الطلب أثناء عملية الشراء، واحتفظ بالمفتاح الخاص المطابق في مكانه على الخادم.
إذا كنت تفضل عدم استخدام سطر الأوامر، يمكنك أيضًا إنشاء الطلب باستخدام أداة إنشاء CSR الخاصة بنا عبر الإنترنت. لاحظ أنها تنشئ المفتاح الخاص في متصفحك، لذا احفظ ذلك المفتاح بنفسك وانقله إلى خادم Node.js.
ماذا يحدث بعد إصدار جهة إصدار الشهادات للشهادة
بمجرد أن تتحقق جهة إصدار الشهادات من CSR وتصدر الشهادة، ستتلقى عادةً شهادة الخادم الخاصة بك (ملف .crt يحمل اسم نطاقك) بالإضافة إلى شهادة وسيطة واحدة أو أكثر، تكون أحيانًا مجمّعة في ملف .ca-bundle. يُحمّل Node.js هذه الملفات في JavaScript: قم بدمج شهادة الخادم والشهادات الوسيطة في ملف واحد باسم fullchain.crt، ثم اقرأه باستخدام fs.readFileSync() ومرره إلى https.createServer():
const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('/path/to/yourdomain.key'),
cert: fs.readFileSync('/path/to/fullchain.crt'),
minVersion: 'TLSv1.2'
};
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('Welcome to a Node.js HTTPS servern');
}).listen(443);
هذا النمط الخاص بالسلسلة الكاملة (fullchain) هو ما تستخدمه معظم إعدادات الإنتاج. الشرح الكامل (بما في ذلك مثال باستخدام وحدات ES، ونهج بديل باستخدام مصفوفة ca:، ومثال باستخدام Express) مُغطى في درسنا حول تثبيت شهادة SSL في Node.js.
ملاحظة حول عمليات النشر في بيئة الإنتاج. في عام 2026، تعمل معظم تطبيقات Node.js التي تتعامل مع حركة المرور العامة خلف وكيل عكسي (reverse proxy) أو موازن تحميل سحابي (NGINX، وHAProxy، وCaddy، وAWS ALB، وCloudflare، وFastly) يقوم بإنهاء اتصال TLS عند الطرف الحدي ثم يمرر HTTP أو HTTP/2 العادي إلى Node على منفذ محلي مرتفع. في هذا النمط، تكون الشهادة (وكذلك CSR الذي أنشأته أعلاه) موجودة على الوكيل أو موازن التحميل، وليس على عملية Node نفسها. السماح لـ Node.js بإنهاء TLS مباشرة أمر مقبول تمامًا لأغراض التطوير، والخدمات الداخلية، وعمليات النشر الصغيرة؛ أما بالنسبة لتطبيق إنتاجي عام، فإن إنهاء TLS عند الطرف الحدي هو النمط الأكثر شيوعًا.
وفِّر 10% على شهادات SSL عند الطلب اليوم!
إصدار سريع، وتشفير قوي، وثقة في المتصفح بنسبة 99.99%، ودعم مخصص، وضمان استرداد المال خلال 25 يومًا. رمز القسيمة: SAVE10


