

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 將應用程式連接到 AWS IoT SiteWise Edge 上的 EMQX 代理程式
<a name="connect-app-to-broker"></a>

EMQX 代理程式在連接埠 8883 上使用 Transport Layer Security (TLS) 來加密所有通訊，確保您的資料在傳輸期間仍受到保護。本節會逐步解說在應用程式與 EMQX 代理程式之間建立連線的步驟。遵循這些步驟有助於維護工業資料的完整性和機密性。連線程序涉及兩種主要方法：透過 元件使用自動 IP 探索，或在 TLS 憑證中手動將 DNS 名稱和 IP 地址設定為主體別名 (SANs)。每個方法都有自己的優勢，取決於您的網路設定和安全需求。本文件將引導您完成這兩個選項。

**Topics**
+ [設定 TLS 以安全連線至 AWS IoT SiteWise Edge 上的 EMQX 代理程式](#configure-tls-emqx-broker)
+ [在 AWS IoT SiteWise Edge 上測試 EMQX 代理程式連線](#test-emqx-connection)
+ [使用您自己的 CA](#configure-tls-custom-ca)
+ [為外部防火牆連線開啟連接埠 8883](#emqx-firewall)

## 設定 TLS 以安全連線至 AWS IoT SiteWise Edge 上的 EMQX 代理程式
<a name="configure-tls-emqx-broker"></a>

根據預設， 會為核心裝置憑證授權單位 (CA) 簽署的 EMQX 代理程式 AWS IoT Greengrass 產生 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`。

### 將自訂 DNS 名稱/IP 地址新增至 TLS 伺服器憑證
<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 地址手動新增為 TLS 憑證的主體別名 (SANs)。當您為閘道主機設定 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 核心裝置** URL。核心裝置的頁面隨即出現。

1. 選擇**用戶端裝置**索引標籤。

1. 選擇**管理端點**。

1. 在管理端點對話方塊中，輸入 DNS 名稱和您要新增為 SANs的任何 IP 地址 (SAN)。使用連接埠 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 清單中。

------

## 在 AWS IoT SiteWise Edge 上測試 EMQX 代理程式連線
<a name="test-emqx-connection"></a>

使用 TLS 憑證和身分驗證憑證設定 EMQX 代理程式後，請務必確認您的設定是否正常運作。測試連線有助於確保您的安全組態已正確實作，而且用戶端可以成功建立與代理程式的加密連線。本節示範如何使用 Mosquitto 命令列界面 (CLI) 用戶端測試您的代理程式連線，這是一種廣泛使用的 MQTT 用戶端工具，支援 TLS 加密和身分驗證。

### 使用 Mosquitto CLI 用戶端來測試 EMQX 代理程式連線
<a name="test-emqx-connection-mosquitto"></a>

在此步驟中，我們將使用 mosquitto CLI 用戶端來測試我們的設定，並確保我們可以使用先前建立的使用者名稱和密碼成功連線到代理程式。若要取得步驟 3：設定 TLS 下的`BrokerCoreDeviceCA.pem`下列步驟。

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

**注意**  
如果您連線的主機名稱/IP 地址與您傳遞給用戶端的 CA 憑證上的主體別名 (SAN) 不相符，您可能會收到 SSL：驗證錯誤。請參閱「將自訂 DNS 名稱/IP 地址新增至 TLS 伺服器憑證」的步驟 3：設定 TLS，了解如何取得具有正確 SAN 的憑證。

此時，所有使用者都有權發佈和訂閱代理程式上的所有主題。繼續執行「[在 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。您可以根據您的網路組態來設定，以允許從外部應用程式到代理程式的連線。

------