次の方法で共有

教程:为 Azure IoT Edge 配置通过安全传输的注册服务器

适用于:IoT Edge 1.5 勾选标记 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 组注册
  • 配置设备

先决条件

在开始之前,请确保满足以下先决条件:

注意

若要使用 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。

  1. 连接到设备,例如使用 SSH,连接到已安装 IoT Edge 的设备。

  2. 创建名为 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
    
  3. 在包含 Dockerfile 的目录中,根据示例 Dockerfile 构建镜像。

    sudo docker build . --tag est
    
  4. 启动容器,并将容器的端口 8085 向主机上的端口 8085 公开。

    sudo docker run -d -p 8085:8085 est
    
  5. 现在,EST 服务器正在运行,可以使用端口 8085 上的 localhost 访问它。 通过运行命令查看其服务器证书来验证它是否可用。

    openssl s_client -showcerts -connect localhost:8085
    
  6. 应会在输出中途看到 -----BEGIN CERTIFICATE----- 。 检索证书将验证服务器是否可访问,以及是否可以提供其证书。

提示

若要在云中运行此容器,请生成映像并将映像推送到 Azure 容器注册表。 然后,按照快速入门指南进行部署到 Azure 容器实例

下载 CA 证书

每个设备都需要与设备标识证书关联的证书颁发机构(CA)证书。

  1. 在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
    
  2. 从 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
    
  3. 密钥服务用户 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

  1. 如果没有链接到 IoT 中心的设备预配服务,请参阅快速入门:使用 Azure 门户设置 IoT 中心设备预配服务

  2. cacert.crt.pem 文件从设备传输到可以访问 Azure 门户的计算机,例如开发计算机。 传输证书的一种简单方法是远程连接到设备、使用命令 cat /var/aziot/certs/cacert.crt.pem显示证书、复制整个输出并将内容粘贴到开发计算机上的新文件。

  3. Azure 门户中,转到 IoT Hub 设备预配服务的实例。

  4. “设置”下,选择“ 证书”,然后选择“ +添加”。

    使用 Azure 门户将 CA 证书添加到设备预配服务的屏幕截图。

    设置
    证书名称 输入 CA 证书的友好名称。
    证书 .pem 或 .cer 文件 从 EST 服务器浏览到 cacert.crt.pem
    在上传时将证书状态设置为已验证 选中复选框。
  5. 选择“保存” 。

创建注册组

  1. Azure 门户中,转到 IoT Hub 设备预配服务的实例。

  2. 在“设置”下,选择“管理注册”。

  3. 选择 “添加注册组 ”并完成以下步骤以配置注册。

  4. 在“注册 + 预配”选项卡中,选择以下设置:

    此截图显示在 Azure 门户中添加 DPS 注册组。

    设置
    证明机制 选择 上传到此设备预配服务实例的 X.509 证书
    主要证书 从下拉列表中选择证书。
    组名称 为此组注册提供易于识别的名称。
    预配状态 选中“ 启用此注册 ”复选框。
  5. “IoT 中心 ”选项卡上,从列表中选择 IoT 中心。

  6. 在“设备设置”选项卡中,选中“在预配的设备上启用 IoT Edge”复选框。 其他设置与本教程无关。 可接受默认设置。

  7. 选择“查看 + 创建”。

现在设备已注册,IoT Edge 运行时可以自动管理关联 IoT 中心的设备证书。

配置 IoT Edge 设备

