.net core 如何使用MqttNET在azure函数中使用PEM文件

.net core 如何使用MqttNET在azure函数中使用PEM文件,.net-core,mqtt,pem,azure-function-app,.net Core,Mqtt,Pem,Azure Function App,我希望你能在这里帮助我。 我试图创建一个MQTT客户机(应用程序服务环境中的azure函数),从MQTT代理(hivemq)中提取数据,但在证书方面我有点不知所措(我不是专家) 无论如何,我从我们的合作伙伴那里收到了3个文件(请看下面)(这是MQTT代理的文件),但问题是。我应该如何在应用程序中使用这些PEM文件 客户端证书==mqtt-Client-cert.pem 客户机密钥==mqtt-Client-key\u nopass.pem CA证书==server.pem 这是应用程序,这是

我希望你能在这里帮助我。 我试图创建一个MQTT客户机(应用程序服务环境中的azure函数),从MQTT代理(hivemq)中提取数据,但在证书方面我有点不知所措(我不是专家)

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

  • 客户端证书==mqtt-Client-cert.pem
  • 客户机密钥==mqtt-Client-key\u 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.");
            });
//创建一个新的MQTT客户端。
var factory=新的MqttFactory();
var mqttClient=factory.CreateMqttClient();
//装载证书
X509Certificate caCertificate=新的X509Certificate(@.\mosquito.org.crt”);
//创建基于TLS的参数。
var tlsParameters=新的MQTTClientOptions BuilderTlsParameters
{
UseTls=true,
证书=新列表{caCertificate},
SslProtocol=System.Security.Authentication.SslProtocols.Tls12
};
//使用生成器创建基于TCP的选项。
var connectOptions=new MqttClientOptionsBuilder()
.WithTcpServer(“test.mosquitto.org”,8883)
.WithProtocolVersion(MQTTnet.Formatter.MqttProtocolVersion.V311)
.带TLS(TLS流量计)
.Build();
var conResult=await mqttClient.ConnectAsync(connectOptions);
mqttClient.UseConnectedHandler(e=>
{
Write(“与MQTT代理成功连接”);
});
mqttClient.UseDisconnectedHandler(e=>
{
Write(“与MQTT代理断开连接”);
});

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

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

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

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

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

List certs=新列表
{
新X509Certificate2(“myCert.pfx”)
};
var options=new MqttClientOptionBuilder()
.WithTcpServer(代理,端口)
.WithTls(新的MQTTClientOptions构建器LSParameters
{
UseTls=true,
证书=证书
})
.Build();

Hi hardillb,谢谢你的帮助。这对我帮助很大,让我有了更深的理解。现在我正试图将.pem文件转换为pfx/.p12文件,正如你在示例中所述,但这里我得到了错误:无法识别的标志CAFile?@Zaz抱歉,有一个输入错误,它应该是
-CAFile
。我已经更新了answerHi@hardillb,谢谢你的帮助,很抱歉反应太晚。由于corona的原因,我们已经关闭了,但现在我们又回到了游戏中。也许我应该更清楚一些。Azure功能是一个时间触发器,每5秒触发一次,以便从服务器获取新内容。你仍然认为我应该使用相互TLS身份验证吗?我有f按照您的示例,使用openssl将文件转换为.pfx/.p12文件,例如openssl pkcs12-导出mqtt-client.p12-inkey mqtt-client-key_nopass.pem-在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();