РЕДАКТИРОВАТЬ 05/09/2018: Я нашел этот пост в блоге, в котором довольно хорошо описывается мой подход: Обеспечение безопасной связи с AWS IoT Core с помощью справочного приложения торгового автомата для сертификатов
Вы можете взглянуть на Предоставление точно в срок или создать собственное решение на основе Программная подготовка .
Я много раз сталкивался с этой темой и должен был понять, что она во многом зависит от варианта использования, что имеет больше смысла. Также безопасность является аспектом, за которым нужно следить. Вы не хотите, чтобы общедоступный API, отвечающий за регистрацию устройства JIT, был доступен для всего Интернета.
Простой сценарий, основанный на программной инициализации, может выглядеть следующим образом: вы создаете объект (возможно, датчик), который должен иметь возможность подключаться к AWS IoT и иметь внутренний процесс подготовки.
Простой процесс обеспечения:
- Вещь построена
- У вещи есть серийный номер
- Вещь регистрируется через внутренний сервер
Регистрационный код, запущенный на сервере, может выглядеть примерно так (JS + AWS JS SDK):
// Modules
const AWS = require('aws-sdk')
// AWS
const iot = new AWS.Iot({ region: process.env.region })
// Config
const templateBodyJson = require('./register-thing-template-body.json')
// registerThing
const registerThing = async ({ serialNumber = null } = {}) => {
if (!serialNumber) throw new Error('`serialNumber` required!')
const {
certificateArn = null,
certificateId = null,
certificatePem = null,
keyPair: {
PrivateKey: privateKey = null,
PublicKey: publicKey = null
} = {}
} = await iot.createKeysAndCertificate({ setAsActive: true }).promise()
const registerThingParams = {
templateBody: JSON.stringify(templateBodyJson),
parameters: {
ThingName: serialNumber,
SerialNumber: serialNumber,
CertificateId: certificateId
}
}
const { resourceArns = null } = await iot.registerThing(registerThingParams).promise()
return {
certificateArn,
certificateId,
certificatePem,
privateKey,
publicKey,
resourceArns
}
}
const unregisterThing = async ({ serialNumber = null } = {}) => {
if (!serialNumber) throw new Error('`serialNumber` required!')
try {
const thingName = serialNumber
const { principals: thingPrincipals } = await iot.listThingPrincipals({ thingName }).promise()
const certificates = thingPrincipals.map((tp) => ({ certificateId: tp.split('/').pop(), certificateArn: tp }))
for (const { certificateId, certificateArn } of certificates) {
await iot.detachThingPrincipal({ thingName, principal: certificateArn }).promise()
await iot.updateCertificate({ certificateId, newStatus: 'INACTIVE' }).promise()
await iot.deleteCertificate({ certificateId, forceDelete: true }).promise()
}
await iot.deleteThing({ thingName }).promise()
return {
deleted: true,
thingPrincipals
}
} catch (err) {
// Already deleted!
if (err.code && err.code === 'ResourceNotFoundException') {
return {
deleted: true,
thingPrincipals: []
}
}
throw err
}
}
регистр-вещь-шаблонный body.json:
{
"Parameters": {
"ThingName": {
"Type": "String"
},
"SerialNumber": {
"Type": "String"
},
"CertificateId": {
"Type": "String"
}
},
"Resources": {
"thing": {
"Type": "AWS::IoT::Thing",
"Properties": {
"ThingName": {
"Ref": "ThingName"
},
"AttributePayload": {
"serialNumber": {
"Ref": "SerialNumber"
}
},
"ThingTypeName": "NewDevice",
"ThingGroups": ["NewDevices"]
}
},
"certificate": {
"Type": "AWS::IoT::Certificate",
"Properties": {
"CertificateId": {
"Ref": "CertificateId"
}
}
},
"policy": {
"Type": "AWS::IoT::Policy",
"Properties": {
"PolicyName": "DefaultNewDevicePolicy"
}
}
}
}
Убедитесь, что у вас есть все типы, группы и политики вещей NewDevice. Также имейте в виду ThingName = SerialNumber (важно для отмены регистрации).