我正在尝试使用 M2MQtt 库通过根 CA、客户端证书和密钥连接到 AWS MQTT 代理。我正在使用以下 C# 客户端连接代码
MqttClient client = new MqttClient(
endPoint,
MqttSettings.MQTT_BROKER_DEFAULT_SSL_PORT,
true,
new X509Certificate2(@"ca.pem"),
new X509Certificate2(@"certificate.pem"),
MqttSslProtocols.TLSv1_2
);
client.Connect(Guid.NewGuid().ToString());
但是,此操作失败并出现格式异常错误。这可能与我不知道将私钥传递到哪里进行此连接有关。这是我已经在工作的东西,使用AWSIoTPythonSDK在Python中原型化(见下文(
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
f = open('mqttEndpoint.txt', 'r')
awsHost = f.read()
f.close()
myAWSIoTMQTTClient = AWSIoTMQTTClient('foo')
myAWSIoTMQTTClient.configureEndpoint(awsHost, 8883)
myAWSIoTMQTTClient.configureCredentials('ca.pem', 'id_rsa', 'certificate.pem')
有谁知道这应该如何工作?
我想出了我的问题。线索是,要正确针对 AWS 进行身份验证,您需要提供证书(在我的情况下是 PEM(和私钥,我不知道如何将其传递到 MqttClient(( 构造函数中,因为它只需要一个"证书"。
解决方案是使用 PFX/P12 证书,其中包含 PEM 和私钥(Microsoft谢谢你与众不同(。有许多资源可以解释如何从 PEM+密钥创建 PFX(即此处、此处、此处、此处等(。然后,您必须使用 X509Certificate2(( 类来拉入 PFX 文件(即"2"是
MqttClient client = new MqttClient(
endPoint,
MqttSettings.MQTT_BROKER_DEFAULT_SSL_PORT,
true,
rootCa,
new X509Certificate2(@"certificate.pfx", @""); // My PFX was created with a blank password, hence empty string as 2nd arg
MqttSslProtocols.TLSv1_2
);
client.Connect(Guid.NewGuid().ToString());