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

为 Azure IoT OPC UA Broker 预览版配置 OPC UA 证书基础结构

重要

Azure IoT 操作预览版(由 Azure Arc 启用)当前处于预览状态。 不应在生产环境中使用此预览版软件。

有关 beta 版本、预览版或尚未正式发布的版本的 Azure 功能所适用的法律条款,请参阅 Microsoft Azure 预览版的补充使用条款

本文介绍如何为 Azure IoT OPC UA Broker 配置 OPC UA 证书基础结构。 通过此配置,可以确定信任安全地与哪些 OPC UA 服务器建立会话。

根据 OPC UA 规范,OPC UA Broker 在与 OPC UA 服务器建立安全通信时充当单个 OPC UA 应用程序。 Azure IoT OPC UA Broker 为其向 OPC UA 服务器开放的所有安全通道使用相同的应用程序实例证书。

若要了解详细信息,请参阅适用于 Azure IoT OPC UA Broker 预览版的 OPC UA 证书基础结构

先决条件

Azure IoT 操作预览版的已部署实例。 若要部署 Azure IoT 操作以进行演示和探索,请参阅快速入门:将 Azure IoT 操作部署到已启用 Arc 的 Kubernetes 群集

配置自签名应用程序实例证书

OPC UA Broker 的默认部署会安装证书管理器所需的所有资源,以创建符合 OPC UA 的自签名证书。 此证书存储在 aio-opc-opcuabroker-default-application-cert 机密中。 此机密将映射到所有 OPC UA 连接器 Pod,并充当 OPC UA 客户端应用程序实例证书。 cert-manager 处理此应用程序实例证书的自动续订。

此配置通常足以在演示或探索环境中实现 OPC UA 服务器和 OPC UA Broker 之间的合规和安全通信。 对于生产环境,请在部署中使用企业级应用程序实例证书。

配置受信任的证书列表

若要连接到资产,首先需要建立应用程序身份验证相互信任。 对于 OPC UA Broker,请完成以下步骤:

  1. 获取 OPC UA 服务器应用程序的实例证书作为文件。 这些文件的扩展名通常为 .der 或 .crt。 这只是公钥。

    提示

    通常,OPC UA 服务器具有一个接口,可用于导出其应用程序实例证书。 此接口不标准化。 对于 KEPServerEx 等服务器,有一个基于 Windows 的配置 UI 用于证书管理。 其他服务器可能具有 Web 界面或使用操作系统文件夹来存储证书。 请参阅服务器的用户手册,了解如何导出应用程序实例证书。 获得证书后,请确保它是 DER 或 PEM 编码的。 通常存储在扩展名为 .der 或 .crt 的文件中。 如果证书不是其中一种文件格式,请使用 openssl 等工具将证书转换为所需的格式。

  2. 将 OPC UA 服务器的应用程序实例证书作为机密保存在 Azure Key Vault 中。

    对于 ./my-server.der 等文件中的 DER 编码证书,请运行以下命令:

    # Upload my-server.der OPC UA Server's certificate as secret to Azure Key Vault
    az keyvault secret set \
      --name "my-server-der" \
      --vault-name <your-azure-key-vault-name> \
      --file ./my-server.der \
      --encoding hex \
      --content-type application/pkix-cert
    

    对于 ./my-server.crt 等文件中的 PEM 编码证书,请运行以下命令:

    # Upload my-server.crt OPC UA Server's certificate as secret to Azure Key Vault
    az keyvault secret set \
      --name "my-server-crt" \
      --vault-name <your-azure-key-vault-name> \
      --file ./my-server.crt \
      --encoding hex \
      --content-type application/x-pem-file
    
  3. 在群集中配置 aio-opc-ua-broker-trust-list 自定义资源。 使用 Kubernetes 客户端(例如 kubectl)在群集中的 SecretProviderClass 对象数组中配置机密(例如 my-server-dermy-server-crt)。

    以下示例演示了一个完整的 SecretProviderClass 自定义资源,其中包含 DER 编码文件中受信任的 OPC UA 服务器证书:

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: aio-opc-ua-broker-trust-list
      namespace: azure-iot-operations
    spec:
      provider: azure
      parameters:
        usePodIdentity: 'false'
        keyvaultName: <your-azure-key-vault-name>
        tenantId: <your-azure-tenant-id>
        objects: |
          array:
            - |
              objectName: my-server-der
              objectType: secret
              objectAlias: my-server.der
              objectEncoding: hex
    

    以下示例演示了一个完整的 SecretProviderClass 自定义资源,其中包含扩展名为 .crt 的 PEM 编码文件中受信任的 OPC UA 服务器证书:

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: aio-opc-ua-broker-trust-list
      namespace: azure-iot-operations
    spec:
      provider: azure
      parameters:
        usePodIdentity: 'false'
        keyvaultName: <your-azure-key-vault-name>
        tenantId: <your-azure-tenant-id>
        objects: |
          array:
            - |
              objectName: my-server-crt
              objectType: secret
              objectAlias: my-server.crt
              objectEncoding: hex
    

    注意

    将 Azure Key Vault 证书投影到群集所需的时间取决于配置的轮询间隔。

