كيفية توصيل الأجهزة بشهادات 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 الاختبار. لكي تتمكن من إنشاء هذه الشهادات، تحتاج إلى:
- جهاز تطوير مع تثبيت الإصدار 6 Node.js أو أحدث. يمكنك تشغيل
node --version
في سطر الأوامر للتحقق من الإصدار الخاص بك. تفترض الإرشادات الواردة في هذا البرنامج التعليمي أنك تقوم بتشغيل أمر العقدة في موجه أوامر 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
تلميح
يمكن أن يحتوي معرف الجهاز على أحرف وأرقام وحرف
-
.
تنتج هذه الأوامر الجذر التالي وشهادات الجهاز:
filename | المحتويات |
---|---|
mytestrootcert_cert.pem | الجزء العام من شهادة X509 الجذر |
mytestrootcert_key.pem | المفتاح الخاص لشهادة X509 الجذر |
mytestrootcert_fullchain.pem | سلسلة المفاتيح بأكملها لشهادة X509 الجذر. |
mytestrootcert.pfx | ملف PFX لشهادة X509 الجذر. |
sampleDevice01_cert.pem | الجزء العام من شهادة X509 للجهاز |
sampleDevice01_key.pem | المفتاح الخاص لشهادة X509 للجهاز |
sampleDevice01_fullchain.pem | سلسلة المفاتيح بأكملها لشهادة X509 للجهاز. |
sampleDevice01.pfx | ملف PFX لشهادة X509 للجهاز. |
دون ملاحظة عن موقع هذه الملفات. ستحتاجها لاحقًا.
إنشاء تسجيل مجموعة
افتح تطبيق IoT Central وانتقل إلى Permissions في الجزء الأيمن وحدد Device connection groups.
حدد + جديد لإنشاء مجموعة تسجيل جديدة تسمى MyX509Group بنوع تصديق من الشهادات (X.509). يمكنك إنشاء مجموعات تسجيل لأجهزة IoT أو أجهزة IoT Edge.
في مجموعة التسجيل التي أنشأتها، حدد إدارة الأساسي.
في لوحة الشهادة الأساسية، حدد إضافة شهادة.
قم بتحميل ملف الشهادة الجذر المسمى 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، انقر نقرا مزدوجا فوق ملفات PFX التي أنشأتها مسبقا - mytestrootcert.pfx
و sampleDevice01.pfx
. في معالج استيراد الشهادات، حدد المستخدم الحالي كموقع المتجر، وأدخل 1234
ككلمة مرور، واترك المعالج يختار مخزن الشهادات تلقائيا. يستورد المعالج الشهادات إلى المخزن الشخصي للمستخدم الحالي.
لتعديل نموذج التعليمات البرمجية لاستخدام شهادات X.509:
في حل IoTHubDeviceSamples Visual Studio، افتح ملف Parameter.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");
احفظ التغييرات.
في حل IoTHubDeviceSamples Visual Studio، افتح ملف Program.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.pfx
IOTHUB_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
تلميح
يمكن أن يحتوي معرف الجهاز على أحرف وأرقام وحرف -
.
تنتج هذه الأوامر شهادات الجهاز التالية:
filename | المحتويات |
---|---|
mytestselfcertprimary_cert.pem | الجزء العام من شهادة X509 للجهاز الأساسي |
mytestselfcertprimary_key.pem | المفتاح الخاص لشهادة X509 للجهاز الأساسي |
mytestselfcertprimary_fullchain.pem | سلسلة المفاتيح بأكملها لشهادة X509 للجهاز الأساسي. |
mytestselfcertprimary.pfx | ملف PFX لشهادة X509 للجهاز الأساسي. |
mytestselfcertsecondary_cert.pem | الجزء العام من شهادة X509 للجهاز الثانوي |
mytestselfcertsecondary_key.pem | المفتاح الخاص لشهادة X509 للجهاز الثانوي |
mytestselfcertsecondary_fullchain.pem | سلسلة المفاتيح بأكملها لشهادة X509 للجهاز الثانوي. |
mytestselfcertsecondary.pfx | ملف PFX لشهادة X509 للجهاز الثانوي. |
إنشاء تسجيل فردي
في تطبيق Azure IoT Central، حدد الأجهزة، وأنشئ جهازا جديدا باستخدام معرف الجهاز ك mytestselfcertprimary من قالب جهاز منظم الحرارة. دون ملاحظة عن نطاق المعرف، يمكنك استخدامه لاحقا.
افتح الجهاز الذي أنشأته وحدد الاتصال.
حدد التسجيل الفردي كنوع المصادقة والشهادات (X.509) كطريقة مصادقة.
قم بتحميل ملف mytestselfcertprimary_cert.pem الذي أنشأته مسبقا كشهادة أساسية.
قم بتحميل ملف mytestselfcertsecondary_cert.pem الذي أنشأته مسبقا كشهادة ثانوية. ثم حدد حفظ.
يحتوي الجهاز الآن على تسجيل فردي بشهادات X.509.
تشغيل نموذج جهاز تسجيل فردي
إذا كنت تستخدم Windows، يجب أن تكون شهادات X.509 في مخزن شهادات Windows لكي يعمل النموذج. في مستكشف Windows، انقر نقرا مزدوجا فوق ملفات PFX التي أنشأتها مسبقا - mytestselfcertprimary.pfx
و mytestselfcertsecondary.pfx
. في معالج استيراد الشهادات، حدد المستخدم الحالي كموقع المتجر، وأدخل 1234
ككلمة مرور، واترك المعالج يختار مخزن الشهادات تلقائيا. يستورد المعالج الشهادات إلى المخزن الشخصي للمستخدم الحالي.
لتعديل نموذج التعليمات البرمجية لاستخدام شهادات X.509:
في حل IoTHubDeviceSamples Visual Studio، افتح ملف Parameter.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");
احفظ التغييرات.
في حل IoTHubDeviceSamples Visual Studio، افتح ملف Program.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_ID
: mytestselfcertprimaryIOTHUB_DEVICE_X509_CERT
:<full path to folder that contains PFX files>mytestselfcertprimary.pfx
IOTHUB_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/aziot/config.toml كما يلي:# 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 [provisioning] source = "dps" global_endpoint = "https://global.azure-devices-provisioning.net" id_scope = "<SCOPE_ID>" [provisioning.attestation] method = "x509" registration_id = "env-sens-001" identity_pk = "file:///<path>/envSens001_key.pem" identity_cert = "file:///<path>/envSens001_cert.pem"
تلميح
لا تحتاج إلى إضافة قيمة ل
registration_id
. يمكن ل IoT Edge استخدام قيمة CN من شهادة X.509.قم بتشغيل الأمر التالي لإعادة تشغيل وقت تشغيل IoT Edge:
sudo iotedge config apply
لمعرفة المزيد، راجع إنشاء أجهزة 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 الجذر والتحقق منها في مجموعة التسجيل.
التسجيلات الفردية والخروقات الأمنية
إذا كنت تقوم بنشر الشهادات استجابة لخرق أمني، فاستخدم الأسلوب التالي لتحديث الشهادة الحالية على الفور. أكمل هذه الخطوات للشهادات الأساسية والثانوية، إذا تم اختراق كليهما:
حدد الأجهزة، وحدد الجهاز.
حدد الاتصال، وحدد أسلوب الاتصال ك تسجيل فردي
حدد Certificates (X.509) كآلية.
لتحديث الشهادة، حدد أيقونة المجلد لتحديد الشهادة الجديدة التي سيتم تحميلها لإدخال التسجيل. حدد حفظ.
مجموعات التسجيل وانتهاء صلاحية الشهادات
لمعالجة انتهاء صلاحية الشهادة، استخدم الأسلوب التالي لتحديث الشهادة الحالية على الفور:
انتقل إلى الأذونات في الجزء الأيمن وحدد مجموعات اتصال الجهاز.
حدد اسم المجموعة في القائمة ضمن مجموعات التسجيل.
لتحديث الشهادة، حدد إدارة الأساسي.
إضافة شهادة X.509 الجذر والتحقق منها في مجموعة التسجيل.
لاحقا عند انتهاء صلاحية الشهادة الثانوية، عد وقم بتحديث الشهادة الثانوية.
التسجيلات الفردية وانتهاء صلاحية الشهادات
إذا كنت تقوم بتدحرج الشهادات للتعامل مع انتهاء صلاحية الشهادة، فيجب عليك استخدام تكوين الشهادة الثانوية كما يلي لتقليل وقت التعطل للأجهزة التي تحاول توفيرها في التطبيق الخاص بك.
عندما تقترب الشهادة الثانوية من انتهاء الصلاحية، وتحتاج إلى لفها، يمكنك التدوير لاستخدام التكوين الأساسي. يؤدي التدوير بين الشهادات الأساسية والثانوية بهذه الطريقة إلى تقليل وقت التعطل للأجهزة التي تحاول توفيرها في التطبيق الخاص بك.
حدد الأجهزة، وحدد الجهاز.
حدد الاتصال، وحدد أسلوب الاتصال ك تسجيل فردي
حدد Certificates (X.509) كآلية.
لتحديث الشهادة الثانوية، حدد رمز المجلد لتحديد الشهادة الجديدة التي سيتم تحميلها لإدخال التسجيل. حدد حفظ.
لاحقا عند انتهاء صلاحية الشهادة الأساسية، عد وقم بتحديث الشهادة الأساسية.