diff --git a/.github/workflows/ReleaseNotes.md b/.github/workflows/ReleaseNotes.md index d0afced5..776fa1d0 100644 --- a/.github/workflows/ReleaseNotes.md +++ b/.github/workflows/ReleaseNotes.md @@ -1 +1,2 @@ -* [Server] Fixed not working _UpdateRetainedMessageAsync_ public api (#1858, thanks to @kimdiego2098) +* [Server] Fixed not working _UpdateRetainedMessageAsync_ public api (#1858, thanks to @kimdiego2098). +* [Client] Added support for custom CA chain validation (#1851, thanks to @rido-min). \ No newline at end of file diff --git a/Source/MQTTnet/Implementations/MqttTcpChannel.cs b/Source/MQTTnet/Implementations/MqttTcpChannel.cs index 11861177..f9dadf26 100644 --- a/Source/MQTTnet/Implementations/MqttTcpChannel.cs +++ b/Source/MQTTnet/Implementations/MqttTcpChannel.cs @@ -115,24 +115,32 @@ namespace MQTTnet.Implementations ApplicationProtocols = _tcpOptions.TlsOptions.ApplicationProtocols, ClientCertificates = LoadCertificates(), EnabledSslProtocols = _tcpOptions.TlsOptions.SslProtocol, - CertificateRevocationCheckMode = _tcpOptions.TlsOptions.IgnoreCertificateRevocationErrors ? X509RevocationMode.NoCheck : _tcpOptions.TlsOptions.RevocationMode, + CertificateRevocationCheckMode = _tcpOptions.TlsOptions.IgnoreCertificateRevocationErrors + ? X509RevocationMode.NoCheck + : _tcpOptions.TlsOptions.RevocationMode, TargetHost = targetHost, CipherSuitesPolicy = _tcpOptions.TlsOptions.CipherSuitesPolicy, EncryptionPolicy = _tcpOptions.TlsOptions.EncryptionPolicy, AllowRenegotiation = _tcpOptions.TlsOptions.AllowRenegotiation }; + #if NET7_0_OR_GREATER if (_tcpOptions.TlsOptions.TrustChain?.Count > 0) { - sslOptions.CertificateChainPolicy = new X509ChainPolicy(); - sslOptions.CertificateChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust; - sslOptions.CertificateChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreEndRevocationUnknown; - sslOptions.CertificateChainPolicy.RevocationMode = _tcpOptions.TlsOptions.IgnoreCertificateRevocationErrors ? X509RevocationMode.NoCheck : _tcpOptions.TlsOptions.RevocationMode; + sslOptions.CertificateChainPolicy = new X509ChainPolicy + { + TrustMode = X509ChainTrustMode.CustomRootTrust, + VerificationFlags = X509VerificationFlags.IgnoreEndRevocationUnknown, + RevocationMode = _tcpOptions.TlsOptions.IgnoreCertificateRevocationErrors + ? X509RevocationMode.NoCheck + : _tcpOptions.TlsOptions.RevocationMode + }; + sslOptions.CertificateChainPolicy.CustomTrustStore.AddRange(_tcpOptions.TlsOptions.TrustChain); } #endif - await sslStream.AuthenticateAsClientAsync(sslOptions, cancellationToken).ConfigureAwait(false); + await sslStream.AuthenticateAsClientAsync(sslOptions, cancellationToken).ConfigureAwait(false); #else await sslStream.AuthenticateAsClientAsync( targetHost,