如何使用 MqttNET 在 azure 函数中使用 PEM 文件
How to use PEM files in azure function using MqttNET
我希望你能在这里帮助我。
无论如何,我从我们的合作伙伴(MQTT 代理)那里收到了 3 个文件(如下所示),但问题是。我应该如何在应用程序中使用这些 PEM 文件??
- 客户端证书== mqtt-client-cert.pem
- 客户端密钥 == mqtt-client-key_nopass.pem
- CA证书==server.pem
这是应用程序,这是我针对测试代理 (test.mosquitto.org) 在本地(使用 crt 证书)对其进行测试的示例。它工作得很好,但现在我只需要做同样的事情,只需要 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.");
});
.crt
文件通常包含 PEM 编码 keys/certs 因此在这种情况下文件扩展名没有任何区别。
您应该可以将 mosquitto.org.crt
替换为 server.pem
。
其他 2 个文件用于所谓的相互 TLS 身份验证。对于大多数 TLS 连接(例如,当对网页发出 HTTPS 请求时)只有连接的一侧需要 certificate/private 密钥。这是服务器。客户端使用一组 CA 证书来验证服务是否如其所声称的那样。 (这就是您使用 mosquitto.org.crt
文件所做的事情)。
在其他情况下,我们希望对连接的两端进行身份验证(客户端想知道服务器是什么,服务器想知道客户端是谁)。为此,客户端还需要向服务器出示证书,这就是其他 2 个文件的用途。
MQTTNet 文档包含一个使用客户端证书 here 设置连接的示例,但使用 .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<X509Certificate> certs = new List<X509Certificate>
{
new X509Certificate2("myCert.pfx")
};
var options = new MqttClientOptionBuilder()
.WithTcpServer(broker, port)
.WithTls(new MqttClientOptionsBuilderTlsParameters
{
UseTls = true,
Certificates = certs
})
.Build();
我希望你能在这里帮助我。
无论如何,我从我们的合作伙伴(MQTT 代理)那里收到了 3 个文件(如下所示),但问题是。我应该如何在应用程序中使用这些 PEM 文件??
- 客户端证书== mqtt-client-cert.pem
- 客户端密钥 == mqtt-client-key_nopass.pem
- CA证书==server.pem
这是应用程序,这是我针对测试代理 (test.mosquitto.org) 在本地(使用 crt 证书)对其进行测试的示例。它工作得很好,但现在我只需要做同样的事情,只需要 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.");
});
.crt
文件通常包含 PEM 编码 keys/certs 因此在这种情况下文件扩展名没有任何区别。
您应该可以将 mosquitto.org.crt
替换为 server.pem
。
其他 2 个文件用于所谓的相互 TLS 身份验证。对于大多数 TLS 连接(例如,当对网页发出 HTTPS 请求时)只有连接的一侧需要 certificate/private 密钥。这是服务器。客户端使用一组 CA 证书来验证服务是否如其所声称的那样。 (这就是您使用 mosquitto.org.crt
文件所做的事情)。
在其他情况下,我们希望对连接的两端进行身份验证(客户端想知道服务器是什么,服务器想知道客户端是谁)。为此,客户端还需要向服务器出示证书,这就是其他 2 个文件的用途。
MQTTNet 文档包含一个使用客户端证书 here 设置连接的示例,但使用 .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<X509Certificate> certs = new List<X509Certificate>
{
new X509Certificate2("myCert.pfx")
};
var options = new MqttClientOptionBuilder()
.WithTcpServer(broker, port)
.WithTls(new MqttClientOptionsBuilderTlsParameters
{
UseTls = true,
Certificates = certs
})
.Build();