البرنامج التعليمي: استخدام OpenSSL لإنشاء شهادات الاختبار

على الرغم من أنه يمكنك شراء شهادات X.509 من مرجع مصدق موثوق به، فإن إنشاء التسلسل الهرمي لشهادة الاختبار الخاصة بك أو استخدام الشهادات الموقعة ذاتيًا يعد مناسبًا لاختبار مصادقة جهاز IoT hub. يستخدم المثال التالي OpenSSL و OpenSSL Cookbook لإنشاء مرجع مصدق (CA) ومرجع مصدق ثانوي وشهادة جهاز. ثم يوقع المثال على المرجع المصدق الثانوي وشهادة الجهاز في تسلسل هرمي للشهادة. يتم تقديمه لأغراض المثال فقط.

الخطوة 1 - إنشاء بنية دليل المرجع المصدق الجذري

إنشاء بنية دليل للمرجع المصدق.

  • يخزن دليل الشهادات الجديدة.
  • يتم استخدام دليل قاعدة البيانات لقاعدة بيانات الشهادات.
  • يخزن الدليل الخاص المفتاح الخاص للمرجع المصدق.
  mkdir rootca
  cd rootca
  mkdir certs db private
  touch db/index
  openssl rand -hex 16 > db/serial
  echo 1001 > db/crlnumber

الخطوة 2 - قم بإنشاء ملف تكوين المرجع المصدق الجذري (CA)

قبل إنشاء مرجع مصدق، قم بإنشاء ملف تكوين واحفظه ك rootca.conf في دليل rootca .

[default]
name                     = rootca
domain_suffix            = example.com
aia_url                  = http://$name.$domain_suffix/$name.crt
crl_url                  = http://$name.$domain_suffix/$name.crl
default_ca               = ca_default
name_opt                 = utf8,esc_ctrl,multiline,lname,align

[ca_dn]
commonName               = "Test Root CA"

[ca_default]
home                     = ../rootca
database                 = $home/db/index
serial                   = $home/db/serial
crlnumber                = $home/db/crlnumber
certificate              = $home/$name.crt
private_key              = $home/private/$name.key
RANDFILE                 = $home/private/random
new_certs_dir            = $home/certs
unique_subject           = no
copy_extensions          = none
default_days             = 3650
default_crl_days         = 365
default_md               = sha256
policy                   = policy_c_o_match

[policy_c_o_match]
countryName              = optional
stateOrProvinceName      = optional
organizationName         = optional
organizationalUnitName   = optional
commonName               = supplied
emailAddress             = optional

[req]
default_bits             = 2048
encrypt_key              = yes
default_md               = sha256
utf8                     = yes
string_mask              = utf8only
prompt                   = no
distinguished_name       = ca_dn
req_extensions           = ca_ext

[ca_ext]
basicConstraints         = critical,CA:true
keyUsage                 = critical,keyCertSign,cRLSign
subjectKeyIdentifier     = hash

[sub_ca_ext]
authorityKeyIdentifier   = keyid:always
basicConstraints         = critical,CA:true,pathlen:0
extendedKeyUsage         = clientAuth,serverAuth
keyUsage                 = critical,keyCertSign,cRLSign
subjectKeyIdentifier     = hash

[client_ext]
authorityKeyIdentifier   = keyid:always
basicConstraints         = critical,CA:false
extendedKeyUsage         = clientAuth
keyUsage                 = critical,digitalSignature
subjectKeyIdentifier     = hash

الخطوة 3 - إنشاء مرجع مصدق جذري

أولا ، قم بإنشاء مفتاح خاص وطلب توقيع الشهادة (CSR) في دليل rootca .

  openssl req -new -config rootca.conf -out rootca.csr -keyout private/rootca.key

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

  openssl ca -selfsign -config rootca.conf -in rootca.csr -out rootca.crt -extensions ca_ext

الخطوة 4 - إنشاء بنية دليل المرجع المصدق الثانوي

إنشاء بنية دليل للمرجع المصدق التابع على نفس مستوى دليل rootca .

  mkdir subca
  cd subca
  mkdir certs db private
  touch db/index
  openssl rand -hex 16 > db/serial
  echo 1001 > db/crlnumber

الخطوة 5 - إنشاء ملف تكوين المرجع المصدق التابع

إنشاء ملف تكوين وحفظه باسم subca.conf في الدليل subca .

[default]
name                     = subca
domain_suffix            = example.com
aia_url                  = http://$name.$domain_suffix/$name.crt
crl_url                  = http://$name.$domain_suffix/$name.crl
default_ca               = ca_default
name_opt                 = utf8,esc_ctrl,multiline,lname,align

[ca_dn]
commonName               = "Test Subordinate CA"

[ca_default]
home                     = .
database                 = $home/db/index
serial                   = $home/db/serial
crlnumber                = $home/db/crlnumber
certificate              = $home/$name.crt
private_key              = $home/private/$name.key
RANDFILE                 = $home/private/random
new_certs_dir            = $home/certs
unique_subject           = no
copy_extensions          = copy
default_days             = 365
default_crl_days         = 90
default_md               = sha256
policy                   = policy_c_o_match

[policy_c_o_match]
countryName              = optional
stateOrProvinceName      = optional
organizationName         = optional
organizationalUnitName   = optional
commonName               = supplied
emailAddress             = optional

[req]
default_bits             = 2048
encrypt_key              = yes
default_md               = sha256
utf8                     = yes
string_mask              = utf8only
prompt                   = no
distinguished_name       = ca_dn
req_extensions           = ca_ext

[ca_ext]
basicConstraints         = critical,CA:true
keyUsage                 = critical,keyCertSign,cRLSign
subjectKeyIdentifier     = hash

[sub_ca_ext]
authorityKeyIdentifier   = keyid:always
basicConstraints         = critical,CA:true,pathlen:0
extendedKeyUsage         = clientAuth,serverAuth
keyUsage                 = critical,keyCertSign,cRLSign
subjectKeyIdentifier     = hash

[client_ext]
authorityKeyIdentifier   = keyid:always
basicConstraints         = critical,CA:false
extendedKeyUsage         = clientAuth
keyUsage                 = critical,digitalSignature
subjectKeyIdentifier     = hash

الخطوة 6 - إنشاء مرجع مصدق ثانوي

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

من دليل subca ، استخدم ملف التكوين لإنشاء مفتاح خاص وطلب توقيع شهادة (CSR).

  openssl req -new -config subca.conf -out subca.csr -keyout private/subca.key

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

  openssl ca -config ../rootca/rootca.conf -in subca.csr -out subca.crt -extensions sub_ca_ext

الخطوة 7 - إظهار إثبات الحيازة

لديك الآن كل من شهادة المرجع المصدق الجذر وشهادة المرجع المصدق التابعة. ويمكنك استخدام أي منهما لتوقيع شهادات الجهاز. يجب تحميل الملف الذي تختاره إلى مركز IoT الخاص بك. تفترض الخطوات التالية أنك تستخدم شهادة CA التابعة. لتحميل شهادة المرجع المصدق التابعة وتسجيلها في مركز IoT الخاص بك:

  1. في مدخل Azure، انتقل إلى IoTHub وحدد شهادات الإعدادات>.

  2. حدد Add لإضافة شهادة المرجع المصدق التابعة الجديدة.

  3. أدخل اسم عرض في الحقل اسم الشهادة ، وحدد ملف شهادة PEM الذي أنشأته مسبقا.

    ملاحظة

    شهادات .crt التي تم إنشاؤها أعلاه هي نفس شهادات .pem. يمكنك ببساطة تغيير الامتداد عند تحميل شهادة لإثبات الحيازة، أو يمكنك استخدام أمر OpenSSL التالي:

    openssl x509 -in mycert.crt -out mycert.pem -outform PEM
    
  4. حدد ⁧⁩حفظ⁧⁩. تظهر الشهادة الخاصة بك في قائمة الشهادات بالحالة لم يتم التحقق منها. ستثبت عملية التحقق ملكيتك للشهادة.

  5. حدد الشهادة لعرض مربع الحوار Certificate Details.

  6. حدد Generate Verification Code. لمزيد من المعلومات، راجع إثبات حيازة شهادة المرجع المصدق .

  7. انسخ رمز التحقق إلى الحافظة. يجب عليك تعيين رمز التحقق كموضوع الشهادة. على سبيل المثال، إذا كان رمز التحقق BB0C656E69AF75E3FB3C8D922C1760C58C1DA5B05AAA9D0A، فأضف ذلك كموضوع الشهادة كما هو موضح في الخطوة 9.

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

    openssl genpkey -out pop.key -algorithm RSA -pkeyopt rsa_keygen_bits:2048
    
  9. إنشاء طلب توقيع شهادة من المفتاح الخاص. أضف رمز التحقق كموضوع للشهادة الخاصة بك.

    openssl req -new -key pop.key -out pop.csr
    
      -----
      Country Name (2 letter code) [XX]:.
      State or Province Name (full name) []:.
      Locality Name (eg, city) [Default City]:.
      Organization Name (eg, company) [Default Company Ltd]:.
      Organizational Unit Name (eg, section) []:.
      Common Name (eg, your name or your server hostname) []:BB0C656E69AF75E3FB3C8D922C1760C58C1DA5B05AAA9D0A
      Email Address []:
    
      Please enter the following 'extra' attributes
      to be sent with your certificate request
      A challenge password []:
      An optional company name []:
    
    
  10. بادر بإنشاء شهادة باستخدام ملف تكوين المرجع المصدق التابع وطلب توقيع الشهادة لإثبات شهادة الحيازة.

    openssl ca -config subca.conf -in pop.csr -out pop.crt -extensions client_ext
    
  11. حدد الشهادة الجديدة في العرض Certificate Details. للعثور على ملف PEM، انتقل إلى مجلد الشهادات .

  12. بعد تحميل الشهادة، حدد Verify. يجب أن تتغير حالة شهادة المرجع المصدق إلى حالة تم التحقق.

