كيفية توصيل الأجهزة بشهادات X.509 بتطبيق IoT Central
يدعم IoT Central كلا من توقيعات الوصول المشترك (SAS) وشهادات X.509 لتأمين الاتصال بين الجهاز والتطبيق الخاص بك. يستخدم البرنامج التعليمي لإنشاء تطبيق عميل وتوصيله بتطبيق Azure IoT Central SAS. في هذه المقالة، يمكنك معرفة كيفية تعديل نموذج التعليمات البرمجية لاستخدام شهادات X.509. يوصى باستخدام شهادات X.509 في بيئات الإنتاج. لمزيد من المعلومات، راجع مفاهيم مصادقة الجهاز.
يوضح هذا الدليل طريقتين لاستخدام شهادات X.509 - تسجيلات المجموعة المستخدمة عادة في بيئة الإنتاج، والتسجيلات الفردية المفيدة للاختبار. توضح المقالة أيضا كيفية تدوير شهادات الجهاز للحفاظ على الاتصال عند انتهاء صلاحية الشهادات.
يعتمد هذا الدليل على العينات الموضحة في البرنامج التعليمي لإنشاء تطبيق عميل وتوصيله بالبرنامج التعليمي لتطبيق Azure IoT Central الذي يستخدم C# وJava وJavaScript وPython. للحصول على مثال يستخدم لغة البرمجة C، راجع توفير أجهزة X.509 متعددة باستخدام مجموعات التسجيل.
المتطلبات الأساسية
أكمل البرنامج التعليمي لإنشاء تطبيق عميل وتوصيله بالبرنامج التعليمي لتطبيق Azure IoT Central . يتضمن ذلك تثبيت المتطلبات الأساسية لاختيارك للغة البرمجة.
في هذا الدليل الإرشادي، يمكنك إنشاء بعض شهادات اختبار X.509. لتتمكن من إنشاء هذه الشهادات، تحتاج إلى:
- جهاز تطوير مع Node.js تثبيت الإصدار 6 أو الإصدارات اللاحقة. يمكنك استخدام
node --version في شريط الأوامر للتحقق من الإصدار الخاص بك. تفترض الإرشادات الواردة في هذا البرنامج التعليمي أنك تقوم بتشغيل الأمر node في موجه الأوامر Windows. ومع ذلك، يمكنك استخدام Node.js على العديد من أنظمة التشغيل الأخرى. - نسخة محلية من Microsoft Azure IoT SDK Node.js مستودع GitHub يحتوي على البرامج النصية لإنشاء شهادات اختبار X.509. استخدم هذا الرابط لتنزيل نسخة من المستودع: Download ZIP. ثم فك الملف إلى موقع مناسب على جهازك المحلي.
استخدام تسجيل المجموعة
استخدم شهادات X.509 مع تسجيل مجموعة في بيئة إنتاج. في تسجيل مجموعة، يمكنك إضافة شهادة X.509 جذر أو متوسطة إلى تطبيق IoT Central. يمكن للأجهزة التي تحتوي على شهادات أوراق مشتقة من الشهادة الجذرية أو الوسيطة الاتصال بالتطبيق الخاص بك.
إنشاء شهادات الجذر والجهاز
في هذا القسم، يمكنك استخدام شهادة X.509 لتوصيل جهاز بشهادة مشتقة من شهادة مجموعة التسجيل IoT Central.
تحذير
هذه الطريقة لإنشاء شهادات X.509 مخصصة للاختبار فقط. بالنسبة لبيئة الإنتاج ، يجب عليك استخدام آليتك الرسمية الآمنة لإنشاء الشهادات.
انتقل إلى البرنامج النصي لمولد الشهادات في Microsoft Azure IoT SDK للحصول على Node.js قمت بتنزيله. قم بتثبيت الحزم المطلوبة:
cd azure-iot-sdk-node/provisioning/tools npm installإنشاء شهادة جذر ثم اشتقاق شهادة جهاز عن طريق تشغيل البرنامج النصي:
node create_test_cert.js root mytestrootcert node create_test_cert.js device sample-device-01 mytestrootcertتلميح
يمكن أن يحتوي معرف الجهاز على أحرف وأرقام وحرف
-.
تنتج هذه الأوامر الجذر التالي وشهادة الجهاز
| اسم الملف | المحتويات |
|---|---|
| mytestrootcert_cert.بيم | الجزء العام من شهادة الجذر X509 |
| mytestrootcert_key.بيم | المفتاح الخاص لشهادة الجذر X509 |
| mytestrootcert_fullchain.بيم | سلسلة المفاتيح بأكملها لشهادة الجذر X509. |
| mytestrootcert.pfx | ملف PFX لشهادة X509 الجذر. |
| sampleDevice01_cert.بيم | الجزء العام من شهادة X509 للجهاز |
| sampleDevice01_key.بيم | المفتاح الخاص لشهادة X509 للجهاز |
| sampleDevice01_fullchain.بيم | سلسلة المفاتيح بأكملها لشهادة X509 للجهاز. |
| sampleDevice01.pfx | ملف PFX لشهادة X509 الخاصة بالجهاز. |
قم بتدوين موقع هذه الملفات. أنت في حاجة إليها لاحقا.
إنشاء تسجيل مجموعة
افتح تطبيق IoT Central وانتقل إلى الأذونات في الجزء الأيمن وحدد مجموعات اتصال الجهاز.
حدد + جديد، وقم بإنشاء مجموعة تسجيل جديدة تسمى MyX509Group مع نوع تصديق الشهادات (X.509).
افتح مجموعة التسجيل التي أنشأتها وحدد إدارة الأساسي.
حدد خيار الملف لتحميل ملف الشهادة الجذر المسمى mytestrootcert_cert.pem الذي قمت بإنشائه مسبقا:

