簡體   English   中英

在端口 443 上使用 ALPN 將 M2MQTT 客戶端庫連接到 AWS IoT 時出現問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM