جوهر OpenSSL: العمل مع شهادات SSL والمفاتيح الخاصة وطلبات CSR

المقدمة

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

كيفية استخدام هذا الدليل:

  • إذا كنت لا تعرف طلبات توقيع الشهادات (CSRs)، اقرأ القسم الأول
  • بالإضافة إلى القسم الأول، يكون هذا الدليل بتنسيق ورقة غش: قائمة من مقاطع سطر الأوامر المستقلة
  • انتقل إلى أي قسم يكون ذا صلة بالمهمة التي تحاول إكمالها (تلميح: استخدم قائمة المحتويات أو وظيفة البحث في متصفحك)
  • معظم الأوامر هي معظمها سطور تم توسيعها إلى عدة أسطر (باستخدام الرمز \) للوضوح

حول طلبات توقيع الشهادات (CSRs)

إذا كنت ترغب في الحصول على شهادة SSL من سلطة إصدار شهادات تجارية (CA)، يجب عليك إنشاء طلب توقيع الشهادة (CSR). يتكون طلب توقيع الشهادة بشكل رئيسي من المفتاح العمومي لزوج المفاتيح، وبعض المعلومات الإضافية. يتم إدراج هذين المكونين في الشهادة عند توقيعها.

عندما تقوم بإنشاء CSR، سيتم طلب منك تقديم معلومات حول الشهادة. تعرف هذه المعلومات باسم الاسم المميز (DN). الحقل المهم في DN هو اسم المشترك (CN)، والذي يجب أن يكون الاسم الكامل للنطاق المؤهل بالكامل (FQDN) للمضيف الذي تنوي استخدام الشهادة معه. من الممكن أيضًا تخطي الاستجوابات التفاعلية عند إنشاء CSR عن طريق تمرير المعلومات عبر سطر الأوامر أو من ملف.

العناصر الأخرى في DN توفر معلومات إضافية حول عملك أو منظمتك. إذا كنت تقوم بشراء شهادة SSL من سلطة إصدار الشهادات، فمن المطلوب في كثير من الأحيان أن تعكس هذه الحقول الإضافية، مثل “المنظمة”، تفاصيل منظمتك بدقة.

فيما يلي مثال على ما ستبدو عليه مطالبة المعلومات لـ CSR:

---
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:Brooklyn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company
Organizational Unit Name (eg, section) []:Technology Division
Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com
Email Address []:

إذا كنت ترغب في الإجابة على المطالبة بمعلومات CSR بشكل غير تفاعلي، يمكنك القيام بذلك عن طريق إضافة الخيار -subj إلى أي أوامر OpenSSL التي تطلب معلومات CSR. فيما يلي مثال على الخيار، باستخدام نفس المعلومات المعروضة في كتلة الكود أعلاه:

-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"

الآن بعد أن فهمت ماهية CSRs، لا تتردد في الانتقال إلى القسم الذي يغطي احتياجاتك من OpenSSL في هذا الدليل.

إنشاء طلبات التوقيع على الشهادات (CSRs)

تغطي هذه الجزء الأوامر في OpenSSL المتعلقة بإنشاء طلبات التوقيع على الشهادات (CSRs) (والمفاتيح الخاصة، إذا لم تكن موجودة بالفعل). يمكن استخدام CSRs لطلب شهادات SSL من سلطة الشهادات.

تذكر أنه يمكنك إضافة معلومات CSR بطريقة غير تفاعلية باستخدام الخيار -subj، كما ذكر في الجزء السابق.

إنشاء مفتاح خاص وCSR

استخدم هذه الطريقة إذا كنت ترغب في استخدام HTTPS (HTTP عبر TLS) لتأمين خادم ويب Apache HTTP أو Nginx الخاص بك، وترغب في استخدام سلطة الشهادات (CA) لإصدار شهادة SSL. يمكن إرسال CSR الذي يتم إنشاؤه إلى CA لطلب إصدار شهادة SSL موقعة من قبل CA. إذا كانت CA الخاصة بك تدعم SHA-2، فأضف الخيار -sha256 لتوقيع CSR باستخدام SHA-2.

تنشئ هذه الأمر مفتاحًا خاصًا بمقاس 2048 بت (domain.key) و CSR (domain.csr) من البداية:

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -out domain.csr

قم بالرد على استفسار معلومات CSR لاستكمال العملية.

الخيار -newkey rsa:2048 يحدد أن المفتاح يجب أن يكون بحجم 2048 بت، تم إنشاؤه باستخدام خوارزمية RSA. الخيار -nodes يحدد أن المفتاح الخاص لن يتم تشفيره بواسطة عبارة مرور. الخيار -new، الذي لم يُذكر هنا ولكنه مفهوم، يشير إلى أن طلب CSR يتم إنشاؤه.

إنشاء طلب CSR من مفتاح خاص موجود

استخدم هذا الأسلوب إذا كان لديك بالفعل مفتاح خاص ترغب في استخدامه لطلب شهادة من سلطة إصدار.

تنشئ هذه الأمر طلب CSR جديد (domain.csr) استنادًا إلى مفتاح خاص موجود (domain.key):

  1. openssl req \
  2. -key domain.key \
  3. -new -out domain.csr

اجيب على معلومات طلب CSR لإكمال العملية.

الخيار -key يحدد مفتاح خاص موجود (domain.key) سيتم استخدامه لإنشاء طلب CSR جديد. الخيار -new يشير إلى أنه يتم إنشاء طلب CSR.

إنشاء طلب CSR من شهادة ومفتاح خاص موجودين

استخدم هذا الأمر إذا كنت ترغب في تجديد شهادة موجودة ولكنك أنت أو شركة الشهادات لديك لا تمتلكان CSR الأصلي لأي سبب. يُوفر لك هذا الأمر عناء إعادة إدخال معلومات CSR، حيث يستخرج تلك المعلومات من الشهادة الموجودة.

هذا الأمر ينشئ CSR جديد (domain.csr) بناءً على شهادة موجودة (domain.crt) ومفتاح خاص (domain.key):

  1. openssl x509 \
  2. -in domain.crt \
  3. -signkey domain.key \
  4. -x509toreq -out domain.csr

الخيار -x509toreq يحدد أنك تستخدم شهادة X509 لإنشاء CSR.

إنشاء شهادات SSL

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

A common type of certificate that you can issue yourself is a self-signed certificate. A self-signed certificate is a certificate that is signed with its own private key. Self-signed certificates can be used to encrypt data just as well as CA-signed certificates, but your users will be displayed a warning that says that the certificate is not trusted by their computer or browser. Therefore, self-signed certificates should only be used if you do not need to prove your service’s identity to its users (e.g. non-production or non-public servers).

تشمل هذه القسم الأوامر المتعلقة بـ OpenSSL التي تتعلق بإنشاء شهادات ذاتية التوقيع.

إنشاء شهادة ذاتية التوقيع

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

هذا الأمر ينشئ مفتاحًا خاصًا بطول 2048 بت (domain.key) وشهادة موقع موقع ذاتية التوقيع (domain.crt) من البداية:

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -x509 -days 365 -out domain.crt

أجب على استفسار معلومات CSR لاستكمال العملية.

الخيار -x509 يخبر req بإنشاء شهادة ذاتية التوقيع. الخيار -days 365 يحدد أن الشهادة ستكون صالحة لمدة 365 يومًا. يتم إنشاء CSR مؤقت لجمع المعلومات التي يتعين ربطها بالشهادة.

إنشاء شهادة ذاتية التوقيع من مفتاح خاص موجود

استخدم هذا الأسلوب إذا كان لديك بالفعل مفتاح خاص ترغب في إنشاء شهادة ذاتية التوقيع به.

ينشئ هذا الأمر شهادة ذاتية التوقيع (domain.crt) من مفتاح خاص موجود (domain.key):

  1. openssl req \
  2. -key domain.key \
  3. -new \
  4. -x509 -days 365 -out domain.crt

أجب على استفسار معلومات CSR لاستكمال العملية.

الخيار -x509 يخبر req بإنشاء شهادة ذاتية التوقيع. الخيار -days 365 يحدد أن الشهادة ستكون صالحة لمدة 365 يومًا. الخيار -new يمكّن من استعلام معلومات CSR.

أنشئ شهادة موقع ذاتية التوقيع من مفتاح خاص و CSR موجودين

استخدم هذه الطريقة إذا كان لديك بالفعل مفتاح خاص و CSR وترغب في إنشاء شهادة ذاتية التوقيع باستخدامها.

تقوم هذه الأمر بإنشاء شهادة ذاتية التوقيع (domain.crt) من مفتاح خاص موجود (domain.key) و (domain.csr):

  1. openssl x509 \
  2. -signkey domain.key \
  3. -in domain.csr \
  4. -req -days 365 -out domain.crt

الخيار -days 365 يحدد أن الشهادة ستكون صالحة لمدة 365 يومًا.

عرض الشهادات

ملفات الشهادة و CSR مشفرة بتنسيق PEM، الذي لا يمكن قراءته بسهولة من قبل الإنسان.

تغطي هذه القسم الأوامر في OpenSSL التي ستخرج الإدخالات الفعلية لملفات PEM المشفرة.

عرض إدخالات CSR

تسمح هذه الأمر بعرض والتحقق من محتويات CSR (domain.csr) بنص عادي:

  1. openssl req -text -noout -verify -in domain.csr

عرض مدخلات الشهادة

هذا الأمر يسمح لك بعرض محتويات شهادة (domain.crt) بنص عادي:

  1. openssl x509 -text -noout -in domain.crt

التحقق من أن الشهادة قد تم توقيعها بواسطة جهة اعتماد

استخدم هذا الأمر للتحقق من أن الشهادة (domain.crt) تم توقيعها بواسطة شهادة CA محددة (ca.crt):

  1. openssl verify -verbose -CAFile ca.crt domain.crt

المفاتيح الخاصة

تغطي هذه القسم أوامر OpenSSL التي تخص إنشاء والتحقق من المفاتيح الخاصة.

إنشاء مفتاح خاص

استخدم هذا الأمر لإنشاء مفتاح خاص بطول 2048 بت ومحمي بكلمة مرور (domain.key):

  1. openssl genrsa -des3 -out domain.key 2048

أدخل كلمة مرور عند الطلب لإكمال العملية.

تحقق من مفتاح خاص

استخدم هذا الأمر للتحقق من أن المفتاح الخاص (domain.key) هو مفتاح صالح:

  1. openssl rsa -check -in domain.key

إذا كان المفتاح الخاص مشفرًا، سيُطلب منك كلمة مروره. عند النجاح، سيتم إخراج المفتاح غير المشفر على الطرفية.

تحقق من مطابقة المفتاح الخاص مع شهادة و CSR

استخدم هذه الأوامر للتحقق مما إذا كان مفتاح خاص (domain.key) متطابقًا مع شهادة (domain.crt) و CSR (domain.csr):

  1. openssl rsa -noout -modulus -in domain.key | openssl md5
  2. openssl x509 -noout -modulus -in domain.crt | openssl md5
  3. openssl req -noout -modulus -in domain.csr | openssl md5

إذا كان إخراج كل أمر متطابقًا فهناك احتمالية عالية للغاية أن المفتاح الخاص والشهادة و CSR ذات الصلة.

تشفير مفتاح خاص

يأخذ هذا الأمر مفتاح خاص غير مشفر (unencrypted.key) ويخرج نسخة مشفرة منه (encrypted.key):

  1. openssl rsa -des3 \
  2. -in unencrypted.key \
  3. -out encrypted.key

أدخل كلمة المرور المطلوبة، لتشفير المفتاح الخاص بها.

فك تشفير مفتاح خاص

هذا يأخذ مفتاحًا خاصًا مشفرًا (encrypted.key) وينتج نسخة مفككة له (decrypted.key):

  1. openssl rsa \
  2. -in encrypted.key \
  3. -out decrypted.key

أدخل عبارة المرور للمفتاح المشفر عندما يُطلب.

تحويل تنسيقات الشهادات

جميع الشهادات التي تم التعامل معها هي شهادات X.509 المشفرة بترميز PEM ASCII. هناك مجموعة متنوعة من تنسيقات وحاويات الشهادات الأخرى؛ حيث تفضل بعض التطبيقات تنسيقات معينة على غيرها. بالإضافة إلى ذلك، يمكن أن تحتوي العديد من هذه التنسيقات على عناصر متعددة، مثل مفتاح خاص وشهادة وشهادة CA، في ملف واحد.

يمكن استخدام OpenSSL لتحويل الشهادات من وإلى مجموعة كبيرة من هذه التنسيقات. ستغطي هذا القسم بعض التحويلات الممكنة.

تحويل PEM إلى DER

استخدم هذا الأمر إذا كنت ترغب في تحويل شهادة مشفرة بترميز PEM (domain.crt) إلى شهادة مشفرة بترميز DER (domain.der)، وهو تنسيق ثنائي:

  1. openssl x509 \
  2. -in domain.crt \
  3. -outform der -out domain.der

صيغة DER تستخدم عادة مع جافا.

تحويل DER إلى PEM

