微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用证书从颤振应用程序发送 AWS iot http 请求?

如何解决如何使用证书从颤振应用程序发送 AWS iot http 请求?

我正在尝试使用 Flutter 应用程序向 AWS IoT 发布消息。

根据我尝试复制的 AWS 文档

curl --tlsv1.2 \
    --cacert Amazon-root-CA-1.pem \
    --cert device.pem.crt \
    --key private.pem.key \
    --request POST \
    --data "{ \"message\": \"Hello,world\" }" \
    "https://IoT_data_endpoint:8443/topics/topic?qos=1"

这是我尝试过的

    final List<int> trustedCertificateBytes =
        (await rootBundle.load('assets/certificates/AmazonRootCA1.pem'))
            .buffer
            .asInt8List();
    final List<int> certificateChainBytes = (await rootBundle.load(
            'assets/certificates/device.pem.crt'))
        .buffer
        .asInt8List();
    final List<int> privateKeyBytes = (await rootBundle.load(
            'assets/certificates/private.pem.key'))
        .buffer
        .asInt8List();
    final data = jsonEncode(
      <String,dynamic>{"message": "hello world"},);


    final context = SecurityContext.defaultContext;
    context.setTrustedCertificatesBytes(trustedCertificateBytes);
    context.useCertificateChainBytes(certificateChainBytes);
    context.usePrivateKeyBytes(privateKeyBytes);
    final client = HttpClient(context: context);
    final request = await client.openUrl(
        'POST',Uri.parse("https://$myEndpoint/topics/some_topic?qos=1"));
    request.write(data);

    try {
      final response = await request.close();
      print("success");
      print(response);
      response.transform(utf8.decoder).listen((contents) {
        print(contents);
      });
    } catch (e) {
      print(e);
    }

第一次调用 api 时,http 调用成功,但响应为 {"message":"Missing authentication","traceId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx"}

在每次后续调用时,Flutter 都会抛出此错误

 [ERROR:Flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: TlsException: Failure trusting builtin roots (OS Error: CERT_ALREADY_IN_HASH_TABLE(x509_lu.c:356),errno = 0)

知道如何让它工作吗?

-- 编辑部分:一个调用问题已解决添加context.setAlpnProtocols(["x-amzn-http-ca"],false); 就像魅力一样。后续调用问题依然存在。

解决方法

在这里操作。

为上下文设置alpn协议解决了身份验证令牌问题

...
context.setAlpnProtocols(["x-amzn-http-ca"],false);
...

然后我设置了一个关于证书是否已经设置的全局标志。如果已经设置,则无需再次设置。

全局范围

bool setCert = false;

功能范围

if (!setCert){
  // Set certificates & alpn protocol here
  setCert = true;
}

它解决了第二个问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。