[英]Having problems connecting with M2MQTT client library to AWS IoT using ALPN on port 443
我正在使用 m2mqtt.net 的 .net 框架構建(可在此處獲得: https://github.com/mohaqeq/paho.mqtt.m2mqtt )。 在端口 8883 上連接標准 mqtt 工作正常:
_MqttClient = new MqttClient(IoTHost, IoTPort, true, certificate.CertCA, certificate.CertClient, MqttSslProtocols.TLSv1_2);
使用 ALPN 擴展在端口 443 上連接 mqtt 不起作用:
_MqttClient = new MqttClient(IoTHost, IoTPort, true, certificate.CertCA, certificate.CertClient, MqttSslProtocols.TLSv1_2, new RemoteCertificateValidationCallback(RemoteCertificateValidationCallback), new LocalCertificateSelectionCallback(SelectLocalCertificate), ALPNProtocols);
ALPNProtocols 參數根據要求設置:
List<string> ALPNProtocols = new List<string>();
ALPNProtocols.Add("x-amzn-mqtt-ca");
當我連接( _MqttClient.Connect(serial);
)時,一切都在 m2mqtt.net 項目文件中順利運行,直到它到達 MqttClient.cs 中的第 1102 行:
// wait for answer from broker
if (this.syncEndReceiving.WaitOne(timeout))
然后它等待 30 秒,然后超時並拋出異常:“拋出了 'uPLibrary.Networking.M2Mqtt.Exceptions.MqttCommunicationException' 類型的異常。”
我做了一個網絡跟蹤,在 TLS 握手中沒有看到 ALPN 信息/協商,所以可能這就是服務器沒有回復的原因。
我正在運行標准項目,沒有任何修改。 SSL 符號已定義,項目設置為 .net 框架 4.5。
我假設構建的 .net 框架版本支持 ALPN,因為這里沒有提到任何內容: https://libraries.io/nuget/M2MqttDotnetCore 。 我似乎找不到我的 ALPN arguments 的任何問題。
有人對此有任何運氣嗎?
我認為以下取自 MqttNetworkChannel.cs 的代碼片段表明,如果 M2Mqtt 在 .net 標准/.net 核心環境中運行,它只會尊重 ALPN 參數。
如果文檔明確指出 .net 框架構建中不支持 ALPN,那就太好了...
#if (NETSTANDARD1_6 || NETSTANDARD2_0 || NETCOREAPP3_1)
if ((this.alpnProtocols != null) && (0 < this.alpnProtocols.Count))
{
this.sslStream = new SslStream(this.netStream, false);
SslClientAuthenticationOptions authOptions = new SslClientAuthenticationOptions();
List<SslApplicationProtocol> sslProtocolList = new List<SslApplicationProtocol>();
foreach (string alpnProtocol in this.alpnProtocols)
{
sslProtocolList.Add(new SslApplicationProtocol(alpnProtocol));
}
authOptions.ApplicationProtocols = sslProtocolList;
authOptions.EnabledSslProtocols = MqttSslUtility.ToSslPlatformEnum(this.sslProtocol);
authOptions.TargetHost = remoteHostName;
authOptions.AllowRenegotiation = false;
authOptions.ClientCertificates = clientCertificates;
authOptions.EncryptionPolicy = EncryptionPolicy.RequireEncryption;
this.sslStream.AuthenticateAsClientAsync(authOptions).Wait();
}
else
{
this.sslStream.AuthenticateAsClientAsync(this.remoteHostName,
clientCertificates,
MqttSslUtility.ToSslPlatformEnum(this.sslProtocol),
false).Wait();
}
#else
this.sslStream.AuthenticateAsClient(this.remoteHostName,
clientCertificates,
MqttSslUtility.ToSslPlatformEnum(this.sslProtocol),
false);
#endif
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.