你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure IoT 操作内部通信的证书管理

Azure IoT 操作中的所有通信都使用 TLS 进行加密。 为了帮助入门,Azure IoT 操作使用 TLS 服务器证书的默认根 CA 和颁发者进行部署。 你可以使用默认设置进行开发和测试。 对于生产部署,我们建议使用自己的 CA 颁发者和企业 PKI 解决方案。

TLS 服务器证书的默认自签名颁发者和根 CA 证书

为了帮助你入门,我们为 Azure IoT 操作部署了 TLS 服务器证书的默认自签名颁发者和根 CA 证书。 可以使用此颁发者进行开发和测试。 Azure IoT 操作使用 cert-manager 来管理 TLS 证书,使用 trust-manager 将信任捆绑包分发到组件。

  • CA 证书是自签名证书,不受 Azure IoT 操作外部的任何客户端信任。 CA 证书的使用者是 CN=Azure IoT Operations Quickstart Root CA - Not for Production。 CA 证书由证书管理器自动轮替。

  • 根 CA 证书存储在命名空间 cert-manager 下名为 azure-iot-operations-aio-ca-certificate 的 Kubernetes 机密中。

  • 根 CA 证书的公共部分存储在命名空间 azure-iot-operations 名为 azure-iot-operations-aio-ca-trust-bundle 的 ConfigMap 中。 可以从 ConfigMap 检索 CA 证书,并使用 kubectl 和 openssl 对其进行检查。 证书管理器轮替 CA 证书时,信任管理器会持续更新 ConfigMap。

    kubectl get configmap azure-iot-operations-aio-ca-trust-bundle -n azure-iot-operations -o "jsonpath={.data['ca\.crt']}" | openssl x509 -text -noout
    
    Certificate: 
        Data: 
            Version: 3 (0x2) 
            Serial Number: 
                <SERIAL-NUMBER> 
            Signature Algorithm: sha256WithRSAEncryption 
            Issuer: O=Microsoft, CN=Azure IoT Operations Quickstart Root CA - Not for Production 
            Validity 
                Not Before: Sep 18 20:42:19 2024 GMT 
                Not After : Sep 18 20:42:19 2025 GMT 
            Subject: O=Microsoft, CN=Azure IoT Operations Quickstart Root CA - Not for Production 
            Subject Public Key Info: 
                Public Key Algorithm: rsaEncryption 
                    Public-Key: (2048 bit) 
                    Modulus: <MODULUS> 
                                        Exponent: 65537 (0x10001) 
            X509v3 extensions: 
                X509v3 Key Usage: critical 
                    Certificate Sign, CRL Sign 
                X509v3 Basic Constraints: critical 
                    CA:TRUE 
                X509v3 Subject Key Identifier: 
                    <SUBJECT-KEY-IDENTIFIER> 
        Signature Algorithm: sha256WithRSAEncryption 
    [Signature] 
    
  • 默认情况下,名为 azure-iot-operations-aio-certificate-issuerazure-iot-operations namespace 中已配置了颁发者。 它用作 IoT 操作的所有 TLS 服务器证书的通用颁发者。 MQTT 代理使用从自签名颁发者签名的同一 CA 证书创建的证书颁发者为端口 18883 上的默认 TLS 侦听器颁发 TLS 服务器证书。 可以使用以下命令检查颁发者:

    kubectl get clusterissuer azure-iot-operations-aio-certificate-issuer -o yaml
    
    apiVersion: cert-manager.io/v1 
    kind: ClusterIssuer 
    metadata: 
      creationTimestamp: "2024-09-18T20:42:17Z" 
      generation: 1 
      name: azure-iot-operations-aio-certificate-issuer 
      resourceVersion: "36665" 
      uid: 592700a6-95e0-4788-99e4-ea93934bd330 
    spec: 
      ca: 
        secretName: azure-iot-operations-aio-ca-certificate 
    status: 
      conditions: 
      - lastTransitionTime: "2024-09-18T20:42:22Z" 
        message: Signing CA verified 
        observedGeneration: 1 
        reason: KeyPairVerified 
        status: "True" 
        type: Ready 
    

自带颁发者

对于生产部署,我们建议使用企业 PKI 设置 Azure IoT 操作来管理证书,并且将自己的颁发者与企业 PKI 配合使用,而不是使用默认自签名颁发者颁发 TLS 证书进行内部通信。

若要使用自己的颁发者设置 Azure IoT 操作,请在将实例部署到群集之前按照以下步骤操作:

  1. 按照准备群集中的步骤设置群集。

  2. 安装 cert-manager。 cert-manager 管理 TLS 证书。

  3. 安装 trust-manager。 安装 trust manager 时,将 trust namespace 设置为 cert-manager。 例如:

    helm upgrade trust-manager jetstack/trust-manager --install --namespace cert-manager --set app.trust.namespace=cert-manager --wait
    

    trust-manager 用于将信任捆绑包分发到组件。

  4. 创建 Azure IoT 操作命名空间。

    kubectl create namespace azure-iot-operations
    
  5. 部署适用于 cert-manager 的颁发者。 有关所有受支持的颁发者的列表,请参阅 cert-manager 颁发者

    颁发者可以是 ClusterIssuerIssuer 类型。 如果使用 Issuer,则必须在 Azure IoT 操作命名空间中创建颁发者资源。

  6. 在 Azure IoT 操作命名空间中设置信任捆绑包。

    1. 若要设置信任捆绑包,请在 Azure IoT 操作命名空间中创建 ConfigMap。 将 CA 证书的公钥部分添加到 ConfigMap 中,可以自己选择键名。

    2. 获取 CA 证书的公钥部分。 获取公钥的步骤取决于所选的颁发者。

    3. 创建 ConfigMap。 例如:

      kubectl create configmap -n azure-iot-operations <YOUR_CONFIGMAP_NAME> --from-file=<CA_CERTIFICATE_FILENAME_PEM_OR_DER>
      
  7. 按照部署 Azure IoT 操作中的步骤进行部署,其中有一些变动

    1. 在准备群集时添加 --user-trust 参数。 例如:

      az iot ops init --subscription <SUBSCRIPTION_ID> --cluster <CLUSTER_NAME>  -g <RESOURCE_GROUP> --user-trust
      
    2. 在部署 Azure IoT 操作时添加具有必要信息的 --trust-settings 参数。 例如:

    az iot ops create --subscription <SUBSCRIPTION_ID> -g <RESOURCE_GROUP> --cluster <CLUSTER_NAME> --custom-location <CUSTOM_LOCATION> -n <INSTANCE_NAME> --sr-resource-id <SCHEMAREGISTRY_RESOURCE_ID> --trust-settings configMapName=<CONFIGMAP_NAME> configMapKey=<CONFIGMAP_KEY_WITH_PUBLICKEY_VALUE> issuerKind=<CLUSTERISSUER_OR_ISSUER> issuerName=<ISSUER_NAME>