适用于:
IoT Edge 1.5
重要
IoT Edge 1.5 LTS 是受支持的版本。 IoT Edge 1.4 LTS 于 2024 年 11 月 12 日终止。 如果使用的是早期版本,请参阅 Update IoT Edge。
通过使用Azure IoT Edge,可以将设备配置为使用安全传输(EST)服务器上的注册来管理 x509 证书。
本教程指导你托管测试 EST 服务器,并配置 IoT Edge 设备,以便注册和续订设备标识 x509 证书。 在本教程中,你将了解如何执行以下操作:
- 为设备标识证书创建和托管测试 EST 服务器
- 配置 DPS 组注册
- 配置设备
先决条件
在开始之前,请确保满足以下先决条件:
- 已安装最新 Azure IoT Edge 运行时的现有 IoT Edge 设备。 如果需要创建测试设备,请完成 Quickstart:将第一个IoT Edge模块部署到虚拟 Linux 设备。
- IoT Edge 设备需要 Azure IoT Edge 运行时 1.2 或更高版本来支持 EST。 EST 证书续订需要Azure IoT Edge运行时 1.3 或更高版本。
- IoT 中心设备预配服务 (DPS) 连接到 IoT 中心。 有关配置 DPS 的信息,请参阅 Quickstart:使用 Azure 门户设置 IoT Hub 设备预配服务。
注意
若要使用 EST 和 IoT Edge 来自动颁发和续订设备标识证书(建议用于生产环境),IoT Edge 必须作为 基于 DPS CA 的注册分组的一部分进行预配。 其他预配方法,包括使用 IoT Hub 的手动 X.509 预配和使用单独注册的 DPS,不支持自动续订设备身份证书。
什么是通过安全传输注册?
通过安全传输注册 (EST) 是一种加密协议,可自动颁发 x.509 证书。 它用于公钥基础结构(PKI)客户端,例如IoT Edge需要与证书颁发机构(CA)关联的客户端证书的实例。 EST 取代了对手动证书管理的需求,手动证书管理可能有风险且容易出错。
EST 服务器
对于证书颁发和续订,设备需要访问 EST 服务器。
重要
对于生产环境,请使用 GlobalSign IoT Edge 注册 或 DigiCert IoT 设备管理器。
对于测试和开发,可以使用测试 EST 服务器。 在本教程中,你将创建一个测试 EST 服务器。
在设备上运行 EST 服务器
为了快速入门,本教程演示了在 IoT Edge 设备的本地容器中部署简单 EST 服务器的步骤。 此方法是最简单的尝试方法。
Dockerfile 使用 Ubuntu 18.04、名为 libest 的 Cisco 库和示例服务器代码。 此配置具有以下可更改的设置:
- 根证书颁发机构 (CA) 有效期为 20 年
- EST 服务器证书有效期为 10 年
- 将证书默认天数设置为 1,以测试 EST 续签
- EST 服务器在容器中的 IoT Edge 设备上本地运行
注意
请勿在生产环境中使用此 Dockerfile。
连接到设备,例如使用 SSH,连接到已安装 IoT Edge 的设备。
创建名为
Dockerfile(区分大小写)的文件,并使用你喜欢的文本编辑器添加示例内容。提示
如果要在 Azure 容器实例中托管 EST 服务器,请将
myestserver.chinanorth.azurecontainer.io更改为 EST 服务器的 DNS 名称。 选择 DNS 名称时,请注意 Azure 容器实例的 DNS 标签长度必须至少为 5 个字符。# DO NOT USE IN PRODUCTION - Use only for testing FROM ubuntu:18.04 RUN apt update && apt install -y apache2-utils git openssl libssl-dev build-essential && \ git clone https://github.com/cisco/libest.git && cd libest && \ ./configure --disable-safec && make install && \ rm -rf /src && apt remove --quiet -y libssl-dev build-essential && \ apt autoremove -y && apt clean -y && apt autoclean -y && \ rm -rf /var/lib/apt /tmp/* /var/tmp/* WORKDIR /libest/example/server/ # Setting the root CA expiration to 20 years RUN sed -i "s|-days 365|-days 7300 |g" ./createCA.sh ## If you want to use the EST server to issue Edge CA certificates, ## uncomment the RUN sed section after this comment block. ## The sed commands add special extensions for Edge CA certificates. For more information see: ## https://docs.azure.cn/iot-edge/how-to-manage-device-certificates?tabs=windows#edge-ca-in-production ## ## IMPORTANT: ## DO NOT issue Edge CA certificates in production. ## For production, use digital certificates from a trusted CA. ## See https://techcommunity.microsoft.com/blog/iotblog/automatic-iot-edge-certificate-management-with-globalsign-est/4384385 ## ## Using EST for Edge CA is for demonstration and learning purposes only. ## # RUN sed -i "s|basicConstraints=CA:FALSE|basicConstraints=critical,CA:TRUE,pathlen:0|g" ./estExampleCA.cnf && \ # sed -i "s|keyUsage=digitalSignature|keyUsage=critical,digitalSignature,keyCertSign|g" ./estExampleCA.cnf && \ # sed -i "s|authorityKeyIdentifier=keyid|authorityKeyIdentifier=keyid:always|g" ./estExampleCA.cnf ## If you want to host your EST server remotely (for example, an Azure Container Instance), ## change myestserver.chinanorth.azurecontainer.console.azure.cn to the fully qualified DNS name of your EST server ## OR, change the IP address ## and uncomment the corresponding lines. # RUN sed -i "s|DNS.2 = ip6-localhost|DNS.2 = myestserver.chinanorth.azurecontainer.console.azure.cn|g" ./ext.cnf # RUN sed -i "s|IP.2 = ::1|IP.2 = <YOUR EST SERVER IP ADDRESS>|g" ./ext.cnf # Set EST server certificate to be valid for 10 years RUN sed -i "s|-keyout \$EST_SERVER_PRIVKEY -subj|-keyout \$EST_SERVER_PRIVKEY -days 7300 -subj |g" ./createCA.sh # Create the CA RUN echo 1 | ./createCA.sh # Set cert default-days to 1 to show EST renewal RUN sed -i "s|default_days = 365|default_days = 1 |g" ./estExampleCA.cnf # The EST server listens on port 8085 by default # Uncomment to change the port to 443 or something else. If changed, EXPOSE that port instead of 8085. # RUN sed -i "s|estserver -c|estserver -p 443 -c |g" ./runserver.sh EXPOSE 8085 CMD ./runserver.sh在包含
Dockerfile的目录中,根据示例 Dockerfile 构建镜像。sudo docker build . --tag est启动容器,并将容器的端口 8085 向主机上的端口 8085 公开。
sudo docker run -d -p 8085:8085 est现在,EST 服务器正在运行,可以使用端口 8085 上的
localhost访问它。 通过运行命令查看其服务器证书来验证它是否可用。openssl s_client -showcerts -connect localhost:8085应会在输出中途看到 -----BEGIN CERTIFICATE----- 。 检索证书将验证服务器是否可访问,以及是否可以提供其证书。
提示
若要在云中运行此容器,请生成映像并将映像推送到 Azure 容器注册表。 然后,按照快速入门指南进行部署到 Azure 容器实例。
下载 CA 证书
每个设备都需要与设备标识证书关联的证书颁发机构(CA)证书。
在IoT Edge设备上,创建 /var/aziot/certs 目录(如果不存在),然后将目录更改为该目录。
# If the certificate directory doesn't exist, create, set ownership, and set permissions sudo mkdir -p /var/aziot/certs sudo chown aziotcs:aziotcs /var/aziot/certs sudo chmod 755 /var/aziot/certs # Change directory to /var/aziot/certs cd /var/aziot/certs从 EST 服务器检索 CA 证书到/var/aziot/certs目录中,并将其命名为
cacert.crt.pem。openssl s_client -showcerts -verify 5 -connect localhost:8085 < /dev/null | sudo awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".pem"; print >out}' && sudo cp cert2.pem cacert.crt.pem密钥服务用户 aziotcs 应拥有证书。 将所有证书文件的所有权设置为 aziotcs 并设置权限。 有关证书所有权和权限的详细信息,请参阅权限要求。
# Give aziotcs ownership to certificates sudo chown -R aziotcs:aziotcs /var/aziot/certs # Read and write for aziotcs, read-only for others sudo find /var/aziot/certs -type f -name "*.*" -exec chmod 644 {} \;
使用 DPS 预配 IoT Edge 设备
通过使用设备预配服务,可以从 IoT Edge 中的 EST 服务器自动颁发和续订证书。 使用教程 EST 服务器时,标识证书会在一天内过期,因此手动预配IoT Hub不切实际,因为每次证书过期时,都必须在IoT Hub中手动更新指纹。 使用注册组进行 DPS CA 身份验证后,无需任何手动步骤即可续订设备标识证书。
将 CA 证书上传到 DPS
如果没有链接到 IoT 中心的设备预配服务,请参阅快速入门:使用 Azure 门户设置 IoT 中心设备预配服务。
将 cacert.crt.pem 文件从设备传输到可以访问 Azure 门户的计算机,例如开发计算机。 传输证书的一种简单方法是远程连接到设备、使用命令
cat /var/aziot/certs/cacert.crt.pem显示证书、复制整个输出并将内容粘贴到开发计算机上的新文件。在 Azure 门户中,转到 IoT Hub 设备预配服务的实例。
在 “设置”下,选择“ 证书”,然后选择“ +添加”。
设置 值 证书名称 输入 CA 证书的友好名称。 证书 .pem 或 .cer 文件 从 EST 服务器浏览到 cacert.crt.pem。在上传时将证书状态设置为已验证 选中复选框。 选择“保存” 。
创建注册组
在 Azure 门户中,转到 IoT Hub 设备预配服务的实例。
在“设置”下,选择“管理注册”。
选择 “添加注册组 ”并完成以下步骤以配置注册。
在“注册 + 预配”选项卡中,选择以下设置:
设置 值 证明机制 选择 上传到此设备预配服务实例的 X.509 证书。 主要证书 从下拉列表中选择证书。 组名称 为此组注册提供易于识别的名称。 预配状态 选中“ 启用此注册 ”复选框。 在 “IoT 中心 ”选项卡上,从列表中选择 IoT 中心。
在“设备设置”选项卡中,选中“在预配的设备上启用 IoT Edge”复选框。 其他设置与本教程无关。 可接受默认设置。
选择“查看 + 创建”。
现在设备已注册,IoT Edge 运行时可以自动管理关联 IoT 中心的设备证书。
配置 IoT Edge 设备
在 IoT Edge 设备上,更新 IoT Edge 配置文件,使用 EST 服务器的设备证书。
使用编辑器打开 IoT Edge 配置文件。 例如,使用
nano编辑器打开 /etc/aziot/config.toml 文件:sudo nano /etc/aziot/config.toml在配置文件中添加或替换以下部分。 这些配置设置最初使用用户名和密码身份验证从 EST 服务器获取设备证书。 设备证书向 EST 服务器进行身份验证,以便将来续订证书。
将以下占位符文本:
<DPS-ID-SCOPE>替换为链接到包含已注册设备的 IoT 中心的 DPS 的 ID 作用域,并将myiotedgedevice替换为在Azure IoT Hub中注册的设备 ID。 可以在 DPS 概述页上找到 ID 范围值。# DPS provisioning with X.509 certificate # Replace with ID Scope from your DPS [provisioning] source = "dps" global_endpoint = "https://global.azure-devices-provisioning.net" id_scope = "<DPS-ID-SCOPE>" [provisioning.attestation] method = "x509" registration_id = "myiotedgedevice" [provisioning.attestation.identity_cert] method = "est" common_name = "myiotedgedevice" # Auto renewal settings for the identity cert # Available only from IoT Edge 1.3 and above [provisioning.attestation.identity_cert.auto_renew] rotate_key = false threshold = "80%" retry = "4%" # Trusted root CA certificate in the global EST options # Optional if the EST server's TLS certificate is already trusted by the system's CA certificates. [cert_issuance.est] trusted_certs = [ "file:///var/aziot/certs/cacert.crt.pem", ] # The default username and password for libest # Used for initial authentication to EST server # # Not recommended for production [cert_issuance.est.auth] username = "estuser" password = "estpwd" [cert_issuance.est.urls] default = "https://localhost:8085/.well-known/est"注意
在此示例中,IoT Edge每次需要获取证书时都使用用户名和密码向 EST 服务器进行身份验证。 不建议在生产环境中使用此方法,因为它需要以纯文本形式存储机密。 此外,IoT Edge应使用标识证书向 EST 服务器进行身份验证。 针对生产环境修改:
- 请考虑使用在制造过程中存储在设备上的长期启动证书, 这与 DPS 的建议方法类似。 若要了解如何为 EST 服务器配置启动证书,请参阅使用通过 EST 动态颁发的证书对设备进行身份验证。
- 使用与上一示例中显示的预配证书自动续订配置相同的语法来配置
[cert_issuance.est.identity_auto_renew]。
这样,IoT Edge 证书服务使用引导证书与 EST 服务器进行初始身份验证,并请求一个标识证书,以便将来向同一服务器发出 EST 请求时使用。 如果出于某种原因,EST 标识证书在续订前过期,则 IoT Edge 回退到使用启动证书。
运行
sudo iotedge config apply以应用新设置。运行
sudo iotedge check以验证 IoT Edge 设备配置。 所有配置检查都应成功。 对于本教程,可以忽略生产就绪错误和警告、DNS 服务器警告和连接检查。在 IoT Hub 中找出你的设备。 证书指纹通过使用 DPS 和 EST 服务器自动添加到设备。
注意
新建 IoT Edge 设备时,它会显示状态代码
417 -- The device's deployment configuration isn't set in the Azure portal.此状态正常,并表示设备已准备好接收模块部署。
测试证书续签
可以通过从设备删除现有证书和密钥,然后应用 IoT Edge 配置,立即重新颁发设备标识证书。 IoT Edge 检测到丢失的文件并请求新证书。
在 IoT Edge 设备上,停止 IoT Edge 运行时。
sudo iotedge system stop删除现有证书和密钥。
sudo sh -c "rm /var/lib/aziot/certd/certs/*" sudo sh -c "rm /var/lib/aziot/keyd/keys/*"应用 IoT Edge 配置以更新证书。
sudo iotedge config apply可能需要等待几分钟才能启动运行时。
转到IoT Hub中的设备。 证书指纹已更新。
使用命令
sudo ls -l /var/lib/aziot/certd/certs列出证书文件。 应会看到设备证书文件的最近创建日期。使用
openssl命令检查新的证书内容。 例如:sudo openssl x509 -in /var/lib/aziot/certd/certs/deviceid-bd732105ef89cf8edd2606a5309c8a26b7b5599a4e124a0fe6199b6b2f60e655.cer -text -noout将设备证书文件名 (.cer) 替换为设备的证书文件。
应注意到证书“有效性”日期范围已更改。
以下可选测试演示如何在证书过期或缺失时IoT Edge从 EST 服务器续订证书。 每次测试后,都可以在Azure门户中验证新的指纹,并使用 openssl 命令验证新证书。
- 等待一天,证书自然过期。 测试 EST 服务器配置为创建一天后过期的证书。 物联网边缘设备会自动续签数字证书。
- 调整
threshold中自动续订设置的百分比(当前在示例配置中设置为 80%)。 例如,将其设置为10%,并观察证书大约每 2 小时续期一次。 - 调整
threshold为一个整数,后跟m(分钟)。 例如,将其设置为60m,并在到期前 1 小时观察证书续订。
清理资源
可以保留本教程中创建的资源和配置,并重复使用它们。 否则,请删除本文中使用的本地配置和Azure资源以避免费用。
删除 Azure 资源
无法撤消删除Azure资源和资源组。 请确保不要意外删除错误的资源组或资源。 如果在具有要保留的资源的现有资源组中创建IoT Hub,请仅删除IoT Hub资源本身,而不是资源组。
若要删除资源,请执行以下操作:
- 登录到 Azure 门户,然后选择“资源组”。
- 选择包含 IoT Edge 测试资源的资源组的名称。
- 查看资源组包含的资源列表。 若要删除这一切,可以选择“删除资源组”。 如果只想删除其中一些资源,请选择每个资源以单独删除它们。
后续步骤
- 若要使用 EST 服务器颁发 Edge CA 证书,请参阅 example 配置。
- 不建议在生产环境中使用用户名和密码初始化与 EST 服务器的身份验证。 相反,请考虑使用可在制造过程中存储在设备上的长期启动证书,这类似于 DPS 的建议方法。 有关如何为 EST 服务器配置启动证书的信息,请参阅 使用通过 EST 动态颁发的证书对设备进行身份验证。
- EST 服务器还可用于为层次结构中的所有设备颁发证书。 根据你是否具有 ISA-95 要求,可能需要在每个层运行一个 EST 服务器链,或使用 API 代理模块转发请求。 有关详细信息,请参阅 Kevin 的博客。
- 对于企业级解决方案,请考虑:GlobalSign IoT Edge 注册、DigiCert IoT 设备管理器和 Keytos EZCA。
- 有关证书的详细信息,请参阅 Understand how Azure IoT Edge uses certificates。