在 IoT Edge 设备上,更新 IoT Edge 配置文件,使用 EST 服务器的设备证书。

  1. 使用编辑器打开 IoT Edge 配置文件。 例如,使用 nano 编辑器打开 /etc/aziot/config.toml 文件:

    sudo nano /etc/aziot/config.toml
    
  2. 在配置文件中添加或替换以下部分。 这些配置设置最初使用用户名和密码身份验证从 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 服务器进行身份验证。 针对生产环境修改:

    1. 请考虑使用在制造过程中存储在设备上的长期启动证书, 这与 DPS 的建议方法类似。 若要了解如何为 EST 服务器配置启动证书,请参阅使用通过 EST 动态颁发的证书对设备进行身份验证
    2. 使用与上一示例中显示的预配证书自动续订配置相同的语法来配置[cert_issuance.est.identity_auto_renew]

    这样,IoT Edge 证书服务使用引导证书与 EST 服务器进行初始身份验证,并请求一个标识证书,以便将来向同一服务器发出 EST 请求时使用。 如果出于某种原因,EST 标识证书在续订前过期,则 IoT Edge 回退到使用启动证书。

  3. 运行 sudo iotedge config apply 以应用新设置。

  4. 运行 sudo iotedge check 以验证 IoT Edge 设备配置。 所有配置检查都应成功。 对于本教程,可以忽略生产就绪错误和警告、DNS 服务器警告和连接检查。

  5. 在 IoT Hub 中找出你的设备。 证书指纹通过使用 DPS 和 EST 服务器自动添加到设备。

    Azure 门户中 IoT 中心设备设置的截图。证书指纹字段显示值。

    注意

    新建 IoT Edge 设备时,它会显示状态代码 417 -- The device's deployment configuration isn't set in the Azure portal.此状态正常,并表示设备已准备好接收模块部署。

测试证书续签

可以通过从设备删除现有证书和密钥,然后应用 IoT Edge 配置,立即重新颁发设备标识证书。 IoT Edge 检测到丢失的文件并请求新证书。

  1. 在 IoT Edge 设备上,停止 IoT Edge 运行时。

    sudo iotedge system stop
    
  2. 删除现有证书和密钥。

    sudo sh -c "rm /var/lib/aziot/certd/certs/*"
    sudo sh -c "rm /var/lib/aziot/keyd/keys/*"
    
  3. 应用 IoT Edge 配置以更新证书。

    sudo iotedge config apply
    

    可能需要等待几分钟才能启动运行时。

  4. 转到IoT Hub中的设备。 证书指纹已更新。

    Azure 门户中 IoT 中心设备设置的截图。证书指纹字段显示新值。

  5. 使用命令 sudo ls -l /var/lib/aziot/certd/certs列出证书文件。 应会看到设备证书文件的最近创建日期。

  6. 使用 openssl 命令检查新的证书内容。 例如:

    sudo openssl x509 -in /var/lib/aziot/certd/certs/deviceid-bd732105ef89cf8edd2606a5309c8a26b7b5599a4e124a0fe6199b6b2f60e655.cer -text -noout
    

    将设备证书文件名 (.cer) 替换为设备的证书文件。

    应注意到证书“有效性”日期范围已更改。

以下可选测试演示如何在证书过期或缺失时IoT Edge从 EST 服务器续订证书。 每次测试后,都可以在Azure门户中验证新的指纹,并使用 openssl 命令验证新证书。

  1. 等待一天,证书自然过期。 测试 EST 服务器配置为创建一天后过期的证书。 物联网边缘设备会自动续签数字证书。
  2. 调整 threshold 中自动续订设置的百分比(当前在示例配置中设置为 80%)。 例如,将其设置为 10%,并观察证书大约每 2 小时续期一次。
  3. 调整 threshold 为一个整数,后跟 m (分钟)。 例如,将其设置为 60m ,并在到期前 1 小时观察证书续订。

清理资源

可以保留本教程中创建的资源和配置,并重复使用它们。 否则,请删除本文中使用的本地配置和Azure资源以避免费用。

删除 Azure 资源

无法撤消删除Azure资源和资源组。 请确保不要意外删除错误的资源组或资源。 如果在具有要保留的资源的现有资源组中创建IoT Hub,请仅删除IoT Hub资源本身,而不是资源组。

若要删除资源,请执行以下操作:

  1. 登录到 Azure 门户,然后选择“资源组”。
  2. 选择包含 IoT Edge 测试资源的资源组的名称。
  3. 查看资源组包含的资源列表。 若要删除这一切,可以选择“删除资源组”。 如果只想删除其中一些资源,请选择每个资源以单独删除它们。

后续步骤