【问题标题】:How to use PEM files in azure function using MqttNET如何使用 MqttNET 在 azure 函数中使用 PEM 文件
【发布时间】:2020-12-23 01:21:27
【问题描述】:

我希望你能在这里帮助我。 我正在尝试制作一个 MQTT 客户端(应用服务环境中的天蓝色函数),它从 MQTT 代理(hivemq)中提取数据,但在证书方面我有点迷失(我不是专家)。

无论如何,我从我们的合作伙伴(MQTT 代理那里)收到了 3 个文件(如下所示),但问题是。我应该如何在应用程序中使用这些 PEM 文件?

  • 客户端证书 == mqtt-client-cert.pem
  • 客户端密钥 == mqtt-client-key_nopass.pem
  • CA 证书 == server.pem

这是应用程序,这是我在本地(使用 crt 证书)针对测试代理 (test.mosquitto.org) 对其进行测试的示例。它工作得很好,但现在我只需要做同样的事情,只需要 3 个 PEM 文件。

我还怀疑我需要在 Azure 上做一些事情(在函数应用或应用服务环境级别)才能使用这些证书?

            // Create a new MQTT client.
            var factory = new MqttFactory();
            var mqttClient = factory.CreateMqttClient();

            // Load certificate 
            X509Certificate caCertificate = new X509Certificate(@"..\mosquitto.org.crt");

            // Create TLS based parameters.
            var tlsParameters = new MqttClientOptionsBuilderTlsParameters
            {
                UseTls = true,
                Certificates = new List<X509Certificate> { caCertificate },
                SslProtocol = System.Security.Authentication.SslProtocols.Tls12
            };

            // Create TCP based options using the builder.
            var connectOptions = new MqttClientOptionsBuilder() 
                .WithTcpServer("test.mosquitto.org", 8883)
                .WithProtocolVersion(MQTTnet.Formatter.MqttProtocolVersion.V311)
                .WithTls(tlsParameters)
                .Build();

            var conResult = await mqttClient.ConnectAsync(connectOptions);
                              
            mqttClient.UseConnectedHandler(e =>
            {
                Console.Write("Connected successfully with MQTT Brokers.");
            });
            mqttClient.UseDisconnectedHandler(e =>
            {
                Console.Write("Disconnected from MQTT Brokers.");
            });

【问题讨论】:

    标签: .net-core mqtt pem azure-function-app


    【解决方案1】:

    .crt 文件通常包含 PEM 编码的密钥/证书,因此在这种情况下,文件扩展名没有任何区别。

    您应该能够将mosquitto.org.crt 替换为server.pem

    其他 2 个文件用于所谓的双向 TLS 身份验证。对于大多数 TLS 连接(例如,在对网页发出 HTTPS 请求时),只有连接的一侧需要证书/私钥。这是服务器。客户端使用一组 CA 证书来验证服务是否与其声称的一样。 (这就是您使用mosquitto.org.crt 文件所做的事情)。

    在其他情况下,我们希望对连接的两端进行身份验证(客户端想知道服务器是什么,服务器想知道客户端是谁)。为此,客户端还需要向服务器提供证书,这就是其他 2 个文件的用途。

    MQTTNet 文档包含一个使用客户端证书 here 设置连接的示例,但它使用 .pfx(pfx 只是 PKCS12 容器的另一个名称,如果需要,您可以将 .pem 文件转换为使用 openssl 的 .pfx/.p12 文件,例如 openssl pkcs12 -export -out mqtt-client.p12 -inkey mqtt-client-key_nopass.pem -in mqtt-client-cert.pem -CAfile server.pem)

    List<X509Certificate> certs = new List<X509Certificate>
    {
        new X509Certificate2("myCert.pfx")
    };
    
    var options = new MqttClientOptionBuilder()
        .WithTcpServer(broker, port)
        .WithTls(new MqttClientOptionsBuilderTlsParameters
        {
            UseTls = true,
            Certificates = certs
        })
        .Build();
    

    【讨论】:

    • 嗨,hardillb,感谢您的帮助。这对我帮助很大,也让我有了更深的理解。现在,我正在尝试将 .pem 文件转换为您在示例中所述的 pfx/.p12 文件,但这里出现错误:无法识别的标志 CAFile?
    • @Zaz 抱歉,有一个错字,应该是-CAfile。我已经更新了答案
    • 嗨@hardillb,感谢您的帮助,很抱歉回复晚了。由于电晕,我们已被关闭,但现在我们又回到了游戏中。
    • 也许我应该更清楚。 Azure 函数是一个时间触发器,每 5 秒触发一次,以便从服务器获取新内容。你还认为我应该使用双向 TLS 身份验证吗?我按照您的示例并使用 openssl 将文件转换为 .pfx/.p12 文件,例如openssl pkcs12 -export -out mqtt-client.p12 -inkey mqtt-client-key_nopass.pem -in mqtt-client-cert.pem -CAfile server.pem 但在这里我得到一个例外:“提供给包的凭据不被识别”???
    猜你喜欢
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 2018-03-07
    • 2021-12-18
    • 1970-01-01
    • 2023-03-29
    • 2022-11-07
    相关资源
    最近更新 更多