

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将应用程序连接到 Edge 上的 EMQX 代理 AWS IoT SiteWise
<a name="connect-app-to-broker"></a>

EMQX 代理在端口 8883 上使用传输层安全 (TLS) 来加密所有通信，确保您的数据在传输过程中受到保护。本节将引导您完成在应用程序和 EMQX 代理之间建立连接的步骤。遵循这些步骤有助于维护工业数据的完整性和机密性。连接过程包括两种主要方法：通过组件使用自动 IP 发现，或者在 TLS 证书中手动将 DNS 名称和 IP 地址配置为主题备用名称 (SANs)。每种方法都有其自身的优势，具体取决于您的网络设置和安全要求。本文档将指导您完成这两个选项。

**Topics**
+ [配置 TLS 以实现与 Edge 上的 EMQX 代理的安全连接 AWS IoT SiteWise](#configure-tls-emqx-broker)
+ [在 Edge 上测试 EMQX 代理连接 AWS IoT SiteWise](#test-emqx-connection)
+ [使用你自己的 CA](#configure-tls-custom-ca)
+ [为外部防火墙连接打开 8883 端口](#emqx-firewall)

## 配置 TLS 以实现与 Edge 上的 EMQX 代理的安全连接 AWS IoT SiteWise
<a name="configure-tls-emqx-broker"></a>

默认情况下，为 EMQX 代理 AWS IoT Greengrass 生成由核心设备证书颁发机构 (CA) 签名的 TLS 服务器证书。有关更多信息，请参阅使用 [MQTT 代理将客户端设备连接到 AWS IoT Greengrass 核心设备](https://docs.aws.amazon.com/greengrass/v2/developerguide/connecting-to-mqtt.html)。

### 检索 TLS 证书
<a name="configure-tls-retrieve-certificate"></a>

要获取 CA 证书，请在网关主机上运行以下命令：

------
#### [ Linux ]

在网关主机上的 shell 会话中运行以下命令：

```
/greengrass/v2/bin/swe-emqx-cli cert
```

此命令显示证书位置并打印证书的内容。

您也可以使用以下命令将证书保存到文件中：

```
/greengrass/v2/bin/swe-emqx-cli cert --output /path/to/certificate.pem
```

------
#### [ Windows ]

在网关主机的 PowerShell 会话中运行以下命令：

```
C:\greengrass\v2\bin\swe-emqx-cli.ps1 cert
```

此命令显示证书位置并打印证书的内容。

您也可以使用以下命令将证书保存到文件中：

```
C:\greengrass\v2\bin\swe-emqx-cli.ps1 cert --output C:\path\to\certificate.pem
```

无论您的系统上的确切路径如何，CLI 都会自动找到证书。

------

将 ca.pem 文件的内容复制到要连接到代理的外部应用程序中。将其保存为 `BrokerCoreDeviceCA.pem`。

### 向 TLS 服务器证书添加自定义 DNS names/IP 地址
<a name="configure-tls-custom-dns-ip"></a>

由生成的证书上的主题备用名称 (SAN) AWS IoT Greengrass 是`localhost`。从网关主机外部建立 TLS 连接时，TLS 验证步骤会失败，因为代理的主机名与服务器证书`localhost`上的主机名不匹配。

为了解决主机名不匹配的问题， AWS IoT Greengrass 提供了两种管理核心设备端点的方法。本节涵盖这两个选项。有关更多详细信息，请参阅《*AWS IoT Greengrass Version 2 开发人员指南》*中的[管理核心设备端点](https://docs.aws.amazon.com/greengrass/v2/developerguide/manage-core-device-endpoints.html)。
+ 要使用核心设备的 IP 地址连接到 EMQX 代理，请使用自动 IP 发现部分。
+ 要使用 DNS 名称而不是 IP 地址连接到 EMQX 代理，请使用手动管理部分。

------
#### [ Automated IP discovery ]

此选项允许您的核心设备自动发现其 IP 地址，并将其作为主题备用名称 (SAN) 添加到代理证书中。

1. 将该`aws.greengrass.clientdevices.IPDetector`组件添加到核心设备的部署中。

1. 将更改部署到您的设备

1. 等待部署完成。

   部署完成后，您可以使用代理的 IP 地址建立安全的 TLS 连接。

   IP 地址将作为 SAN 自动添加到代理证书中。

------
#### [ Manual DNS and IP Configuration ]

您可以手动将 DNS 名称和 IP 地址作为主题备用名称 (SANs) 添加到您的 TLS 证书。当您为网关主机配置了 DNS 名称时，此方法很有用。

**重要**  
如果您正在使用该 IPDetector 组件，请在继续操作之前将其从部署中删除。该 IPDetector组件会覆盖手动端点配置。

**手动配置终端节点**

1. <a name="sitewise-open-console"></a>导航至 [AWS IoT SiteWise 控制台](https://console.aws.amazon.com/iotsitewise/)。

1. 在左侧导航栏中，选择 **Edge 部分的 **Edge** 网关**。

1. 选择要配置的网关。

1. 在 **Edge 网关配置**部分，选择您的 **Greengrass 核心设备**网址。将显示核心设备的页面。

1. 选择 “**客户端设备**” 选项卡。

1. 选择**管理端点**。

1. 在 “管理终端节点” 对话框中，输入 DNS 名称和要添加的任何 IP 地址 SANs。使用端口 8883。

1. 选择**更新**。

代理的 TLS 服务器证书会自动更新以包含您的新端点。

**使用 Linux 验证 TLS 服务器证书更新**

1. 在您的网关主机上启动 shell 会话。

   ```
   docker exec emqx openssl x509 -in ./data/cert.pem -text -noout | grep -A1 "Subject Alternative Name"
   ```

1. 该命令返回的输出类似于以下内容：

   ```
   X509v3 Subject Alternative Name: 
   DNS:endpoint_you_added, DNS:localhost
   ```

1. 验证您的终端节点是否出现在列表中 SANs。

**使用 Windows 验证 TLS 服务器证书更新**

1. 在您的网关主机上启动 shell 会话。

   ```
   (Get-PfxCertificate -FilePath "C:\greengrass\v2\work\aws.greengrass.clientdevices.mqtt.EMQX\v2\data\cert.pem").Extensions | Where-Object { $_.Oid.FriendlyName -eq "Subject Alternative Name" } | ForEach-Object { "Subject Alternative Name:", ($_.Format($true) -split "`n")[0..1] }
   ```

1. 该命令返回的输出类似于以下内容：

   ```
   Subject Alternative Name:
   DNS Name=your-endpoint
   DNS Name=localhost
   ```

1. 验证您添加的终端节点是否在列表中 SANs。

------

## 在 Edge 上测试 EMQX 代理连接 AWS IoT SiteWise
<a name="test-emqx-connection"></a>

使用 TLS 证书和身份验证凭证配置 EMQX 代理后，请务必验证您的设置是否正常运行。测试连接有助于确保您的安全配置得到正确实施，并且客户端可以成功地与代理建立加密连接。本节演示如何使用 Mosquitto 命令行接口 (CLI) 客户端（一种广泛使用的支持 TLS 加密和身份验证的 MQTT 客户端工具）测试您的代理连接。

### 使用 Mosqitto CLI 客户端测试 EMQX 代理连接
<a name="test-emqx-connection-mosquitto"></a>

在此步骤中，我们将使用 mosquitto CLI 客户端来测试我们的设置，并确保我们可以使用之前创建的用户名和密码成功连接到代理。要获取`BrokerCoreDeviceCA.pem`步骤 3：设置 TLS 下的以下步骤。

```
mosquitto_sub -h hostname|ip address \
    -p 8883 \
    -t "#" \
    -q 1 \
    -u username -P password \
    --cafile BrokerCoreDeviceCA.pem
```

**注意**  
如果您要连接 hostname/IP 的地址与您传递给客户端的 CA 证书上的主题备用名称 (SAN) 不匹配，则可能会出现 SSL: Verify 错误。有关如何使用正确的 SAN 获取证书，请参阅步骤 3：设置 TLS 下的 “向 TLS 服务器证书添加自定义 DNS names/IP 地址”。

此时，所有用户都可以发布和订阅经纪商上的所有主题。继续执行[在 EMQX 中为 AWS IoT SiteWise Edge 设置授权规则](authorization-rules-emqx-broker.md)。

## 使用你自己的 CA
<a name="configure-tls-custom-ca"></a>

AWS IoT Greengrass 概述了如何将自己的客户端设备身份验证组件配置为使用自己的证书颁发机构 (CA)。客户端设备身份验证组件（`aws.greengrass.clientdevices.Auth`）对客户端设备进行身份验证并授权客户端设备操作。有关更多信息，请参阅《*AWS IoT Greengrass Version 2 开发人员指南》*中的[使用自己的证书颁发机构](https://docs.aws.amazon.com/greengrass/v2/developerguide/connecting-to-mqtt.html#use-your-own-CA)。

要使用自己的 CA，请将该`aws.greengrass.clientdevices.Auth`组件添加到您的部署中，以便您可以指定自定义配置。

## 为外部防火墙连接打开 8883 端口
<a name="emqx-firewall"></a>

------
#### [ Linux ]

在 Linux 主机防火墙规则中，为端口 8883 添加入站规则，以允许来自网关主机外部的传入连接。如果有任何防火墙，请确保允许端口 8883 上的传入 TLS 连接。

------
#### [ Windows ]

在您的Microsoft Windows主机防火墙规则中，为端口 8883 添加入站规则，以允许来自网关主机外部的传入连接。确保该规则是允许规则，类型为端口，指定端口 8883。您可以根据自己的网络配置进行配置，以允许从外部应用程序连接到代理。

------