为使用 Web 代理的设备配置本地代理 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

为使用 Web 代理的设备配置本地代理

您可以在 Amazon IoT 设备上使用本地代理以与 Amazon IoT 安全隧道服务 API 通信。本地代理借助 WebSocket 安全连接通过安全隧道服务传输设备应用程序发送的数据。本地代理可以以 source 或者 destination 模式工作。在 source 模式中,它在启动 TCP 连接的同一设备或网络上运行。在 destination 模式下,本地代理与目标应用程序一起在远程设备上运行。有关更多信息,请参阅 本地代理

本地代理需要直接连接到互联网才能使用 Amazon IoT 安全隧道。对于具有安全隧道服务的长期 TCP 连接,本地代理服务器会升级 HTTPS 请求,以建立 WebSockets 与安全隧道设备连接端点之一的连接。

如果您的设备位于使用 Web 代理的网络中,Web 代理可以在将连接转发到互联网之前拦截它们。要建立与安全隧道设备连接端点的长期连接,请将本地代理配置为使用 Web 代理,如 Websocket 规范中所述。

注意

Amazon IoT Device Client 不支持使用 Web 代理的设备。要使用 Web 代理,您需要使用本地代理并将其配置为使用 Web 代理,如下所述。

以下步骤显示了本地代理如何与 Web 代理协同工作。

  1. 本地代理发送一个 HTTP CONNECT 请求发送到包含安全隧道服务远程地址的 Web 代理服务,同时发布的还有 Web 代理身份验证信息。

  2. 然后,Web 代理将创建到远程安全隧道端点的长期连接。

  3. TCP 连接已建立,并且本地代理现在将在源模式和目标模式下工作以进行数据传输。

要完成本流程,请执行以下步骤。

构建本地代理

在 GitHub 中打开本地代理源代码,然后按照构建和安装本地代理的说明进行操作。

配置 Web 代理

本地代理依赖于 HTTP 隧道机制,如 HTTP/1.1 规范中所述。为了符合规范,您的 Web 代理必须允许设备使用 CONNECT 方法。

如何配置 Web 代理取决于您使用的 Web 代理和 Web 代理版本。要确保正确配置 Web 代理,请检查 Web 代理的文档。

要配置 Web 代理,请首先确定 Web 代理 URL 并确认 Web 代理是否支持 HTTP 隧道。稍后在配置和启动本地代理时,将使用 Web 代理 URL。

  1. 识别您的 Web 代理 URL

    您的 Web 代理 URL 采用以下格式。

    protocol://web_proxy_host_domain:web_proxy_port

    Amazon IoT 安全隧道仅支持 Web 代理的基本身份验证。要使用基本身份验证,您必须指定 usernamepassword 作为 Web 代理 URL 的一部分。Web 代理 URL 采用以下格式。

    protocol://username:password@web_proxy_host_domain:web_proxy_port
    • 协议可以是 http 或者 https。建议使用 https

    • web_proxy_host_domain 是 Web 代理的 IP 地址或解析为 Web 代理 IP 地址的 DNS 名称。

    • web_proxy_port 是 Web 代理正在侦听的端口。

    • Web 代理使用此 usernamepassword 来验证请求。

  2. 测试您的 Web 代理 URL

    要确认您的 Web 代理是否支持 TCP 隧道,请使用 curl 命令,并确保您获得 2xx3xx 响应。

    例如,如果您的 Web 代理 URL 是 https://server.com:1235,请使用 proxy-insecure 标记与 curl 命令,因为 Web 代理可能依赖于自签名证书。

    export HTTPS_PROXY=https://server.com:1235 curl -I https://aws.amazon.com --proxy-insecure

    如果您的 Web 代理 URL 具有 http 端口(例如,http://server.com:1234),您不一定要使用 proxy-insecure 标记。

    export HTTPS_PROXY=http://server.com:1234 curl -I https://aws.amazon.com

配置和启动本地代理

要配置本地代理以使用 Web 代理,您必须以 DNS 域名或 Web 代理所用的 IP 地址和端口号码来配置 HTTPS_PROXY 环境变量。

配置了本地代理后,您可以使用本地代理,如本自述文件文档所述。

注意

环境变量声明区分大小写。我们建议您使用全部大写或全部小写字母定义每个变量一次。以下示例显示了全部使用大写字母的环境变量名称。如果同时使用大写字母和小写字母指定相同的变量,则使用小写字母指定的变量优先。

以下命令说明如何将目标上运行的本地代理配置为使用 Web 代理并启动本地代理。

  • AWSIOT_TUNNEL_ACCESS_TOKEN:此变量保存目标的客户端访问令牌 (CAT)。

  • HTTPS_PROXY:此变量保存用于配置本地代理的 Web 代理 URL 或 IP 地址。

以下示例中显示的命令取决于您使用的操作系统以及 Web 代理侦听的是 HTTP 端口还是 HTTPS 端口。

Web 代理侦听 HTTP 端口

如果您的 Web 代理正在侦听 HTTP 端口,您可以为 HTTPS_PROXY 变量提供 Web 代理 URL 或 IP 地址。

Linux/macOS

在 Linux 或 macOS 中,在终端中运行以下命令,以配置和启动目标上的本地代理,使用侦听 HTTP 端口的 Web 代理。

export AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token} export HTTPS_PROXY=http:proxy.example.com:1234 ./localproxy -r us-east-1 -d 22

