我正在尝试使用C#网络核心2.1类库连接到Amazon IoT MQTT代理。我的要求说我必须使用端口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上的连接失败。
我在设置协议列表时缺少什么吗?我没有从中得到任何错误,但是由于这是一个相当新的版本,因此没有太多参考资料可以寻找提示。
答案 0 :(得分:0)
好吧,即使Net CORE 2.1添加了支持此功能的功能,它似乎也无法在Windows 7中使用。您必须使用Windows 8.1或更高版本。在代码的任何地方或GitHub上的示例中都没有对此进行记录,但是我从一个开发团队中发现,出于某种原因,他们决定让它“静默失败”,而不是抛出错误。