【发布时间】:2018-04-22 11:53:35
【问题描述】:
我将 NodeJS 与 AWS JS SDK 和 AWS IoT Device JS SDK 一起使用,以便在连接到我的服务器后自动创建新事物并为其分配证书和策略。
我关注 "Just-in-Time Registration" article 是为了创建、注册和激活我的 CA 证书。据我所知,CA 证书已成功添加到 AWS IoT、激活并启用自动注册。
我不明白这一步是如何执行的(引用文章):
当设备尝试使用 AWS IoT 不知道但由已向 AWS IoT 注册的 CA 签名的 X.509 证书连接时,AWS IoT 将在新的 PENDING_ACTIVATION 中自动注册设备证书状态。
如何“尝试”连接?由于我使用的是aws-iot-device-sdk-js SDK,并带有手动创建的证书,我通常是这样连接我的设备的:
const device = deviceModule.device({
host: 'myendpoint.iot.us-east-1.amazonaws.com',
region: 'us-east-1',
keyPath: `certs/${deviceID}.key`,
certPath: `certs/${deviceID}.pem`,
caPath: 'certs/rootCA.pem',
clientId: deviceID,
baseReconnectTimeMs: 4000,
keepalive: 30,
protocol: 'mqtts',
});
但现在我没有证书和密钥可包含在keyPath 和certPath 中,没有它我无法实例化我的设备。
我尝试自己创建证书,使用 AWS SDK 中的 createKeysAndCertificate(),将它们保存到磁盘,手动附加策略,手动附加委托人甚至尝试手动将证书标记为“活动”,类似于以下内容:
iot.createThing({ thingName: deviceID }, (err, d) => {
if (err) {
console.log(err);
} else {
allThings[d.thingName] = d;
iot.createKeysAndCertificate({ setAsActive: true }, (e, c) => {
if (e) {
console.log(e);
} else {
fs.writeFile(`certs/${deviceID}.pem`, c.certificatePem, (ef, f) => {
if (ef) throw ef;
});
fs.writeFile(`certs/${deviceID}.key`, c.keyPair.PrivateKey, (ef, f) => {
if (ef) throw ef;
});
iot.attachPrincipalPolicy({
policyName: 'my-testing-policy',
principal: c.certificateArn,
}, (ee, cc) => {
if (ee) {
console.log(ee);
} else {
iot.attachThingPrincipal({
principal: c.certificateArn,
thingName: deviceID,
}, (prerr, prdata) => {
if (prerr) {
console.log(prerr);
} else {
iot.acceptCertificateTransfer({
certificateId: c.certificateId,
setAsActive: true,
}, (ce, cd) => {
if (err) {
console.log(err);
} else {
console.log('cert activated.');
}
});
}
});
}
});
}
});
}
});
但毕竟,当我尝试发布某些内容时,我遇到了一个错误:
Error: unable to get local issuer certificate
at Error (native)
at TLSSocket.<anonymous> (_tls_wrap.js:1092:38)
at emitNone (events.js:86:13)
at TLSSocket.emit (events.js:185:7)
at TLSSocket._finishInit (_tls_wrap.js:610:8)
at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:440:38)
我也尝试订阅特定主题,正如上面同一篇文章中提到的,aws/events/certificates/registered/e3f0a30... 但我从未见过关于该主题的一条消息...
我在这里缺少什么?如何仅使用我的即时证书正确触发设备证书和私钥生成?
【问题讨论】:
-
首先,您必须使用您自己的 CA,您可以使用它为您的设备生成您自己的证书。您必须在 AWS IoT 中注册此 CA。当 AWS IoT 遇到此 CA 颁发的新证书时,它会将设备置于 PENDING_ACTIVATION 状态。您必须自己创建自己的证书,而不必为此使用 AWS 开发工具包。这是docs.aws.amazon.com/iot/latest/developerguide/… 的文档。 AWS IoT 很棘手,有很多要理解的地方
-
我确实创建了自己的 CA,我可以在我的 IoT 控制台中看到它,它的状态为“已激活”并且“自动注册”设置为“启用”。一旦设备连接到我的服务器,我现在应该如何使用它来创建我的设备密钥和证书?如果可以以某种方式使用 AWS SDK 执行此操作,我想避免从 NodeJS 调用操作系统命令...
-
@Sapher 你分享的链接......所以,我做了一切到“使用自动/即时注册设备证书”部分......如果你看那段,你会还可以看到这句话:“当设备首次尝试连接到 AWS IoT 时,作为 TLS 握手的一部分,它必须出示已注册的 CA 证书和设备证书。”我从来没有设法做到这一点......“尝试连接”是什么意思?发布消息还是什么?如果我不自己创建“设备证书”,如何出示?我认为这个根 CA 应该为我做这件事?
-
你的问题不大,不用担心:)。问题是您必须生成自己的证书,为此您必须使用
openssl,肯定还有其他方法可以做到这一点,也许AWS-SDK中有一个神奇的功能可以做到,但我知道的方式是低谷openssl。在我给您的链接中,您需要的部分是“使用您的 CA 证书创建设备证书”。 “尝试连接”是指你的设备尝试连接亚马逊,如果亚马逊知道你的 CA,它就会知道这个他不知道的新证书来自你的 CA。 -
@Sapher 哦,好吧,所以我确实必须手动创建设备密钥和证书?那么这个设备证书应该处于“PENDING”状态吗?你能给我一个任何语言的设备“连接尝试”的例子吗? JS、Java、Python、bash 等等 :)
标签: javascript node.js amazon-web-services aws-sdk aws-iot