Подключение через TLS с использованием ALPN

Я пытаюсь подключиться к брокеру Amazon IoT MQTT с помощью библиотеки классов C# net core 2.1. Мои требования говорят, что я должен использовать порт 443, что означает, что согласно документации Amazon, я должен использовать соединение, которое поддерживает ALPN.

.Net Core 2.1 теперь имеет методы для поддержки этого, поэтому я пробую следующий код:

(Примечание: я могу попробовать этот же код, используя порт 8883 вместо 443, он подключается нормально и отправляет мои данные MQTT, поэтому я знаю, что мои сертификаты и адрес конечной точки верны.)

    this.socket = new Socket(this.remoteIpAddress.GetAddressFamily(), SocketType.Stream, ProtocolType.Tcp);
    this.socket.Connect(new IPEndPoint(this.remoteIpAddress, this.remotePort));
    this.netStream = new NetworkStream(this.socket);
    this.sslStream = new SslStream(this.netStream, false, this.userCertificateValidationCallback, this.userCertificateSelectionCallback);
    X509CertificateCollection clientCertificates = null;
    clientCertificates = new X509CertificateCollection(new X509Certificate[] { this.clientCert });
    SslApplicationProtocol amzProtocol = new SslApplicationProtocol("x-amzn-mqtt-ca");
    System.Threading.CancellationToken token = new System.Threading.CancellationToken();

    SslClientAuthenticationOptions options = new SslClientAuthenticationOptions()
    {
        AllowRenegotiation = false,
        TargetHost = this.remoteHostName,
        ClientCertificates = clientCertificates,
        EnabledSslProtocols = SslProtocols.Tls12,
        CertificateRevocationCheckMode = X509RevocationMode.NoCheck,
        ApplicationProtocols = new List<SslApplicationProtocol>() { amzProtocol },
        LocalCertificateSelectionCallback = this.userCertificateSelectionCallback,
        RemoteCertificateValidationCallback = this.userCertificateValidationCallback,
        EncryptionPolicy = EncryptionPolicy.RequireEncryption
    };

    this.sslStream.AuthenticateAsClientAsync(options, token).Wait();

Теперь, насколько я понимаю, я должен увидеть (я использую wireshark) расширение, добавленное к протоколу рукопожатия Client Hello, похожее на это:

    Extension: Application Layer Protocol Negotiation
      Type: Application Layer Protocol Negotiation (0x0010)
      Length: ##
      ALPN Extension Length: ##
      ALPN Protocol
        ALPN string length: 14
        ALPN Next Protocol: x-amzn-mqtt-ca

Но я не получаю это расширение, и соединение не устанавливается на порт 443.

Я что-то упускаю при настройке списка протоколов? Я не получаю никаких ошибок от этого, но так как это довольно новый релиз, там не так много справочных материалов, чтобы искать подсказки.

1 ответ

Что ж, похоже, что, хотя Net CORE 2.1 добавил функции для поддержки этого, он не будет работать с Windows 7. Вы должны использовать Windows 8.1 или выше. Это не было документировано нигде в коде или в примерах на GitHub, но я узнал от одного из разработчиков, что по какой-то причине они решили сделать так, чтобы он "молча провалился", а не выдавал ошибку.

Другие вопросы по тегам