لإكمال عملية التحقق، قم بإنشاء رمز التحقق وانسخه ثم استخدمه لإنشاء شهادة تحقق X.509 في موجه الأوامر:
node create_test_cert.js verification --ca mytestrootcert_cert.pem --key mytestrootcert_key.pem --nonce {verification-code}حدد إثبات الملكية لتحميل شهادة التحقق الموقعة verification_cert.pem لإكمال عملية التحقق:

يمكنك الآن توصيل الأجهزة التي تحتوي على شهادة X.509 مشتقة من هذه الشهادة الجذرية الأساسية.
بعد حفظ مجموعة التسجيل، قم بتدوين نطاق المعرف.
تشغيل نموذج رمز الجهاز
إذا كنت تستخدم Windows، فيجب أن تكون شهادات X.509 في مخزن شهادات Windows حتى يعمل النموذج. في Windows Explorer ، انقر نقرا مزدوجا فوق كل ملفات PFX تم إنشاؤها مسبقا - mytestrootcert.pfx و sampleDevice01.pfx. في معالج استيراد الشهادات، حدد المستخدم الحالي كموقع المتجر، وأدخل 1234 ككلمة مرور، واسمح للمعالج باختيار مخزن الشهادات تلقائيا. يقوم المعالج باستيراد الشهادات إلى المتجر الشخصي للمستخدم الحالي.
لتعديل نموذج التعليمة البرمجية لاستخدام شهادات X.509:
في حل Visual Studio IoTHubDeviceSamples، افتح ملف .cs المعلمة في مشروع TemperatureController.
أضف تعريفي المعلمتين التاليين إلى الفئة:
[Option( 'x', "CertificatePath", HelpText = "(Required if DeviceSecurityType is \"dps\"). \nThe device PFX file to use during device provisioning." + "\nDefaults to environment variable \"IOTHUB_DEVICE_X509_CERT\".")] public string CertificatePath { get; set; } = Environment.GetEnvironmentVariable("IOTHUB_DEVICE_X509_CERT"); [Option( 'p', "CertificatePassword", HelpText = "(Required if DeviceSecurityType is \"dps\"). \nThe password of the PFX certificate file." + "\nDefaults to environment variable \"IOTHUB_DEVICE_X509_PASSWORD\".")] public string CertificatePassword { get; set; } = Environment.GetEnvironmentVariable("IOTHUB_DEVICE_X509_PASSWORD");حفظ التغييرات.
في حل Visual Studio IoTHubDeviceSamples، افتح ملف .cs البرنامج في مشروع TemperatureController.
أضف عبارات
usingالتالية:using System.Security.Cryptography.X509Certificates; using System.IO;إضافة الطريقة التالية إلى الفصل:
private static X509Certificate2 LoadProvisioningCertificate(Parameters parameters) { var certificateCollection = new X509Certificate2Collection(); certificateCollection.Import( parameters.CertificatePath, parameters.CertificatePassword, X509KeyStorageFlags.UserKeySet); X509Certificate2 certificate = null; foreach (X509Certificate2 element in certificateCollection) { Console.WriteLine($"Found certificate: {element?.Thumbprint} {element?.Subject}; PrivateKey: {element?.HasPrivateKey}"); if (certificate == null && element.HasPrivateKey) { certificate = element; } else { element.Dispose(); } } if (certificate == null) { throw new FileNotFoundException($"{parameters.CertificatePath} did not contain any certificate with a private key."); } Console.WriteLine($"Using certificate {certificate.Thumbprint} {certificate.Subject}"); return certificate; }في هذه
SetupDeviceClientAsyncالطريقة، استبدل كتلة التعليمات البرمجية بالتعليمة البرمجيةcase "dps"التالية:case "dps": s_logger.LogDebug($"Initializing via DPS"); Console.WriteLine($"Loading the certificate..."); X509Certificate2 certificate = LoadProvisioningCertificate(parameters); DeviceRegistrationResult dpsRegistrationResult = await ProvisionDeviceAsync(parameters, certificate, cancellationToken); var authMethod = new DeviceAuthenticationWithX509Certificate(dpsRegistrationResult.DeviceId, certificate); deviceClient = InitializeDeviceClient(dpsRegistrationResult.AssignedHub, authMethod); break;استبدل الأسلوب
ProvisionDeviceAsyncبالتعليمات البرمجية التالية:private static async Task<DeviceRegistrationResult> ProvisionDeviceAsync(Parameters parameters, X509Certificate2 certificate, CancellationToken cancellationToken) { SecurityProvider security = new SecurityProviderX509Certificate(certificate); ProvisioningTransportHandler mqttTransportHandler = new ProvisioningTransportHandlerMqtt(); ProvisioningDeviceClient pdc = ProvisioningDeviceClient.Create(parameters.DpsEndpoint, parameters.DpsIdScope, security, mqttTransportHandler); var pnpPayload = new ProvisioningRegistrationAdditionalData { JsonData = PnpConvention.CreateDpsPayload(ModelId), }; return await pdc.RegisterAsync(pnpPayload, cancellationToken); }حفظ التغييرات.
لتشغيل النموذج:
إضافة متغيرات البيئة التالية إلى المشروع:
IOTHUB_DEVICE_X509_CERT:<full path to folder that contains PFX files>sampleDevice01.pfxIOTHUB_DEVICE_X509_PASSWORD: 1234.
إنشاء التطبيق وتشغيله. تحقق من أحكام الجهاز بنجاح.
لتعديل نموذج التعليمة البرمجية لاستخدام شهادات X.509:
انتقل إلى المجلد azure-iot-sdk-java/device/iot-device-samples/pnp-device-sample/temperature-controller-device-sample الذي يحتوي على ملف pom.xml ومجلد src لعينة جهاز التحكم في درجة الحرارة.
قم بتحرير ملف pom.xml لإضافة تكوين التبعية التالي في العقدة
<dependencies>:<dependency> <groupId>com.microsoft.azure.sdk.iot.provisioning.security</groupId> <artifactId>${x509-provider-artifact-id}</artifactId> <version>${x509-provider-version}</version> </dependency>حفظ التغييرات.
افتح ملف src/main/java/samples/com/microsoft/azure/sdk/iot/device/TemperatureController.java في محرر النصوص.
استبدل الاستيراد
SecurityProviderSymmetricKeyبالواردات التالية:import com.microsoft.azure.sdk.iot.provisioning.security.SecurityProvider; import com.microsoft.azure.sdk.iot.provisioning.security.hsm.SecurityProviderX509Cert; import com.microsoft.azure.sdk.iot.provisioning.security.exceptions.SecurityProviderException;أضف الاستيراد التالي:
import java.nio.file.*;أضف
SecurityProviderExceptionإلى قائمة الاستثناءات التيmainيطرحها الأسلوب:public static void main(String[] args) throws IOException, URISyntaxException, ProvisioningDeviceClientException, InterruptedException, SecurityProviderException {استبدل الأسلوب
initializeAndProvisionDeviceبالتعليمات البرمجية التالية:private static void initializeAndProvisionDevice() throws ProvisioningDeviceClientException, IOException, URISyntaxException, InterruptedException, SecurityProviderException { String deviceX509Key = new String(Files.readAllBytes(Paths.get(System.getenv("IOTHUB_DEVICE_X509_KEY")))); String deviceX509Cert = new String(Files.readAllBytes(Paths.get(System.getenv("IOTHUB_DEVICE_X509_CERT")))); SecurityProvider securityProviderX509 = new SecurityProviderX509Cert(deviceX509Cert, deviceX509Key, null); ProvisioningDeviceClient provisioningDeviceClient; ProvisioningStatus provisioningStatus = new ProvisioningStatus(); provisioningDeviceClient = ProvisioningDeviceClient.create(globalEndpoint, scopeId, provisioningProtocol, securityProviderX509); AdditionalData additionalData = new AdditionalData(); additionalData.setProvisioningPayload(com.microsoft.azure.sdk.iot.provisioning.device.plugandplay.PnpHelper.createDpsPayload(MODEL_ID)); provisioningDeviceClient.registerDevice(new ProvisioningDeviceClientRegistrationCallbackImpl(), provisioningStatus, additionalData); while (provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() != ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_ASSIGNED) { if (provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() == ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_ERROR || provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() == ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_DISABLED || provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() == ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_FAILED) { provisioningStatus.exception.printStackTrace(); System.out.println("Registration error, bailing out"); break; } System.out.println("Waiting for Provisioning Service to register"); Thread.sleep(MAX_TIME_TO_WAIT_FOR_REGISTRATION); } ClientOptions options = new ClientOptions(); options.setModelId(MODEL_ID); if (provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() == ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_ASSIGNED) { System.out.println("IotHUb Uri : " + provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getIothubUri()); System.out.println("Device ID : " + provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getDeviceId()); String iotHubUri = provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getIothubUri(); String deviceId = provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getDeviceId(); log.debug("Opening the device client."); deviceClient = DeviceClient.createFromSecurityProvider(iotHubUri, deviceId, securityProviderX509, IotHubClientProtocol.MQTT, options); deviceClient.open(); } }حفظ التغييرات.
لتشغيل النموذج:
في بيئة shell، أضف متغيري البيئة التاليين. تأكد من توفير المسار الكامل لملفات PEM واستخدام محدد المسار الصحيح لنظام التشغيل الخاص بك:
set IOTHUB_DEVICE_X509_CERT=<full path to folder that contains PEM files>sampleDevice01_cert.pem set IOTHUB_DEVICE_X509_KEY=<full path to folder that contains PEM files>sampleDevice01_key.pemتلميح
يمكنك تعيين متغيرات البيئة المطلوبة الأخرى عند إكمال البرنامج التعليمي لإنشاء تطبيق عميل وتوصيله بالبرنامج التعليمي لتطبيق Azure IoT Central .
إنشاء التطبيق وتشغيله. تحقق من أحكام الجهاز بنجاح.
لتعديل نموذج التعليمة البرمجية لاستخدام شهادات X.509:
انتقل إلى المجلد azure-iot-sdk-node/device/samples/javascript الذي يحتوي على تطبيق pnp_temperature_controller.js وقم بتشغيل الأمر التالي لتثبيت حزمة X.509:
npm install azure-iot-security-x509 --saveافتح ملف pnp_temperature_controller.js في محرر نصوص.
قم بتحرير العبارات
requireلتضمين التعليمة البرمجية التالية:const fs = require('fs'); const X509Security = require('azure-iot-security-x509').X509Security;إضافة الأسطر الأربعة التالية إلى قسم "معلومات اتصال DPS" لتهيئة المتغير
deviceCert:const deviceCert = { cert: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_CERT).toString(), key: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_KEY).toString() };تحرير الدالة التي
provisionDeviceتقوم بإنشاء العميل عن طريق استبدال السطر الأول بالتعليمة البرمجية التالية:var provSecurityClient = new X509Security(registrationId, deviceCert);في نفس الدالة ، قم بتعديل السطر الذي يعين
deviceConnectionStringالمتغير كما يلي:deviceConnectionString = 'HostName=' + result.assignedHub + ';DeviceId=' + result.deviceId + ';x509=true';في الدالة
main، أضف السطر التالي بعد السطر الذي يستدعيClient.fromConnectionString:client.setOptions(deviceCert);حفظ التغييرات.
لتشغيل النموذج:
في بيئة shell، أضف متغيري البيئة التاليين. تأكد من توفير المسار الكامل لملفات PEM واستخدام محدد المسار الصحيح لنظام التشغيل الخاص بك:
set IOTHUB_DEVICE_X509_CERT=<full path to folder that contains PEM files>sampleDevice01_cert.pem set IOTHUB_DEVICE_X509_KEY=<full path to folder that contains PEM files>sampleDevice01_key.pemتلميح
يمكنك تعيين متغيرات البيئة المطلوبة الأخرى عند إكمال البرنامج التعليمي لإنشاء تطبيق عميل وتوصيله بالبرنامج التعليمي لتطبيق Azure IoT Central .
قم بتنفيذ البرنامج النصي وتحقق من أحكام الجهاز بنجاح:
node pnp_temperature_controller.js
لتعديل نموذج التعليمة البرمجية لاستخدام شهادات X.509:
انتقل إلى المجلد azure-iot-device/samples/pnp وافتح ملف temp_controller_with_thermostats.py في محرر نصوص.
أضف العبارة التالية
fromلاستيراد وظيفة X.509:from azure.iot.device import X509تعديل الجزء الأول من الدالة
provision_deviceكما يلي:async def provision_device(provisioning_host, id_scope, registration_id, x509, model_id): provisioning_device_client = ProvisioningDeviceClient.create_from_x509_certificate( provisioning_host=provisioning_host, registration_id=registration_id, id_scope=id_scope, x509=x509, )في الدالة
main، استبدل السطر الذي يعينsymmetric_keyالمتغير بالتعليمة البرمجية التالية:x509 = X509( cert_file=os.getenv("IOTHUB_DEVICE_X509_CERT"), key_file=os.getenv("IOTHUB_DEVICE_X509_KEY"), )في الدالة
main، استبدل استدعاء الدالةprovision_deviceبالتعليمة البرمجية التالية:registration_result = await provision_device( provisioning_host, id_scope, registration_id, x509, model_id )في الدالة
main، استبدل استدعاء الدالةIoTHubDeviceClient.create_from_symmetric_keyبالتعليمة البرمجية التالية:device_client = IoTHubDeviceClient.create_from_x509_certificate( x509=x509, hostname=registration_result.registration_state.assigned_hub, device_id=registration_result.registration_state.device_id, product_info=model_id, )حفظ التغييرات.
لتشغيل النموذج:
في بيئة shell، أضف متغيري البيئة التاليين. تأكد من توفير المسار الكامل لملفات PEM واستخدام محدد المسار الصحيح لنظام التشغيل الخاص بك:
set IOTHUB_DEVICE_X509_CERT=<full path to folder that contains PEM files>sampleDevice01_cert.pem set IOTHUB_DEVICE_X509_KEY=<full path to folder that contains PEM files>sampleDevice01_key.pemتلميح
يمكنك تعيين متغيرات البيئة المطلوبة الأخرى عند إكمال البرنامج التعليمي لإنشاء تطبيق عميل وتوصيله بالبرنامج التعليمي لتطبيق Azure IoT Central .
قم بتنفيذ البرنامج النصي وتحقق من أحكام الجهاز بنجاح:
python temp_controller_with_thermostats.py
تحقق من ظهور القياس عن بعد على طريقة عرض الجهاز في تطبيق IoT Central:

استخدام التسجيل الفردي
استخدم شهادات X.509 مع تسجيل فردي لاختبار جهازك وحلك. في التسجيل الفردي، لا توجد شهادة X.509 جذر أو متوسطة في تطبيق IoT Central الخاص بك. تستخدم الأجهزة شهادة X.509 موقعة ذاتيا للاتصال بتطبيقك.
إنشاء شهادة جهاز موقعة ذاتيا
في هذا القسم، يمكنك استخدام شهادة X.509 موقعة ذاتيا لتوصيل الأجهزة للتسجيل الفردي، والتي يتم استخدامها لتسجيل جهاز واحد. الشهادات الموقعة ذاتيا مخصصة للاختبار فقط.
تحذير
هذه الطريقة لإنشاء شهادات X.509 مخصصة للاختبار فقط. بالنسبة لبيئة الإنتاج ، يجب عليك استخدام آليتك الرسمية الآمنة لإنشاء الشهادات.
قم بإنشاء شهادة جهاز X.509 موقعة ذاتيا عن طريق تشغيل الأوامر التالية:
cd azure-iot-sdk-node/provisioning/tools
node create_test_cert.js device mytestselfcertprimary
node create_test_cert.js device mytestselfcertsecondary
تلميح
يمكن أن يحتوي معرف الجهاز على أحرف وأرقام وحرف - .
تنتج هذه الأوامر شهادات الجهاز التالية:
| اسم الملف | المحتويات |
|---|---|
| mytestselfcertprimary_cert.بيم | الجزء العام من شهادة X509 للجهاز الأساسي |
| mytestselfcertprimary_key.بيم | المفتاح الخاص لشهادة X509 للجهاز الأساسي |
| mytestselfcertprimary_fullchain.بيم | سلسلة المفاتيح بأكملها لشهادة X509 للجهاز الأساسي. |
| mytestselfcertprimary.pfx | ملف PFX لشهادة X509 للجهاز الأساسي. |
| mytestselfcertsecondary_cert.بيم | الجزء العام من شهادة X509 للجهاز الثانوي |
| mytestselfcertsecondary_key.بيم | المفتاح الخاص لشهادة X509 للجهاز الثانوي |
| mytestselfcertsecondary_fullchain.بيم | سلسلة المفاتيح الكاملة لشهادة X509 للجهاز الثانوي. |
| mytestselfcertsecondary.pfx | ملف PFX لشهادة X509 للجهاز الثانوي. |
إنشاء تسجيل فردي
في تطبيق Azure IoT Central، حدد الأجهزة، وقم بإنشاء جهاز جديد باستخدام معرف الجهاز ك mytestselfcertprimary من قالب جهاز منظم الحرارة. قم بتدوين نطاق المعرف ، ويمكنك استخدامه لاحقا.
افتح الجهاز الذي أنشأته وحدد الاتصال.
حدد التسجيلات الفرديةكطريقة الاتصالوالشهادات (X.509) كآلية:

حدد خيار الملف ضمن الأساسي وقم بتحميل ملف الشهادة المسمى mytestselfcertprimary_cert.pem الذي قمت بإنشائه مسبقا.
حدد خيار الملف للشهادة الثانوية وقم بتحميل ملف الشهادة المسمى mytestselfcertsecondary_cert.pem. ثم حدد حفظ:

يتم الآن تزويد الجهاز بشهادة X.509.
تشغيل نموذج لجهاز تسجيل فردي
إذا كنت تستخدم Windows، فيجب أن تكون شهادات X.509 في مخزن شهادات Windows حتى يعمل النموذج. في Windows Explorer ، انقر نقرا مزدوجا فوق كل ملفات PFX تم إنشاؤها مسبقا - mytestselfcertprimary.pfx و mytestselfcertsecondary.pfx. في معالج استيراد الشهادات، حدد المستخدم الحالي كموقع المتجر، وأدخل 1234 ككلمة مرور، واسمح للمعالج باختيار مخزن الشهادات تلقائيا. يقوم المعالج باستيراد الشهادات إلى المتجر الشخصي للمستخدم الحالي.
لتعديل نموذج التعليمة البرمجية لاستخدام شهادات X.509:
في حل Visual Studio IoTHubDeviceSamples، افتح ملف .cs المعلمة في مشروع TemperatureController.
أضف تعريفي المعلمتين التاليين إلى الفئة:
[Option( 'x', "CertificatePath", HelpText = "(Required if DeviceSecurityType is \"dps\"). \nThe device PFX file to use during device provisioning." + "\nDefaults to environment variable \"IOTHUB_DEVICE_X509_CERT\".")] public string CertificatePath { get; set; } = Environment.GetEnvironmentVariable("IOTHUB_DEVICE_X509_CERT"); [Option( 'p', "CertificatePassword", HelpText = "(Required if DeviceSecurityType is \"dps\"). \nThe password of the PFX certificate file." + "\nDefaults to environment variable \"IOTHUB_DEVICE_X509_PASSWORD\".")] public string CertificatePassword { get; set; } = Environment.GetEnvironmentVariable("IOTHUB_DEVICE_X509_PASSWORD");حفظ التغييرات.
في حل Visual Studio IoTHubDeviceSamples، افتح ملف .cs البرنامج في مشروع TemperatureController.
أضف عبارات
usingالتالية:using System.Security.Cryptography.X509Certificates; using System.IO;إضافة الطريقة التالية إلى الفصل:
private static X509Certificate2 LoadProvisioningCertificate(Parameters parameters) { var certificateCollection = new X509Certificate2Collection(); certificateCollection.Import( parameters.CertificatePath, parameters.CertificatePassword, X509KeyStorageFlags.UserKeySet); X509Certificate2 certificate = null; foreach (X509Certificate2 element in certificateCollection) { Console.WriteLine($"Found certificate: {element?.Thumbprint} {element?.Subject}; PrivateKey: {element?.HasPrivateKey}"); if (certificate == null && element.HasPrivateKey) { certificate = element; } else { element.Dispose(); } } if (certificate == null) { throw new FileNotFoundException($"{parameters.CertificatePath} did not contain any certificate with a private key."); } Console.WriteLine($"Using certificate {certificate.Thumbprint} {certificate.Subject}"); return certificate; }في هذه
SetupDeviceClientAsyncالطريقة، استبدل كتلة التعليمات البرمجية بالتعليمة البرمجيةcase "dps"التالية:case "dps": s_logger.LogDebug($"Initializing via DPS"); Console.WriteLine($"Loading the certificate..."); X509Certificate2 certificate = LoadProvisioningCertificate(parameters); DeviceRegistrationResult dpsRegistrationResult = await ProvisionDeviceAsync(parameters, certificate, cancellationToken); var authMethod = new DeviceAuthenticationWithX509Certificate(dpsRegistrationResult.DeviceId, certificate); deviceClient = InitializeDeviceClient(dpsRegistrationResult.AssignedHub, authMethod); break;استبدل الأسلوب
ProvisionDeviceAsyncبالتعليمات البرمجية التالية:private static async Task<DeviceRegistrationResult> ProvisionDeviceAsync(Parameters parameters, X509Certificate2 certificate, CancellationToken cancellationToken) { SecurityProvider security = new SecurityProviderX509Certificate(certificate); ProvisioningTransportHandler mqttTransportHandler = new ProvisioningTransportHandlerMqtt(); ProvisioningDeviceClient pdc = ProvisioningDeviceClient.Create(parameters.DpsEndpoint, parameters.DpsIdScope, security, mqttTransportHandler); var pnpPayload = new ProvisioningRegistrationAdditionalData { JsonData = PnpConvention.CreateDpsPayload(ModelId), }; return await pdc.RegisterAsync(pnpPayload, cancellationToken); }حفظ التغييرات.
لتشغيل النموذج:
إضافة متغيرات البيئة التالية إلى المشروع:
IOTHUB_DEVICE_DPS_DEVICE_IDmytestselfcertprimary :IOTHUB_DEVICE_X509_CERT:<full path to folder that contains PFX files>mytestselfcertprimary.pfxIOTHUB_DEVICE_X509_PASSWORD: 1234.
إنشاء التطبيق وتشغيله. تحقق من أحكام الجهاز بنجاح.
لتعديل نموذج التعليمة البرمجية لاستخدام شهادات X.509:
انتقل إلى المجلد azure-iot-sdk-java/device/iot-device-samples/pnp-device-sample/temperature-controller-device-sample الذي يحتوي على ملف pom.xml ومجلد src لعينة جهاز التحكم في درجة الحرارة.
قم بتحرير ملف pom.xml لإضافة تكوين التبعية التالي في العقدة
<dependencies>:<dependency> <groupId>com.microsoft.azure.sdk.iot.provisioning.security</groupId> <artifactId>${x509-provider-artifact-id}</artifactId> <version>${x509-provider-version}</version> </dependency>حفظ التغييرات.
افتح ملف src/main/java/samples/com/microsoft/azure/sdk/iot/device/TemperatureController.java في محرر النصوص.
استبدل الاستيراد
SecurityProviderSymmetricKeyبالواردات التالية:import com.microsoft.azure.sdk.iot.provisioning.security.SecurityProvider; import com.microsoft.azure.sdk.iot.provisioning.security.hsm.SecurityProviderX509Cert; import com.microsoft.azure.sdk.iot.provisioning.security.exceptions.SecurityProviderException;أضف الاستيراد التالي:
import java.nio.file.*;أضف
SecurityProviderExceptionإلى قائمة الاستثناءات التيmainيطرحها الأسلوب:public static void main(String[] args) throws IOException, URISyntaxException, ProvisioningDeviceClientException, InterruptedException, SecurityProviderException {استبدل الأسلوب
initializeAndProvisionDeviceبالتعليمات البرمجية التالية:private static void initializeAndProvisionDevice() throws ProvisioningDeviceClientException, IOException, URISyntaxException, InterruptedException, SecurityProviderException { String deviceX509Key = new String(Files.readAllBytes(Paths.get(System.getenv("IOTHUB_DEVICE_X509_KEY")))); String deviceX509Cert = new String(Files.readAllBytes(Paths.get(System.getenv("IOTHUB_DEVICE_X509_CERT")))); SecurityProvider securityProviderX509 = new SecurityProviderX509Cert(deviceX509Cert, deviceX509Key, null); ProvisioningDeviceClient provisioningDeviceClient; ProvisioningStatus provisioningStatus = new ProvisioningStatus(); provisioningDeviceClient = ProvisioningDeviceClient.create(globalEndpoint, scopeId, provisioningProtocol, securityProviderX509); AdditionalData additionalData = new AdditionalData(); additionalData.setProvisioningPayload(com.microsoft.azure.sdk.iot.provisioning.device.plugandplay.PnpHelper.createDpsPayload(MODEL_ID)); provisioningDeviceClient.registerDevice(new ProvisioningDeviceClientRegistrationCallbackImpl(), provisioningStatus, additionalData); while (provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() != ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_ASSIGNED) { if (provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() == ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_ERROR || provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() == ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_DISABLED || provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() == ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_FAILED) { provisioningStatus.exception.printStackTrace(); System.out.println("Registration error, bailing out"); break; } System.out.println("Waiting for Provisioning Service to register"); Thread.sleep(MAX_TIME_TO_WAIT_FOR_REGISTRATION); } ClientOptions options = new ClientOptions(); options.setModelId(MODEL_ID); if (provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getProvisioningDeviceClientStatus() == ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_ASSIGNED) { System.out.println("IotHUb Uri : " + provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getIothubUri()); System.out.println("Device ID : " + provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getDeviceId()); String iotHubUri = provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getIothubUri(); String deviceId = provisioningStatus.provisioningDeviceClientRegistrationInfoClient.getDeviceId(); log.debug("Opening the device client."); deviceClient = DeviceClient.createFromSecurityProvider(iotHubUri, deviceId, securityProviderX509, IotHubClientProtocol.MQTT, options); deviceClient.open(); } }حفظ التغييرات.
لتشغيل النموذج:
في بيئة shell، أضف متغيري البيئة التاليين. تأكد من توفير المسار الكامل لملفات PEM واستخدام محدد المسار الصحيح لنظام التشغيل الخاص بك:
set IOTHUB_DEVICE_DPS_DEVICE_ID=mytestselfcertprimary set IOTHUB_DEVICE_X509_CERT=<full path to folder that contains PEM files>mytestselfcertprimary_cert.pem set IOTHUB_DEVICE_X509_KEY=<full path to folder that contains PEM files>mytestselfcertprimary_key.pemتلميح
يمكنك تعيين متغيرات البيئة المطلوبة الأخرى عند إكمال البرنامج التعليمي لإنشاء تطبيق عميل وتوصيله بالبرنامج التعليمي لتطبيق Azure IoT Central .
إنشاء التطبيق وتشغيله. تحقق من أحكام الجهاز بنجاح.
يمكنك تكرار الخطوات المذكورة أعلاه للحصول على شهادة mytestselfcertsecondary أيضا.
لتعديل نموذج التعليمة البرمجية لاستخدام شهادات X.509:
انتقل إلى المجلد azure-iot-sdk-node/device/samples/javascript الذي يحتوي على تطبيق pnp_temperature_controller.js وقم بتشغيل الأمر التالي لتثبيت حزمة X.509:
npm install azure-iot-security-x509 --saveافتح ملف pnp_temperature_controller.js في محرر نصوص.
قم بتحرير العبارات
requireلتضمين التعليمة البرمجية التالية:const fs = require('fs'); const X509Security = require('azure-iot-security-x509').X509Security;إضافة الأسطر الأربعة التالية إلى قسم "معلومات اتصال DPS" لتهيئة المتغير
deviceCert:const deviceCert = { cert: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_CERT).toString(), key: fs.readFileSync(process.env.IOTHUB_DEVICE_X509_KEY).toString() };تحرير الدالة التي
provisionDeviceتقوم بإنشاء العميل عن طريق استبدال السطر الأول بالتعليمة البرمجية التالية:var provSecurityClient = new X509Security(registrationId, deviceCert);في نفس الدالة ، قم بتعديل السطر الذي يعين
deviceConnectionStringالمتغير كما يلي:deviceConnectionString = 'HostName=' + result.assignedHub + ';DeviceId=' + result.deviceId + ';x509=true';في الدالة
main، أضف السطر التالي بعد السطر الذي يستدعيClient.fromConnectionString:client.setOptions(deviceCert);حفظ التغييرات.
لتشغيل النموذج:
في بيئة shell، أضف متغيري البيئة التاليين. تأكد من توفير المسار الكامل لملفات PEM واستخدام محدد المسار الصحيح لنظام التشغيل الخاص بك:
set IOTHUB_DEVICE_DPS_DEVICE_ID=mytestselfcertprimary set IOTHUB_DEVICE_X509_CERT=<full path to folder that contains PEM files>mytestselfcertprimary_cert.pem set IOTHUB_DEVICE_X509_KEY=<full path to folder that contains PEM files>mytestselfcertprimary_key.pemتلميح
يمكنك تعيين متغيرات البيئة المطلوبة الأخرى عند إكمال البرنامج التعليمي لإنشاء تطبيق عميل وتوصيله بالبرنامج التعليمي لتطبيق Azure IoT Central .
قم بتنفيذ البرنامج النصي وتحقق من أحكام الجهاز بنجاح:
node pnp_temperature_controller.js
يمكنك تكرار الخطوات المذكورة أعلاه للحصول على شهادة mytestselfcertsecondary أيضا.
لتعديل نموذج التعليمة البرمجية لاستخدام شهادات X.509:
انتقل إلى المجلد azure-iot-device/samples/pnp وافتح ملف temp_controller_with_thermostats.py في محرر نصوص.
أضف العبارة التالية
fromلاستيراد وظيفة X.509:from azure.iot.device import X509تعديل الجزء الأول من الدالة
provision_deviceكما يلي:async def provision_device(provisioning_host, id_scope, registration_id, x509, model_id): provisioning_device_client = ProvisioningDeviceClient.create_from_x509_certificate( provisioning_host=provisioning_host, registration_id=registration_id, id_scope=id_scope, x509=x509, )في الدالة
main، استبدل السطر الذي يعينsymmetric_keyالمتغير بالتعليمة البرمجية التالية:x509 = X509( cert_file=os.getenv("IOTHUB_DEVICE_X509_CERT"), key_file=os.getenv("IOTHUB_DEVICE_X509_KEY"), )في الدالة
main، استبدل استدعاء الدالةprovision_deviceبالتعليمة البرمجية التالية:registration_result = await provision_device( provisioning_host, id_scope, registration_id, x509, model_id )في الدالة
main، استبدل استدعاء الدالةIoTHubDeviceClient.create_from_symmetric_keyبالتعليمة البرمجية التالية:device_client = IoTHubDeviceClient.create_from_x509_certificate( x509=x509, hostname=registration_result.registration_state.assigned_hub, device_id=registration_result.registration_state.device_id, product_info=model_id, )حفظ التغييرات.
لتشغيل النموذج:
في بيئة shell، أضف متغيري البيئة التاليين. تأكد من توفير المسار الكامل لملفات PEM واستخدام محدد المسار الصحيح لنظام التشغيل الخاص بك:
set IOTHUB_DEVICE_DPS_DEVICE_ID=mytestselfcertprimary set IOTHUB_DEVICE_X509_CERT=<full path to folder that contains PEM files>mytestselfcertprimary_cert.pem set IOTHUB_DEVICE_X509_KEY=<full path to folder that contains PEM files>mytestselfcertprimary_key.pemتلميح
يمكنك تعيين متغيرات البيئة المطلوبة الأخرى عند إكمال البرنامج التعليمي لإنشاء تطبيق عميل وتوصيله بالبرنامج التعليمي لتطبيق Azure IoT Central .
قم بتنفيذ البرنامج النصي وتحقق من أحكام الجهاز بنجاح:
python temp_controller_with_thermostats.py
يمكنك تكرار الخطوات المذكورة أعلاه للحصول على شهادة mytestselfcertsecondary أيضا.
توصيل جهاز IoT Edge
يفترض هذا القسم أنك تستخدم تسجيل مجموعة لتوصيل جهاز IoT Edge الخاص بك. اتبع الخطوات الواردة في الأقسام السابقة من أجل:
لتوصيل جهاز IoT Edge ب IoT Central باستخدام شهادة جهاز X.509:
انسخ شهادة الجهاز وملفات المفاتيح إلى جهاز IoT Edge الخاص بك. في مثال تسجيل المجموعة السابق، تم استدعاء هذه الملفات sampleDevice01_key.pem و sampleDevice01_cert.pem.
على جهاز IoT Edge ، قم بتحرير
provisioningالقسم في ملف تكوين / etc/iotedge/config.yaml كما يلي:# DPS X.509 provisioning configuration provisioning: source: "dps" global_endpoint: "https://global.azure-devices-provisioning.net" scope_id: "<SCOPE_ID>" attestation: method: "x509" # registration_id: "<OPTIONAL REGISTRATION ID. LEAVE COMMENTED OUT TO REGISTER WITH CN OF identity_cert>" identity_cert: "file:///<path>/sampleDevice01_cert.pem" identity_pk: "file:///<path>/sampleDevice01_key.pem" # always_reprovision_on_startup: true # dynamic_reprovisioning: falseتلميح
لست بحاجة إلى إضافة قيمة ل
registration_id. يمكن ل IoT Edge استخدام قيمة CN من شهادة X.509.قم بتشغيل الأمر التالي لإعادة تشغيل وقت تشغيل IoT Edge:
sudo systemctl restart iotedge
لمعرفة المزيد، راجع إنشاء أجهزة IoT Edge وتوفيرها على نطاق واسع على Linux باستخدام شهادات X.509.
الاتصال جهاز المصب إلى IoT Edge
يستخدم IoT Edge شهادات X.509 لتأمين الاتصال بين الأجهزة النهائية وجهاز IoT Edge الذي يعمل كبوابة شفافة. لمعرفة المزيد حول تكوين هذا السيناريو، راجع الاتصال جهاز مصب إلى بوابة Azure IoT Edge.
لفة شهادات الجهاز X.509
أثناء دورة حياة تطبيق IoT Central، ستحتاج إلى تدوير شهادات x.509. على سبيل المثال:
- إذا كان لديك خرق أمني، فإن تداول الشهادات يعد من أفضل ممارسات الأمان للمساعدة في تأمين نظامك.
- x.509 الشهادات لها تواريخ انتهاء صلاحية. يعتمد تكرار طرح شهاداتك على الاحتياجات الأمنية للحل الخاص بك. يمكن للعملاء الذين لديهم حلول تتضمن بيانات حساسة للغاية تدوير الشهادات يوميا ، بينما يقوم آخرون بتدوير شهاداتهم كل عامين.
للاتصال دون انقطاع، يتيح لك IoT Central تكوين شهادات X.509 الأساسية والثانوية. إذا كان للشهادتين الأساسية والثانوية تواريخ انتهاء صلاحية مختلفة، فيمكنك لف الشهادة منتهية الصلاحية بينما تستمر الأجهزة في الاتصال بالشهادة الأخرى.
لمعرفة المزيد، راجع افترض منهجية الاختراق.
يوضح هذا القسم كيفية تدوير الشهادات في IoT Central. عند تشغيل شهادة في IoT Central، تحتاج أيضا إلى نسخ شهادة الجهاز الجديد إلى أجهزتك.
الحصول على شهادات X.509 جديدة
احصل على شهادات X.509 جديدة من موفر الشهادات. يمكنك إنشاء شهادات X.509 الخاصة بك باستخدام أداة مثل OpenSSL. هذا النهج مفيد لاختبار شهادات X.509 ولكنه يوفر القليل من ضمانات الأمان. استخدم هذا النهج فقط للاختبار ما لم تكن مستعدا للعمل كموفر CA الخاص بك.
مجموعات التسجيل والخروقات الأمنية
لتحديث تسجيل مجموعة استجابة لخرق أمني، يجب عليك استخدام النهج التالي لتحديث الشهادة الحالية على الفور. أكمل هذه الخطوات للشهادتين الابتدائية والثانوية إذا تم اختراقهما:
انتقل إلى الأذونات في الجزء الأيمن وحدد مجموعات اتصال الجهاز.
حدد اسم المجموعة في القائمة ضمن مجموعات التسجيل.
لتحديث الشهادة، حدد إدارة أساسي أو إدارة ثانوي.
إضافة شهادة الجذر X.509 والتحقق منها في مجموعة التسجيل.
التسجيلات الفردية والخروقات الأمنية
إذا كنت تقوم بتدوير الشهادات استجابة لخرق أمني، فاستخدم الطريقة التالية لتحديث الشهادة الحالية على الفور. أكمل هذه الخطوات للشهادتين الابتدائية والثانوية، إذا تم اختراقهما:
حدد الأجهزة، ثم حدد الجهاز.
حدد الاتصال، وحدد طريقة الاتصال كتسجيل فردي
حدد الشهادات (X.509) كآلية.
لتحديث الشهادة، حدد رمز المجلد لتحديد الشهادة الجديدة المراد تحميلها لإدخال التسجيل. حدد حفظ.
مجموعات التسجيل وانتهاء صلاحية الشهادات
لمعالجة انتهاء صلاحية الشهادة، استخدم النهج التالي لتحديث الشهادة الحالية على الفور:
انتقل إلى الأذونات في الجزء الأيمن وحدد مجموعات اتصال الجهاز.
حدد اسم المجموعة في القائمة ضمن مجموعات التسجيل.
لتحديث الشهادة، حدد إدارة الأساسي.
إضافة شهادة الجذر X.509 والتحقق منها في مجموعة التسجيل.
في وقت لاحق عند انتهاء صلاحية الشهادة الثانوية ، عد وقم بتحديث الشهادة الثانوية.
التسجيلات الفردية وانتهاء صلاحية الشهادات
إذا كنت تتداول الشهادات لمعالجة انتهاء صلاحية الشهادة، يجب استخدام تكوين الشهادة الثانوية كما يلي لتقليل وقت التوقف عن العمل للأجهزة التي تحاول تزويدها.
عندما تقترب الشهادة الثانوية من انتهاء صلاحيتها، وتحتاج إلى التدحرج، يمكنك التدوير إلى استخدام التكوين الأساسي. يؤدي التدوير بين الشهادات الأولية والثانوية بهذه الطريقة إلى تقليل وقت التعطل للأجهزة التي تحاول إجراء التزويد.
حدد الأجهزة، ثم حدد الجهاز.
حدد الاتصال، وحدد طريقة الاتصال كتسجيل فردي
حدد الشهادات (X.509) كآلية.
لتحديث الشهادة الثانوية، حدد رمز المجلد لتحديد الشهادة الجديدة المراد تحميلها لإدخال التسجيل. حدد حفظ.
في وقت لاحق عند انتهاء صلاحية الشهادة الأساسية، ارجع وقم بتحديث الشهادة الأساسية.
الخطوات التالية
الآن بعد أن تعلمت كيفية توصيل الأجهزة باستخدام شهادات X.509، فإن الخطوة التالية المقترحة هي معرفة كيفية مراقبة اتصال الجهاز باستخدام Azure CLI.