Eclipse Hono 中基于 X.509 的设备身份验证
在过去的几个月里,媒体上充斥着关于不安全的报道 物联网设备甚至无法满足最基本的安全要求。引起的关注之一是从设备传输到制造商提供的云服务的数据的机密性。在许多情况下,数据通过完全未加密的公共网络发送,这非常令人惊讶,因为当今物联网设备中使用的所有流行的基于 TCP/IP 的传输协议(例如 HTTP 和 MQTT)都支持协商和使用通过传输层安全保护(加密)传输通道 (TLS)。
Eclipse Hono 从一开始就支持在其 HTTP 和 MQTT 协议适配器中使用 TLS。最近发布的 0.9-M2 里程碑增加了对使用 X.509 客户端证书的设备身份验证的支持,作为 HTTP 和 MQTT 适配器的 TLS 握手的一部分。这允许设备使用私钥/公钥对而不是用户名和密码来向协议适配器进行身份验证。
调用所有开发者
欧洲最大的物联网黑客马拉松将于 2019 年 5 月 14 日至 15 日重返柏林。与 700 多名开发人员一起参加各种特定领域的黑客挑战,进行黑客、游戏、学习、娱乐并结交来自世界各地的新朋友!
加入物联网黑客马拉松在这篇博文中,我将向您介绍如何创建和注册特定于租户的信任锚的完整示例 , 为设备创建证书,注册其主体专有名称 最后,使用证书向 Hono 的 MQTT 协议适配器验证设备。在本文的其余部分,我将假设您对基于 RSA 的密码学有一个大致的了解,特别是私钥和公钥所扮演的角色。作为参考,RFC 5280 定义了 X.509 的所有技术细节。
为什么要使用客户端证书?
使用密码对设备进行身份验证时,每个设备的密码都需要在Hono的Credentials服务中注册,以便协议适配器可以将设备在身份验证过程中提供的密码与记录的密码哈希值进行比较。
使用客户端证书对设备进行身份验证的优势之一是不再需要为 Hono 注册设备的个人机密(密码)。相反,注册一个信任锚就足够了 对于租户,作为 TLS 握手的一部分,该租户随后可用于验证属于该租户的所有设备的身份。为此,设备使用的客户端证书必须包含数字签名,该签名可以使用作为租户信任锚的公钥进行验证。
创建租户证书颁发机构
因此,第一步是创建租户的公钥/私钥对,用于签署租户设备使用的客户端证书。
$ openssl genrsa -outtenant-key.pem 4096 $ openssl req -x509 -key tenant-key.pem -out tenant-cert.pem -days 365 -subj "/O=ACME Inc./CN=Sensors"使用`-subj` 参数设置的主题专有名称可以包含任何有效的X.500 专有名称。然而,为了简单起见,除了 `CN`、`L`、`ST`、`O`、`OU`、`C`、`STREET`、`DC`、 `UID`。
注册租户
现在密钥已经创建,我们可以使用公钥作为信任锚来注册一个租户。
为方便起见,我们将使用Hono Sandbox。但是,运行 0.9-M2 或更高版本的任何其他(本地)安装也应该可以正常工作。
在下面的命令中,请将“ACME”租户标识符替换为您自己选择的标识符。这很重要,因为 Hono 强制执行租户标识符的唯一性。因此,每个标识符只能在每个 Hono 实例中注册一次。
前三个命令定义了一些变量供以后使用:租户标识符、证书的主题专有名称和 Base64 编码的公钥。然后在命令中使用这些变量向新租户注册信任锚。
$租户=“ACME” $ SUBJECT=$(openssl x509 -in tenant-cert.pem -noout -subject -nameopt RFC2253 | sed s/^subject=//) $ PK=$(openssl x509 -in tenant-cert.pem -noout -pubkey | sed /^---/d | sed -z 's/\n//g') $ cat <创建设备证书
下一步是为设备及其对应的客户端证书创建密钥对,该证书由租户的私钥签名。
$ openssl genrsa -out device-key.pem 4096 $ openssl req -new -key device-key.pem -subj "/O=ACME Inc./CN=Hot Fuzz Device" | openssl x509 -req -days 365 -out device-cert.pem -CA tenant-cert.pem -CAkey tenant-key.pem -CAcreateserial同样,请确保不要在主题中使用除 `CN`、`L`、`ST`、`O`、`OU`、`C`、`STREET`、`DC`、`UID` 之外的任何属性类型专有名称。
注册设备
我们现在可以使用任意设备标识符向租户注册设备。
$ curl -i -H 'Content-Type:application/json' --data-binary '{"device-id":"hot-fuzz"}' https://hono.eclipse.org:28443/registration/$租户注册设备的主题 DN
最后一步是注册设备的主题专有名称。同样,请确保使用与上述相同的租户和设备标识符。
$ SUBJECT=$(openssl x509 -in device-cert.pem -noout -subject -nameopt RFC2253 | sed s/^subject=//) $ cat <测试连接
现在设备已经注册,是时候使用新创建的客户端证书连接到 MQTT 适配器并发布一些数据。
首先,我们为我们注册设备的租户启动一个使用者。您可以从 Hono 网站下载客户端:
$ java -jar hono-cli-*-exec.jar --hono.client.host=hono.eclipse.org --hono.client.port=15671 --hono.client.tlsEnabled=true --hono.client.用户名=消费者@HONO --hono.client.password=verysecret --spring.profiles.active=receiver --tenant.id=$TENANT在最后一步,我们使用 Eclipse Mosquitto 命令行客户端发布一些遥测数据:
$ mosquitto_pub -h hono.eclipse.org -p 8883 --capath /etc/ssl/certs/ --cert device-cert.pem --key device-key.pem -q 1 -t 遥测 -m “你好”如果一切顺利,您应该能够在启动消费者的终端中看到记录到控制台的数据。
设备也可能使用 HTTP 来发布数据:
$ curl -i --cert device-cert.pem --key device-key.pem -H 'Content-Type:plain/text' -H 'Expect:' --data-binary '你好' https:// hono.eclipse.org:8443/遥测
物联网技术