From 28641892f560fba33137b7688b49f5987f51e128 Mon Sep 17 00:00:00 2001 From: Ben Origas Date: Fri, 15 Nov 2019 09:37:33 -0600 Subject: [PATCH 1/5] Add an x509 certificate parameter --- Source/MQTTnet/Implementations/MqttTcpServerAdapter.cs | 8 ++++++-- Source/MQTTnet/Server/MqttServerOptionsBuilder.cs | 7 +++++++ Source/MQTTnet/Server/MqttServerTlsTcpEndpointOptions.cs | 3 +++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Source/MQTTnet/Implementations/MqttTcpServerAdapter.cs b/Source/MQTTnet/Implementations/MqttTcpServerAdapter.cs index 22a5824c..8bc03904 100644 --- a/Source/MQTTnet/Implementations/MqttTcpServerAdapter.cs +++ b/Source/MQTTnet/Implementations/MqttTcpServerAdapter.cs @@ -44,13 +44,17 @@ namespace MQTTnet.Implementations if (options.TlsEndpointOptions?.IsEnabled == true) { - if (options.TlsEndpointOptions.Certificate == null) + if (options.TlsEndpointOptions.Certificate == null && options.TlsEndpointOptions.X509Certificate == null) { throw new ArgumentException("TLS certificate is not set."); } X509Certificate2 tlsCertificate; - if (string.IsNullOrEmpty(options.TlsEndpointOptions.CertificateCredentials?.Password)) + if (options.TlsEndpointOptions.X509Certificate != null) + { + tlsCertificate = options.TlsEndpointOptions.X509Certificate; + } + else if (string.IsNullOrEmpty(options.TlsEndpointOptions.CertificateCredentials?.Password)) { // Use a different overload when no password is specified. Otherwise the constructor will fail. tlsCertificate = new X509Certificate2(options.TlsEndpointOptions.Certificate); diff --git a/Source/MQTTnet/Server/MqttServerOptionsBuilder.cs b/Source/MQTTnet/Server/MqttServerOptionsBuilder.cs index 2970fab4..ae0ae2d4 100644 --- a/Source/MQTTnet/Server/MqttServerOptionsBuilder.cs +++ b/Source/MQTTnet/Server/MqttServerOptionsBuilder.cs @@ -2,6 +2,7 @@ using System.Net; using System.Net.Security; using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; namespace MQTTnet.Server { @@ -89,6 +90,12 @@ namespace MQTTnet.Server return this; } + public MqttServerOptionsBuilder WithEncryptionCertificate(X509Certificate2 certificate) + { + _options.TlsEndpointOptions.X509Certificate = certificate; + return this; + } + public MqttServerOptionsBuilder WithEncryptionSslProtocol(SslProtocols value) { _options.TlsEndpointOptions.SslProtocol = value; diff --git a/Source/MQTTnet/Server/MqttServerTlsTcpEndpointOptions.cs b/Source/MQTTnet/Server/MqttServerTlsTcpEndpointOptions.cs index 9bf325b1..02da53b3 100644 --- a/Source/MQTTnet/Server/MqttServerTlsTcpEndpointOptions.cs +++ b/Source/MQTTnet/Server/MqttServerTlsTcpEndpointOptions.cs @@ -1,5 +1,6 @@ using System.Net.Security; using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; namespace MQTTnet.Server { @@ -12,6 +13,8 @@ namespace MQTTnet.Server public byte[] Certificate { get; set; } + public X509Certificate2 X509Certificate { get; set; } + public IMqttServerCertificateCredentials CertificateCredentials { get; set; } public bool ClientCertificateRequired { get; set; } From 88e8691ce07ff587d9b56445c1e4feb0e8b1553d Mon Sep 17 00:00:00 2001 From: Ben Origas Date: Tue, 26 Nov 2019 08:38:18 -0600 Subject: [PATCH 2/5] Move server x509 certs into non-uwp compiler flags --- Source/MQTTnet/Server/MqttServerOptionsBuilder.cs | 2 ++ Source/MQTTnet/Server/MqttServerTlsTcpEndpointOptions.cs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Source/MQTTnet/Server/MqttServerOptionsBuilder.cs b/Source/MQTTnet/Server/MqttServerOptionsBuilder.cs index ae0ae2d4..05102a51 100644 --- a/Source/MQTTnet/Server/MqttServerOptionsBuilder.cs +++ b/Source/MQTTnet/Server/MqttServerOptionsBuilder.cs @@ -90,11 +90,13 @@ namespace MQTTnet.Server return this; } +#if !WINDOWS_UWP public MqttServerOptionsBuilder WithEncryptionCertificate(X509Certificate2 certificate) { _options.TlsEndpointOptions.X509Certificate = certificate; return this; } +#endif public MqttServerOptionsBuilder WithEncryptionSslProtocol(SslProtocols value) { diff --git a/Source/MQTTnet/Server/MqttServerTlsTcpEndpointOptions.cs b/Source/MQTTnet/Server/MqttServerTlsTcpEndpointOptions.cs index 02da53b3..f0b54160 100644 --- a/Source/MQTTnet/Server/MqttServerTlsTcpEndpointOptions.cs +++ b/Source/MQTTnet/Server/MqttServerTlsTcpEndpointOptions.cs @@ -13,7 +13,9 @@ namespace MQTTnet.Server public byte[] Certificate { get; set; } +#if !WINDOWS_UWP public X509Certificate2 X509Certificate { get; set; } +#endif public IMqttServerCertificateCredentials CertificateCredentials { get; set; } From 07ad9fc557588c894839daaf4dc66d9d17ab83a3 Mon Sep 17 00:00:00 2001 From: Ben Origas Date: Wed, 15 Apr 2020 09:55:23 -0500 Subject: [PATCH 3/5] Add exception if both Certificate and X509Certificate are set --- Source/MQTTnet/Implementations/MqttTcpServerAdapter.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/MQTTnet/Implementations/MqttTcpServerAdapter.cs b/Source/MQTTnet/Implementations/MqttTcpServerAdapter.cs index 8bc03904..25879bfd 100644 --- a/Source/MQTTnet/Implementations/MqttTcpServerAdapter.cs +++ b/Source/MQTTnet/Implementations/MqttTcpServerAdapter.cs @@ -48,6 +48,10 @@ namespace MQTTnet.Implementations { throw new ArgumentException("TLS certificate is not set."); } + else if (options.TlsEndpointOptions.Certificate != null && options.TlsEndpointOptions.X509Certificate != null) + { + throw new ArgumentException($"{nameof(MqttServerTlsTcpEndpointOptions.Certificate)} and {nameof(MqttServerTlsTcpEndpointOptions.X509Certificate)} cannot both be set"); + } X509Certificate2 tlsCertificate; if (options.TlsEndpointOptions.X509Certificate != null) From 1d553c5eceee550d59115bb7ed9408f435a7b6a5 Mon Sep 17 00:00:00 2001 From: Ben Origas Date: Wed, 15 Apr 2020 09:57:06 -0500 Subject: [PATCH 4/5] Wrap certificate namespace in a !UWP compiler directive --- Source/MQTTnet/Server/MqttServerTlsTcpEndpointOptions.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/MQTTnet/Server/MqttServerTlsTcpEndpointOptions.cs b/Source/MQTTnet/Server/MqttServerTlsTcpEndpointOptions.cs index f0b54160..0c529b57 100644 --- a/Source/MQTTnet/Server/MqttServerTlsTcpEndpointOptions.cs +++ b/Source/MQTTnet/Server/MqttServerTlsTcpEndpointOptions.cs @@ -1,6 +1,8 @@ using System.Net.Security; using System.Security.Authentication; +#if !WINDOWS_UWP using System.Security.Cryptography.X509Certificates; +#endif namespace MQTTnet.Server { From fc3965f5a3b96a522f4983bc867099b1e0674bc8 Mon Sep 17 00:00:00 2001 From: Ben Origas Date: Wed, 15 Apr 2020 10:00:25 -0500 Subject: [PATCH 5/5] Also Wrap certificate namespace in a !UWP compiler directive in options builder --- Source/MQTTnet/Server/MqttServerOptionsBuilder.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/MQTTnet/Server/MqttServerOptionsBuilder.cs b/Source/MQTTnet/Server/MqttServerOptionsBuilder.cs index 05102a51..9821b648 100644 --- a/Source/MQTTnet/Server/MqttServerOptionsBuilder.cs +++ b/Source/MQTTnet/Server/MqttServerOptionsBuilder.cs @@ -2,7 +2,9 @@ using System.Net; using System.Net.Security; using System.Security.Authentication; +#if !WINDOWS_UWP using System.Security.Cryptography.X509Certificates; +#endif namespace MQTTnet.Server {