الخطوة 8 - إنشاء جهاز في مركز IoT الخاص بك

انتقل إلى مركز IoT في مدخل Azure وأنشئ هوية جهاز IoT جديدة بالقيم التالية:

  1. أدخل معرف الجهاز الذي يتطابق مع اسم موضوع شهادات جهازك.

  2. حدد نوع المصادقة X.509 CA Signed.

  3. حدد ⁧⁩حفظ⁧⁩.

الخطوة 9 - إنشاء شهادة جهاز عميل

لإنشاء شهادة عميل يجب أولا إنشاء مفتاح خاص. يوضح الأمر التالي كيفية استخدام OpenSSL لإنشاء مفتاح خاص. إنشاء المفتاح في الدليل subca .

openssl genpkey -out device.key -algorithm RSA -pkeyopt rsa_keygen_bits:2048

قم بإنشاء طلب توقيع شهادة للمفتاح. لست بحاجة إلى إدخال كلمة مرور التحدي أو اسم شركة اختياري. ومع ذلك، يجب عليك إدخال معرف الجهاز في حقل الاسم الشائع. يمكنك أيضا إدخال القيم الخاصة بك للمعلمات الأخرى مثل اسم البلد واسمالمؤسسة وما إلى ذلك.

openssl req -new -key device.key -out device.csr

-----
Country Name (2 letter code) [XX]:.
State or Province Name (full name) []:.
Locality Name (eg, city) [Default City]:.
Organization Name (eg, company) [Default Company Ltd]:.
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server hostname) []:`<your device ID>`
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

تأكد من أن طلب توقيع الشهادة هو ما تتوقعه.

openssl req -text -in device.csr -noout

أرسل طلب توقيع الشهادة إلى المرجع المصدق الثانوي لتسجيل الدخول إلى التسلسل الهرمي للشهادة. حدد client_ext في مفتاح -extensions. لاحظ أن الشهادة الصادرة تشير إلى أن هذه الشهادة Basic Constraints ليست للمرجع المصدق. إذا كنت توقع شهادات متعددة، فتأكد من تحديث الرقم التسلسلي قبل إنشاء كل شهادة باستخدام الأمر openssl rand -hex 16 > db/serial .

openssl ca -config subca.conf -in device.csr -out device.crt -extensions client_ext

الخطوات التالية

انتقل إلى Testing Certificate Authentication لتحديد ما إذا كانت شهادتك يمكنها مصادقة جهازك إلى مركز IoT الخاص بك. تتطلب التعليمات البرمجية على تلك الصفحة استخدام شهادة PFX. استخدم الأمر OpenSSL التالي لتحويل شهادة .crt للجهاز إلى تنسيق .pfx.

openssl pkcs12 -export -in device.crt -inkey device.key -out device.pfx