استخدم هذا الأمر إذا كنت ترغب في تحويل شهادة مشفرة بصيغة DER (domain.der) إلى شهادة مشفرة بصيغة PEM (domain.crt):

  1. openssl x509 \
  2. -inform der -in domain.der \
  3. -out domain.crt

تحويل PEM إلى PKCS7

استخدم هذا الأمر إذا كنت ترغب في إضافة شهادات PEM (domain.crt و ca-chain.crt) إلى ملف PKCS7 (domain.p7b):

  1. openssl crl2pkcs7 -nocrl \
  2. -certfile domain.crt \
  3. -certfile ca-chain.crt \
  4. -out domain.p7b

يرجى ملاحظة أنه يمكنك استخدام خيار -certfile واحد أو أكثر لتحديد الشهادات التي تُضاف إلى ملف PKCS7.

ملفات PKCS7، المعروفة أيضًا باسم P7B، تستخدم عادة في مخازن المفاتيح في جافا وMicrosoft IIS (Windows). هي ملفات ASCII التي يمكن أن تحتوي على شهادات وشهادات السلطة الشهادات.

تحويل PKCS7 إلى PEM

استخدم هذا الأمر إذا كنت ترغب في تحويل ملف PKCS7 (domain.p7b) إلى ملف PEM:

  1. openssl pkcs7 \
  2. -in domain.p7b \
  3. -print_certs -out domain.crt

تذكر أنه إذا كان لديك ملف PKCS7 يحتوي على عناصر متعددة فيه (على سبيل المثال، شهادة وشهادة وسيطة للسلطة الشهادة الموثوقة)، سيحتوي ملف PEM الذي يتم إنشاؤه على جميع العناصر فيه.

تحويل PEM إلى PKCS12

استخدم هذا الأمر إذا كنت ترغب في أخذ مفتاح خاص (domain.key) وشهادة (domain.crt)، ودمجهما في ملف PKCS12 (domain.pfx):

  1. openssl pkcs12 \
  2. -inkey domain.key \
  3. -in domain.crt \
  4. -export -out domain.pfx

سيُطلب منك إدخال كلمات مرور للتصدير، يمكنك تركها فارغة. تذكر أنه يمكنك إضافة سلسلة من الشهادات إلى ملف PKCS12 عن طريق دمج الشهادات معًا في ملف PEM واحد (domain.crt) في هذه الحالة.

يُستخدم ملفات PKCS12، المعروفة أيضًا باسم ملفات PFX، عادةً لاستيراد وتصدير سلاسل الشهادات في Microsoft IIS (Windows).

تحويل PKCS12 إلى PEM

استخدم هذا الأمر إذا كنت ترغب في تحويل ملف PKCS12 (domain.pfx) وتحويله إلى تنسيق PEM (domain.combined.crt):

openssl pkcs12 \
       -in domain.pfx \
       -nodes -out domain.combined.crt

تذكر أنه إذا كان لديك ملف PKCS12 يحتوي على عناصر متعددة فيه (على سبيل المثال، شهادة ومفتاح خاص)، سيحتوي ملف PEM الذي يتم إنشاؤه على جميع العناصر فيه.

إصدار OpenSSL

يمكن استخدام الأمر openssl version للتحقق من الإصدار الذي تستخدمه. الإصدار من OpenSSL الذي تستخدمه، والخيارات التي تم تجميعها معه تؤثر على القدرات (وأحيانًا خيارات سطر الأوامر) المتاحة لك.

يعرض الأمر التالي إصدار OpenSSL الذي تستخدمه، وجميع الخيارات التي تم تجميعه معه:

openssl version -a

تم كتابة هذا الدليل باستخدام برنامج OpenSSL الثنائي بالتفاصيل التالية (ناتج الأمر السابق):

OpenSSL 1.1.1  11 Sep 2018
built on: Mon Aug 23 17:02:39 2021 UTC
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-Flav1L/openssl-1.1.1=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
Seeding source: os-specific

الختام

ينبغي أن يغطي ذلك كيفية استخدام معظم الناس لـ OpenSSL للعمل مع شهادات SSL. لديه العديد من الاستخدامات الأخرى التي لم يتم التطرق إليها هنا، لذا لا تتردد في السؤال أو اقتراح الاستخدامات الأخرى في التعليقات.

إذا كانت لديك مشاكل مع أي من الأوامر، تأكد من التعليق (وتضمين إخراج إصدار OpenSSL الخاص بك).

Source:
https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs