我希望在 IoT 项目中使用 BG96 来访问一些 API Gateway HTTPS 端点。我已经使用 AWS API Gateway 设置了一个 GET 方法,该方法在给定条目 ID 和 Lambda 函数来处理请求的情况下从 DynamoDB 表中检索条目。端点不需要 API 密钥或 AWS IAM 角色进行授权,它是开放的。
API URL: htttps://...amazonaws.com/dev/data/{id}
我可以使用 Postman 在端点上成功执行 GET 请求,但是如果我使用 Quectel BG96,我会收到 403 Forbidden 错误,并且没有任何 Lambda 函数的日志被调用,这让我觉得请求在到达 Lambda 之前就被阻止了功能。如果我使用 BG96 请求不同的 HTTPS 端点(不是我在 API Gateway 上创建的端点,例如https://www.alipay.com/),我就成功了。
成功 - 下面的示例输出适用于 HTTP 端点,但它也适用于 HTTPS 端点。
[2022-02-03 15:25:19:468_R:] +QHTTPGET: 0,200,260
[2022-02-03 15:25:19:727_S:] AT+QHTTPREAD=80
[2022-02-03 15:25:19:780_R:] AT+QHTTPREAD=80
[2022-02-03 15:25:19:780_R:] CONNECT
[2022-02-03 15:25:19:780_R:] HTTP/1.1 200 OK
[2022-02-03 15:25:19:780_R:] Date: Thu, 03 Feb 2022 04:25:19 GMT
[2022-02-03 15:25:19:780_R:] Content-Type: application/json
[2022-02-03 15:25:19:780_R:] Content-Length: 260
[2022-02-03 15:25:19:780_R:] Connection: keep-alive
[2022-02-03 15:25:19:780_R:] Server: gunicorn/19.9.0
[2022-02-03 15:25:19:780_R:] Access-Control-Allow-Origin: *
[2022-02-03 15:25:19:780_R:] Access-Control-Allow-Credentials: true
[2022-02-03 15:25:19:780_R:] {
[2022-02-03 15:25:19:780_R:] "args": {},
[2022-02-03 15:25:19:780_R:] "headers": {
[2022-02-03 15:25:19:780_R:] "Accept": "*/*",
[2022-02-03 15:25:19:780_R:] "Host": "httpbin.org",
[2022-02-03 15:25:19:780_R:] "User-Agent": "QUECTEL_MODULE",
[2022-02-03 15:25:19:780_R:] "X-Amzn-Trace-Id": "Root=1-61fb592f-4fd419b62b1b51ff0b9acb08"
[2022-02-03 15:25:19:780_R:] },
[2022-02-03 15:25:19:780_R:] "origin": "115.187.131.157",
[2022-02-03 15:25:19:780_R:] "url": "https://httpbin.org/get"
[2022-02-03 15:25:19:780_R:] }
[2022-02-03 15:25:19:780_R:] OK
[2022-02-03 15:25:19:780_R:] +QHTTPREAD: 0
失败
[2022-02-03 15:01:10:606_R:] +QHTTPGET: 0,403,23
[2022-02-03 15:01:13:912_S:] AT+QHTTPREAD=80
[2022-02-03 15:01:13:964_R:] AT+QHTTPREAD=80
[2022-02-03 15:01:13:964_R:] CONNECT
[2022-02-03 15:01:13:964_R:] HTTP/1.1 403 Forbidden
[2022-02-03 15:01:13:964_R:] Date: Thu, 03 Feb 2022 04:01:10 GMT
[2022-02-03 15:01:13:964_R:] Content-Type: application/json
[2022-02-03 15:01:13:964_R:] Content-Length: 23
[2022-02-03 15:01:13:964_R:] Connection: keep-alive
[2022-02-03 15:01:13:964_R:] x-amzn-RequestId: 92420321-1e22-4967-8b9e-22988aee1046
[2022-02-03 15:01:13:964_R:] x-amzn-ErrorType: ForbiddenException
[2022-02-03 15:01:13:964_R:] x-amz-apigw-id: M8n9FGhfSwMFdRA=
[2022-02-03 15:01:13:964_R:] {"message":"Forbidden"}
[2022-02-03 15:01:13:964_R:] OK
[2022-02-03 15:01:13:964_R:] +QHTTPREAD: 0
默认情况下,Postman 似乎使用 TLSv1.2 和 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 加密。我想知道拒绝BG96的原因是否是因为我没有正确设置安全性。以下是我用来设置 BG96 和执行 GET 请求的 AT 命令列表,请注意我正在设置 TLSv1.2 和密码 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 但也将安全级别设置为 0,这意味着不需要证书,这可能会失败:
AT+QHTTPCFG="contextid",1
AT+QHTTPCFG ="responseheader",1
AT+QIACT?
AT+QICSGP=1,1,"iot.truphone.com","","",1
AT+QIACT=1
AT+QIACT?
AT+QHTTPCFG="SSLCTXID",1
AT+QSSLCFG="SSLVERSION",1,3
AT+QSSLCFG="ciphersuite",1,0XC02F
AT+QSSLCFG="seclevel",1,0
AT+QHTTPURL=<url len in char>,<timeout in seconds>
CONNECT
<enter url>
AT+QHTTPGET=80
AT+QHTTPREAD=80
一个更好的问题可能是 API Gateway RESTful 端点默认需要什么安全性?证书总是必要的吗?