如果 OPC UA 服务器使用证书颁发机构 (CA) 颁发的证书,则可以通过将其公钥证书添加到 OPC UA Broker 受信任证书列表来信任 CA。 现在,OPC UA Broker 实例会自动信任使用 CA 颁发的有效证书的所有服务器。 因此,无需将 OPC UA 服务器的证书显式添加到 OPC UA Broker 的受信任证书列表中。

若要信任 CA,请完成以下步骤:

  1. 获取以 DER 或 PEM 格式编码的 CA 证书公钥。 这些证书通常存储在扩展名为 .der 或 .crt 的文件中。 获取 CA 的证书吊销列表 (CRL)。 此列表通常位于一个扩展名为 .crl 的文件中。 有关详细信息,请查看 OPC UA 服务器的文档。

  2. 将 Azure Key Vault 中的 CA 证书和 CRL 作为机密保存。

    对于 ./my-server-ca.der 等文件中的 DER 编码证书,请运行以下命令:

    # Upload CA certificate as secret to Azure Key Vault
    az keyvault secret set \
      --name "my-server-ca-der" \
      --vault-name <your-azure-key-vault-name> \
      --file ./my-server-ca.der \
      --encoding hex \
      --content-type application/pkix-cert
    
    # Upload the CRL as secret to Azure Key Vault
    az keyvault secret set \
      --name "my-server-crl" \
      --vault-name <your-azure-key-vault-name> \
      --file ./my-server-ca.crl \
      --encoding hex \
      --content-type application/pkix-crl
    

    对于 ./my-server-ca.crt 等文件中的 PEM 编码证书,请运行以下命令:

    # Upload CA certificate as secret to Azure Key Vault
    az keyvault secret set \
      --name "my-server-ca-crt" \
      --vault-name <your-azure-key-vault-name> \
      --file ./my-server-ca.crt \
      --encoding hex \
      --content-type application/x-pem-file
    
    # Upload the CRL as secret to Azure Key Vault
    az keyvault secret set \
      --name "my-server-crl" \
      --vault-name <your-azure-key-vault-name> \
      --file ./my-server-ca.crl \
      --encoding hex \
      --content-type application/pkix-crl
    
  3. 在群集中配置 aio-opc-ua-broker-trust-list 自定义资源。 使用 Kubernetes 客户端(例如 kubectl)在群集中的 SecretProviderClass 对象数组中配置机密(例如 my-server-ca-dermy-server-ca-crt)。

    以下示例演示了一个完整的 SecretProviderClass 自定义资源,其中包含 DER 编码文件中受信任的 OPC UA 服务器证书:

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: aio-opc-ua-broker-trust-list
      namespace: azure-iot-operations
    spec:
      provider: azure
      parameters:
        usePodIdentity: 'false'
        keyvaultName: <your-azure-key-vault-name>
        tenantId: <your-azure-tenant-id>
        objects: |
          array:
            - |
              objectName: my-server-ca-der
              objectType: secret
              objectAlias: my-server-ca.der
              objectEncoding: hex
            - |
              objectName: my-server-ca-crl
              objectType: secret
              objectAlias: my-server-ca.crl
              objectEncoding: hex
    

    以下示例演示了一个完整的 SecretProviderClass 自定义资源,其中包含扩展名为 .crt 的 PEM 编码文件中受信任的 OPC UA 服务器证书:

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: aio-opc-ua-broker-trust-list
      namespace: azure-iot-operations
    spec:
      provider: azure
      parameters:
        usePodIdentity: 'false'
        keyvaultName: <your-azure-key-vault-name>
        tenantId: <your-azure-tenant-id>
        objects: |
          array:
            - |
              objectName: my-server-ca-crt
              objectType: secret
              objectAlias: my-server-ca.crt
              objectEncoding: hex
            - |
              objectName: my-server-ca-crl
              objectType: secret
              objectAlias: my-server-ca.crl
              objectEncoding: hex
    

    注意

    将 Azure Key Vault 证书投影到群集所需的时间取决于配置的轮询间隔。

