C# 在C中使用证书的M2MQtt连接#

C# 在C中使用证书的M2MQtt连接#,c#,ssl-certificate,x509certificate,mqtt,mosquitto,C#,Ssl Certificate,X509certificate,Mqtt,Mosquitto,我正试图使用C#中的M2MQTT库连接到MQTT(Mosquitto)。未经身份验证时,连接工作正常,但启用证书身份验证时,我无法连接 我正在使用以下代码: string Certificate = "C:\\temp\\numq1.p12"; X509Certificate cert = X509Certificate.CreateFromCertFile(Certificate); MqttClient client = new MqttClient("myserver.domain", 8

我正试图使用C#中的M2MQTT库连接到MQTT(Mosquitto)。未经身份验证时,连接工作正常,但启用证书身份验证时,我无法连接

我正在使用以下代码:

string Certificate = "C:\\temp\\numq1.p12";
X509Certificate cert = X509Certificate.CreateFromCertFile(Certificate);
MqttClient client = new MqttClient("myserver.domain", 8883, true, new X509Certificate(cert));
string clientId = Guid.NewGuid().ToString();
client.Connect(clientId);
已使用此命令生成numq1.p12

openssl pkcs12-export-out numq1.p12-inkey mqttcert.key-in mqttcert.crt-证书文件ca.crt

我已尝试将numq1.p12、mqttcert.crt和ca.crt添加到信任根证书颁发机构,但代码仍引发以下异常:

A first chance exception of type 'uPLibrary.Networking.M2Mqtt.Exceptions.MqttConnectionException' occurred in M2Mqtt.dll
Unable to connect to MQ server
uPLibrary.Networking.M2Mqtt.Exceptions.MqttConnectionException: Exception connecting to the broker ---> System.Security.Authentication.AuthenticationException: A call to SSPI failed, see inner exception. ---> System.ComponentModel.Win32Exception: The message received was unexpected or badly formatted
   --- End of inner exception stack trace ---
   at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
   at System.Net.Security.SslStream.AuthenticateAsClient(String targetHost, X509CertificateCollection clientCertificates, SslProtocols enabledSslProtocols, Boolean checkCertificateRevocation)
   at uPLibrary.Networking.M2Mqtt.MqttNetworkChannel.Connect()
   at uPLibrary.Networking.M2Mqtt.MqttClient.Connect(String clientId, String username, String password, Boolean willRetain, Byte willQosLevel, Boolean willFlag, String willTopic, String willMessage, Boolean cleanSession, UInt16 keepAlivePeriod)
   --- End of inner exception stack trace ---
   at uPLibrary.Networking.M2Mqtt.MqttClient.Connect(String clientId, String username, String password, Boolean willRetain, Byte willQosLevel, Boolean willFlag, String willTopic, String willMessage, Boolean cleanSession, UInt16 keepAlivePeriod)
   at uPLibrary.Networking.M2Mqtt.MqttClient.Connect(String clientId)

我想知道是否有人能为我指出正确的方向?

我已经得到M2MQTT库开发人员的确认,SSL客户端身份验证不受支持,因此我徒劳地努力使其工作:(


因此,我已恢复使用SSL进行服务器身份验证,并将用户名和密码传递给MQTT。虽然不理想,但它现在可以按预期工作。

进一步信息…我可以使用Mosquito_sub和相同的证书订阅MQTT fine,这让我感到困惑。M2MQTT或任何其他.NET库是否也可以这样做,通过证书支持客户端身份验证?mosquitto_sub.exe-d-h myserver.domain-p 8883-q 1-t queue1/test1--cert mqttcert.crt--key mqttcert.key--ca文件ca.crtyu您可以在这里针对M2MQTT提交错误:这似乎是一个普遍有用的功能。您好,2017年的SSL服务器验证要求CaCert和客户端证书?幸运吗它现在起作用了吗?这两个词是什么意思certificate@AnilGadiyar证书是否顺利?我也处于相同的位置,无法连接到代理。@BlackShawarna HI刚刚将return设置为true,并且在证书验证函数中不进行验证。因为这对我很有效