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

适用于:IoT Edge 1.5 复选标记 IoT Edge 1.5 IoT Edge 1.4 复选标记 IoT Edge 1.4

重要

IoT Edge 1.5 LTS 和 IoT Edge 1.4 LTS 是受支持的版本。 IoT Edge 1.4 LTS 的生命周期结束日期为 2024 年 11 月 12 日。 如果使用的是较低的版本,请参阅更新 IoT Edge

通过 Azure IoT Edge,可以将设备配置为使用通过安全传输的注册 (EST) 服务器来管理 x509 证书。

本教程指导你托管测试 EST 服务器并配置 IoT Edge 设备的 x509 证书的注册和续签。 在本教程中,你将了解如何执行以下操作:

  • 创建并托管测试 EST 服务器
  • 配置 DPS 组注册
  • 配置设备

示意图显示完成本教程所需的三个步骤的基本概述。

先决条件

什么是通过安全传输注册?

通过安全传输注册 (EST) 是一种加密协议,可自动颁发 x.509 证书。 它用于公钥基础结构 (PKI) 客户端,例如需要与证书颁发机构 (CA) 关联的客户端证书的 IoT Edge。 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. 连接到已安装 IoT Edge 的设备,例如使用 SSH。

  2. 创建名为 Dockerfile(区分大小写)的文件,并使用你喜欢的文本编辑器添加示例内容。

    提示

    如果要在 Azure 容器实例中托管 EST 服务器,请将 myestserver.chinanorth.azurecontainer.console.azure.cn 更改为 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 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 line.
    # 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 doen'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. 将 CA 证书从 EST 服务器检索到 /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 中心不切实际,因为每次证书过期时都必须在 IoT 中心手动更新指纹。 使用注册组进行 DPS CA 身份验证,无需手动步骤即可完成设备标识证书的续签。

将 CA 证书上传到 DPS

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

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

  3. Azure 门户中,导航到 IoT 中心设备预配服务的实例。

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

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

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

创建注册组

  1. Azure 门户中,导航到 IoT 中心设备预配服务的实例。

  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 中心注册的设备 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 服务器进行身份验证。 不建议在生产中使用此方法,因为 1) 它要求以纯文本形式存储机密 2) 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 中心导航到设备。 已使用 DPS 和 EST 服务器将证书指纹自动添加到设备中。

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

    注意

    新建 IoT Edge 设备时,它会显示状态代码 417 -- The device's deployment configuration is not 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 中心导航到设备。 证书指纹已更新。

    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 服务器配置为创建一天后过期的证书。 IoT Edge 会自动续签证书。
  2. 请尝试调整 config.toml 中设置的自动续订的 threshold 中的百分比(当前在示例配置中设置为 80%)。 例如,将其设置为 10%,并每隔约 2 小时观察证书续订。
  3. 尝试将 threshold 调整为整数,后跟 m(分钟)。 例如,将其设置为 60m 并在到期前 1 小时观察证书续订。

清理资源

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

删除 Azure 资源

删除 Azure 资源和资源组的操作不可逆。 请确保不要意外删除错误的资源组或资源。 如果在现有的包含要保留资源的资源组中创建了 IoT 中心,请只删除 IoT 中心资源本身,而不要删除资源组。

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

  1. 登录到 Azure 门户,然后选择“资源组”。

  2. 选择包含 IoT Edge 测试资源的资源组的名称。

  3. 查看资源组包含的资源列表。 若要删除这一切,可以选择“删除资源组”。 如果只需删除部分,可以选择每个资源以单独删除。

后续步骤