配置颁发者证书列表

如果 OPC UA 服务器使用证书颁发机构 (CA) 颁发的证书,但不想信任 CA 颁发的所有证书,请完成以下步骤:

  1. 按照上一部分中的前三个步骤信任 OPC UA 服务器的应用程序实例证书。

  2. 除了证书本身,OPC UA Broker 还需要 CA 证书来正确验证 OPC UA 服务器的证书的颁发者链。 将 CA 证书及其证书吊销列表 (CRL) 添加到名为 aio-opc-ua-broker-issuer-list 的单独列表中。

    1. 将 Azure Key Vault 中的 CA 证书和 CRL 作为机密保存。

      对于 ./my-server-ca.der 等文件中的 DER 编码证书,请运行以下命令:

      # Upload CA certificate as secret to Azure Key Vault
      az keyvault secret set \
        --name "my-server-ca-der" \
        --vault-name <your-azure-key-vault-name> \
        --file ./my-server-ca.der \
        --encoding hex \
        --content-type application/pkix-cert
      
      # Upload the CRL as secret to Azure Key Vault
      az keyvault secret set \
        --name "my-server-crl" \
        --vault-name <your-azure-key-vault-name> \
        --file ./my-server-ca.crl \
        --encoding hex \
        --content-type application/pkix-crl
      

      对于 ./my-server-ca.crt 等文件中的 PEM 编码证书,请运行以下命令:

      # Upload CA certificate as secret to Azure Key Vault
      az keyvault secret set \
        --name "my-server-ca-crt" \
        --vault-name <your-azure-key-vault-name> \
        --file ./my-server-ca.crt \
        --encoding hex \
        --content-type application/x-pem-file
      
      # Upload the CRL as secret to Azure Key Vault
      az keyvault secret set \
        --name "my-server-crl" \
        --vault-name <your-azure-key-vault-name> \
        --file ./my-server-ca.crl \
        --encoding hex \
        --content-type application/pkix-crl
      
  3. 在群集中配置 aio-opc-ua-broker-issuer-list 自定义资源。 使用 Kubernetes 客户端(例如 kubectl)在群集中的 SecretProviderClass 对象数组中配置机密(例如 my-server-ca-dermy-server-ca-crt)。

    以下示例演示了一个完整的 SecretProviderClass 自定义资源,其中包含 DER 编码文件中受信任的 OPC UA 服务器证书:

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: aio-opc-ua-broker-issuer-list
      namespace: azure-iot-operations
    spec:
      provider: azure
      parameters:
        usePodIdentity: 'false'
        keyvaultName: <your-azure-key-vault-name>
        tenantId: <your-azure-tenant-id>
        objects: |
          array:
            - |
              objectName: my-server-ca-der
              objectType: secret
              objectAlias: my-server-ca.der
              objectEncoding: hex
            - |
              objectName: my-server-ca-crl
              objectType: secret
              objectAlias: my-server-ca.crl
              objectEncoding: hex
    

    以下示例演示了一个完整的 SecretProviderClass 自定义资源,其中包含扩展名为 .crt 的 PEM 编码文件中受信任的 OPC UA 服务器证书:

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: aio-opc-ua-broker-issuer-list
      namespace: azure-iot-operations
    spec:
      provider: azure
      parameters:
        usePodIdentity: 'false'
        keyvaultName: <your-azure-key-vault-name>
        tenantId: <your-azure-tenant-id>
        objects: |
          array:
            - |
              objectName: my-server-ca-crt
              objectType: secret
              objectAlias: my-server-ca.crt
              objectEncoding: hex
            - |
              objectName: my-server-ca-crl
              objectType: secret
              objectAlias: my-server-ca.crl
              objectEncoding: hex
    

    注意

    将 Azure Key Vault 证书投影到群集所需的时间取决于配置的轮询间隔。