如果您必须使用代理进行身份验证,则必须指定 usernamepassword 作为 HTTPS_PROXY 变量的一部分。

export AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token} export HTTPS_PROXY=http://username:password@proxy.example.com:1234 ./localproxy -r us-east-1 -d 22
Windows

在 Windows 中,您可以配置本地代理,操作类似于 Linux 或 macOS 的配置,但是如何定义环境变量则与其他平台不同。在 cmd 窗口中运行以下命令以配置和启动目标上的本地代理,以使用侦听 HTTP 端口的 Web 代理。

set AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token} set HTTPS_PROXY=http://proxy.example.com:1234 .\localproxy -r us-east-1 -d 22

如果您必须使用代理进行身份验证,则必须指定 usernamepassword 作为 HTTPS_PROXY 变量的一部分。

set AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token} set HTTPS_PROXY=http://username:password@10.15.20.25:1234 .\localproxy -r us-east-1 -d 22

侦听 HTTPS 端口的 Web 代理

如果您的 Web 代理正在侦听 HTTPS 端口,请运行以下命令。

注意

如果您正在为 Web 代理使用自签名证书,或者如果您在没有本机 OpenSSL 支持和默认配置的操作系统上运行本地代理,则必须按 GitHub 库中证书设置部分所述设置您的 Web 代理证书。

以下命令看起来与您为 HTTP 代理配置 Web 代理的方式相似,但您还需要指定您安装的证书文件的路径,如前所述。

Linux/macOS

在 Linux 或 macOS 中,在终端中运行以下命令,以配置目标上运行的本地代理,使其使用侦听 HTTPS 端口的 Web 代理。

export AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token} export HTTPS_PROXY=http:proxy.example.com:1234 ./localproxy -r us-east-1 -d 22 -c /path/to/certs

如果您必须使用代理进行身份验证,则必须指定 usernamepassword 作为 HTTPS_PROXY 变量的一部分。

export AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token} export HTTPS_PROXY=http://username:password@proxy.example.com:1234 ./localproxy -r us-east-1 -d 22 -c /path/to/certs
Windows

在 Windows 中,在 cmd 窗口中运行以下命令以配置和启动目标上运行的本地代理,以使用侦听 HTTP 端口的 Web 代理。

set AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token} set HTTPS_PROXY=http://proxy.example.com:1234 .\localproxy -r us-east-1 -d 22 -c \path\to\certs

如果您必须使用代理进行身份验证,则必须指定 usernamepassword 作为 HTTPS_PROXY 变量的一部分。

set AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token} set HTTPS_PROXY=http://username:password@10.15.20.25:1234 .\localproxy -r us-east-1 -d 22 -c \path\to\certs

命令和输出示例

下面显示了在 Linux 操作系统上运行的命令示例以及相应的输出。该示例显示了正在侦听 HTTP 端口的 Web 代理,以及如何在 sourcedestination 模式下使用 Web 代理配置本地代理。在运行这些命令之前,您必须已打开隧道并获得源和目标的客户端访问令牌。您还必须已构建本地代理并按照前面所述配置 Web 代理。

以下是启动本地代理后的步骤概览。本地代理:

  • 标识 Web 代理 URL,以便它可以使用 URL 连接到代理服务器。

  • 建立与 Web 代理的 TCP 连接。

  • 发送 HTTP CONNECT 请求到 Web 代理,并等待 HTTP/1.1 200 响应,这表示连接已建立。

  • 将 HTTPS 协议升级到 WebSockets 以建立长期连接。

  • 开始通过与安全隧道设备端点的连接进行数据传输。

注意

示例中使用的以下命令使用 verbosity 标志来说明运行本地代理后先前描述的不同步骤概览。建议您仅将此标记用于测试。

在源模式下运行本地代理

以下命令显示如何在源模式下运行本地代理。

export AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token} export HTTPS_PROXY=http:username:password@10.15.10.25:1234 ./localproxy -s 5555 -v 5 -r us-west-2

以下显示了在 source 模式下运行本地代理的示例输出。

... Parsed basic auth credentials for the URL Found Web proxy information in the environment variables, will use it to connect via the proxy. ... Starting proxy in source mode Attempting to establish web socket connection with endpoint wss://data.tunneling.iot.us-west-2.amazonaws.com:443 Resolved Web proxy IP: 10.10.0.11 Connected successfully with Web Proxy Successfully sent HTTP CONNECT to the Web proxy Full response from the Web proxy: HTTP/1.1 200 Connection established TCP tunnel established successfully Connected successfully with proxy server Successfully completed SSL handshake with proxy server Web socket session ID: 0a109afffee745f5-00001341-000b8138-cc6c878d80e8adb0-f186064b Web socket subprotocol selected: aws.iot.securetunneling-2.0 Successfully established websocket connection with proxy server: wss://data.tunneling.iot.us-west-2.amazonaws.com:443 Seting up web socket pings for every 5000 milliseconds Scheduled next read: ... Starting web socket read loop continue reading... Resolved bind IP: 127.0.0.1 Listening for new connection on port 5555

在目标模式下运行本地代理

以下命令显示如何在目标模式下运行本地代理。

export AWSIOT_TUNNEL_ACCESS_TOKEN=${access_token} export HTTPS_PROXY=http:username:password@10.15.10.25:1234 ./localproxy -d 22 -v 5 -r us-west-2

以下显示了在 destination 模式下运行本地代理的示例输出。

... Parsed basic auth credentials for the URL Found Web proxy information in the environment variables, will use it to connect via the proxy. ... Starting proxy in destination mode Attempting to establish web socket connection with endpoint wss://data.tunneling.iot.us-west-2.amazonaws.com:443 Resolved Web proxy IP: 10.10.0.1 Connected successfully with Web Proxy Successfully sent HTTP CONNECT to the Web proxy Full response from the Web proxy: HTTP/1.1 200 Connection established TCP tunnel established successfully Connected successfully with proxy server Successfully completed SSL handshake with proxy server Web socket session ID: 06717bfffed3fd05-00001355-000b8315-da3109a85da804dd-24c3d10d Web socket subprotocol selected: aws.iot.securetunneling-2.0 Successfully established websocket connection with proxy server: wss://data.tunneling.iot.us-west-2.amazonaws.com:443 Seting up web socket pings for every 5000 milliseconds Scheduled next read: ... Starting web socket read loop continue reading...