配置 OPC UA 服务器

若要完成应用程序身份验证相互信任的配置,需要将 OPC UA 服务器配置为信任 OPC UA Broker 的应用程序实例证书:

  1. 若要将 OPC UA Broker 的证书提取到 opcuabroker.crt 文件中,请运行以下命令:

    kubectl -n azure-iot-operations get secret aio-opc-opcuabroker-default-application-cert -o jsonpath='{.data.tls\.crt}' | base64 -d > opcuabroker.crt
    

    在 PowerShell 中,可以使用以下命令完成相同的任务:

    kubectl -n azure-iot-operations get secret aio-opc-opcuabroker-default-application-cert -o jsonpath='{.data.tls\.crt}' | %{ [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($_)) } > opcuabroker.crt
    
  2. 许多 OPC UA 服务器仅支持 DER 格式的证书。 如有必要,请使用以下命令将 opcuabroker.crt 证书转换为 opcuabroker.der

    openssl x509 -outform der -in opcuabroker.crt -out opcuabroker.der
    
  3. 请参阅 OPC UA 服务器的文档,了解如何将 opcuabroker.crtopcuabroker.der 证书文件添加到服务器的受信任证书列表中。

配置企业级应用程序实例证书

对于生产环境,可以将 OPC UA Broker 配置为使用企业级应用程序实例证书。 通常,企业证书颁发机构 (CA) 会颁发此证书,并且你需要将 CA 证书用于自己的配置。 通常,CA 有一个层次结构,需要将 CA 的完整验证链添加到配置中。

以下示例引用以下项:

说明
opcuabroker-certificate.der 包含企业级应用程序实例证书公钥的文件。
opcuabroker-certificate.pem 包含企业级应用程序实例证书私钥的文件。
subjectName 嵌入在应用程序实例证书中的使用者名称字符串。
applicationUri 嵌入在应用程序实例中的应用程序实例 URI。
enterprise-grade-ca-1.der 包含企业级 CA 证书公钥的文件。
enterprise-grade-ca-1.crl CA 的证书吊销列表 (CRL) 文件。

与前面的示例一样,使用 Azure Key Vault 来存储证书和 CRL。 然后,在连接的群集中配置 SecretProviderClass 自定义资源,将证书和 CRL 投影到 OPC UA Broker Pod 中。 若要配置企业级应用程序实例证书,请完成以下步骤:

  1. 使用以下命令将证书和 CRL 作为机密保存在 Azure Key Vault 中:

     # Upload OPC UA Broker public key certificate as secret to Azure Key Vault
     az keyvault secret set \
       --name "opcuabroker-certificate-der" \
       --vault-name <your-azure-key-vault-name> \
       --file ./opcuabroker-certificate.der \
       --encoding hex \
       --content-type application/pkix-cert
    
     # Upload OPC UA Broker private key certificate as secret to Azure Key Vault
     az keyvault secret set \
       --name "opcuabroker-certificate-pem" \
       --vault-name <your-azure-key-vault-name> \
       --file ./opcuabroker-certificate.pem \
       --encoding hex \
       --content-type application/x-pem-file
    
     # Upload CA public key certificate as secret to Azure Key Vault
     az keyvault secret set \
       --name "enterprise-grade-ca-1-der" \
       --vault-name <your-azure-key-vault-name> \
       --file ./enterprise-grade-ca-1.der \
       --encoding hex \
       --content-type application/pkix-cert
    
     # Upload CA certificate revocation list as secret to Azure Key Vault
     az keyvault secret set \
       --name "enterprise-grade-ca-1-crl" \
       --vault-name <your-azure-key-vault-name> \
       --file ./enterprise-grade-ca-1.crl \
       --encoding hex \
       --content-type application/pkix-crl
    
  2. 在群集中配置 aio-opc-ua-broker-client-certificate 自定义资源。 使用 Kubernetes 客户端(例如 kubectl)在群集中的 SecretProviderClass 对象数组中配置机密 opcuabroker-certificate-deropcuabroker-certificate-pem

    以下示例显示了添加机密配置后的完整 SecretProviderClass 自定义资源:

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: aio-opc-ua-broker-client-certificate
      namespace: azure-iot-operations
    spec:
      provider: azure
      parameters:
        usePodIdentity: 'false'
        keyvaultName: <your-azure-key-vault-name>
        tenantId: <your-azure-tenant-id>
        objects: |
          array:
            - |
              objectName: opcuabroker-certificate-der
              objectType: secret
              objectAlias: opcuabroker-certificate.der
              objectEncoding: hex
            - |
              objectName: opcuabroker-certificate-pem
              objectType: secret
              objectAlias: opcuabroker-certificate.pem
              objectEncoding: hex
    
  3. 如果使用 CA 颁发 OPC UA 服务器的证书,请在群集中配置 aio-opc-ua-broker-issuer-list 自定义资源。 使用 Kubernetes 客户端(例如 kubectl)在群集中的 SecretProviderClass 对象数组中配置机密 enterprise-grade-ca-1-derenterprise-grade-ca-1-crl

    以下示例显示了添加机密配置后的完整 SecretProviderClass 自定义资源:

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: aio-opc-ua-broker-issuer-list
      namespace: azure-iot-operations
    spec:
      provider: azure
      parameters:
        usePodIdentity: 'false'
        keyvaultName: <your-azure-key-vault-name>
        tenantId: <your-azure-tenant-id>
        objects: |
          array:
            - |
              objectName: enterprise-grade-ca-1-der
              objectType: secret
              objectAlias: enterprise-grade-ca-1.der
              objectEncoding: hex
            - |
              objectName: enterprise-grade-ca-1-crl
              objectType: secret
              objectAlias: enterprise-grade-ca-1.crl
              objectEncoding: hex
    
  4. 使用以下命令更新 OPC UA Broker 部署,以将新的 SecretProviderClass 源用于应用程序实例证书:

    az k8s-extension update \
        --version 0.3.0-preview \
        --name opc-ua-broker \
        --release-train preview \
        --cluster-name <cluster-name> \
        --resource-group <azure-resource-group> \
        --cluster-type connectedClusters \
        --auto-upgrade-minor-version false \
        --config securityPki.applicationCert=aio-opc-ua-broker-client-certificate \
        --config securityPki.subjectName=<subjectName> \
        --config securityPki.applicationUri=<applicationUri>
    

现在,OPC UA Broker 使用企业证书,不要忘记将新证书的公钥添加到它需要连接到的所有 OPC UA 服务器的受信任证书列表中。