Skip to content

Commit 8a5d760

Browse files
jeanpatricklegerawsjpleger
authored andcommitted
Options to enable secure RabbitMQ (#27)
* RMQ connection support for SSL/TLS (no certificate check). * Refactored RabbitMqConnectionFactory to support TLS connection and Port number config. * Update on IRabbitMqConnectionFactory Summary. Co-authored-by: JP Leger <[email protected]>
1 parent 9548439 commit 8a5d760

File tree

6 files changed

+59
-13
lines changed

6 files changed

+59
-13
lines changed

src/Messaging/Configuration/ConfigurationKeys.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ internal static class ConfigurationKeys
1111
public static readonly string VirtualHost = "virtualHost";
1212
public static readonly string Exchange = "exchange";
1313
public static readonly string ExportRequestQueue = "exportRequestQueue";
14-
14+
public static readonly string UseSSL = "useSSL";
15+
public static readonly string Port = "port";
1516
public static readonly string[] PublisherRequiredKeys = new[] { EndPoint, Username, Password, VirtualHost, Exchange };
1617
public static readonly string[] SubscriberRequiredKeys = new[] { EndPoint, Username, Password, VirtualHost, Exchange, ExportRequestQueue };
1718
}

src/Messaging/RabbitMq/RabbitMqConnectionFactory.cs

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Microsoft.Extensions.Logging;
99
using Monai.Deploy.Messaging.Common;
1010
using RabbitMQ.Client;
11+
using System.Net.Security;
1112

1213
namespace Monai.Deploy.Messaging.RabbitMq
1314
{
@@ -22,8 +23,10 @@ public interface IRabbitMqConnectionFactory
2223
/// <param name="username">User name</param>
2324
/// <param name="password">Password</param>
2425
/// <param name="virtualHost">Virtual host</param>
26+
/// <param name="useSSL">Encrypt communication</param>
27+
/// <param name="portnumber">Port Number</param>
2528
/// <returns>Instance of <see cref="IModel"/>.</returns>
26-
IModel CreateChannel(string hostName, string username, string password, string virtualHost);
29+
IModel CreateChannel(string hostName, string username, string password, string virtualHost, string useSSL, string portnumber);
2730
}
2831

2932
public class RabbitMqConnectionFactory : IRabbitMqConnectionFactory, IDisposable
@@ -40,19 +43,20 @@ public RabbitMqConnectionFactory(ILogger<RabbitMqConnectionFactory> logger)
4043
_connections = new ConcurrentDictionary<string, Lazy<IConnection>>();
4144
}
4245

43-
public IModel CreateChannel(string hostName, string username, string password, string virtualHost)
46+
public IModel CreateChannel(string hostName, string username, string password, string virtualHost, string useSSL, string portnumber )
4447
{
4548
Guard.Against.NullOrWhiteSpace(hostName, nameof(hostName));
4649
Guard.Against.NullOrWhiteSpace(username, nameof(username));
4750
Guard.Against.NullOrWhiteSpace(password, nameof(password));
4851
Guard.Against.NullOrWhiteSpace(virtualHost, nameof(virtualHost));
4952

53+
5054
var key = $"{hostName}{username}{HashPassword(password)}{virtualHost}";
5155

5256
var connection = _connections.AddOrUpdate(key,
5357
x =>
5458
{
55-
return CreatConnection(hostName, username, password, virtualHost, key);
59+
return CreatConnection(hostName, username, password, virtualHost, key, useSSL, portnumber);
5660
},
5761
(updateKey, updateConnection) =>
5862
{
@@ -62,21 +66,38 @@ public IModel CreateChannel(string hostName, string username, string password, s
6266
}
6367
else
6468
{
65-
return CreatConnection(hostName, username, password, virtualHost, key);
69+
return CreatConnection(hostName, username, password, virtualHost, key, useSSL, portnumber);
6670
}
6771
});
6872

6973
return connection.Value.CreateModel();
7074
}
7175

72-
private Lazy<IConnection> CreatConnection(string hostName, string username, string password, string virtualHost, string key)
76+
private Lazy<IConnection> CreatConnection(string hostName, string username, string password, string virtualHost, string key, string useSSL, string portnumber)
7377
{
78+
int port;
79+
Boolean SslEnabled;
80+
Boolean.TryParse(useSSL, out SslEnabled);
81+
if (!Int32.TryParse(portnumber, out port))
82+
{
83+
port = SslEnabled ? 5671 : 5672; // 5671 is default port for SSL/TLS , 5672 is default port for PLAIN.
84+
}
85+
86+
SslOption sslOptions = new SslOption
87+
{
88+
Enabled = SslEnabled,
89+
ServerName = hostName,
90+
AcceptablePolicyErrors = SslPolicyErrors.RemoteCertificateNameMismatch | SslPolicyErrors.RemoteCertificateChainErrors | SslPolicyErrors.RemoteCertificateNotAvailable
91+
};
92+
7493
var connectionFactory = _connectionFactoriess.GetOrAdd(key, y => new Lazy<ConnectionFactory>(() => new ConnectionFactory()
7594
{
7695
HostName = hostName,
7796
UserName = username,
7897
Password = password,
79-
VirtualHost = virtualHost
98+
VirtualHost = virtualHost,
99+
Ssl = sslOptions,
100+
Port = port
80101
}));
81102

82103
return new Lazy<IConnection>(() => connectionFactory.Value.CreateConnection());

src/Messaging/RabbitMq/RabbitMqMessagePublisherService.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public class RabbitMqMessagePublisherService : IMessageBrokerPublisherService
2323
private readonly string _password;
2424
private readonly string _virtualHost;
2525
private readonly string _exchange;
26+
private readonly string _useSSL = string.Empty;
27+
private readonly string _portNumber = string.Empty;
2628
private bool _disposedValue;
2729

2830
public string Name => "Rabbit MQ Publisher";
@@ -43,6 +45,16 @@ public RabbitMqMessagePublisherService(IOptions<MessageBrokerServiceConfiguratio
4345
_password = configuration.PublisherSettings[ConfigurationKeys.Password];
4446
_virtualHost = configuration.PublisherSettings[ConfigurationKeys.VirtualHost];
4547
_exchange = configuration.PublisherSettings[ConfigurationKeys.Exchange];
48+
49+
50+
if (configuration.PublisherSettings.ContainsKey(ConfigurationKeys.UseSSL))
51+
_useSSL = configuration.PublisherSettings[ConfigurationKeys.UseSSL];
52+
53+
54+
if (configuration.PublisherSettings.ContainsKey(ConfigurationKeys.Port))
55+
_portNumber = configuration.PublisherSettings[ConfigurationKeys.Port];
56+
57+
4658
}
4759

4860
private void ValidateConfiguration(MessageBrokerServiceConfiguration configuration)
@@ -68,7 +80,7 @@ public Task Publish(string topic, Message message)
6880

6981
_logger.PublshingRabbitMq(_endpoint, _virtualHost, _exchange, topic);
7082

71-
using var channel = _rabbitMqConnectionFactory.CreateChannel(_endpoint, _username, _password, _virtualHost);
83+
using var channel = _rabbitMqConnectionFactory.CreateChannel(_endpoint, _username, _password, _virtualHost , _useSSL , _portNumber);
7284
channel.ExchangeDeclare(_exchange, ExchangeType.Topic, durable: true, autoDelete: false);
7385

7486
var properties = channel.CreateBasicProperties();
@@ -109,4 +121,4 @@ public void Dispose()
109121
GC.SuppressFinalize(this);
110122
}
111123
}
112-
}
124+
}

src/Messaging/RabbitMq/RabbitMqMessageSubscriberService.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ public class RabbitMqMessageSubscriberService : IMessageBrokerSubscriberService
1919
private readonly string _endpoint;
2020
private readonly string _virtualHost;
2121
private readonly string _exchange;
22+
private readonly string _useSSL = string.Empty;
23+
private readonly string _portNumber = string.Empty;
2224
private readonly IModel _channel;
2325
private bool _disposedValue;
2426

@@ -40,8 +42,18 @@ public RabbitMqMessageSubscriberService(IOptions<MessageBrokerServiceConfigurati
4042
_virtualHost = configuration.SubscriberSettings[ConfigurationKeys.VirtualHost];
4143
_exchange = configuration.SubscriberSettings[ConfigurationKeys.Exchange];
4244

45+
46+
if (configuration.SubscriberSettings.ContainsKey(ConfigurationKeys.UseSSL))
47+
_useSSL = configuration.SubscriberSettings[ConfigurationKeys.UseSSL];
48+
49+
50+
51+
if (configuration.SubscriberSettings.ContainsKey(ConfigurationKeys.Port))
52+
_portNumber = configuration.SubscriberSettings[ConfigurationKeys.Port];
53+
54+
4355
_logger.ConnectingToRabbitMq(Name, _endpoint, _virtualHost);
44-
_channel = rabbitMqConnectionFactory.CreateChannel(_endpoint, username, password, _virtualHost);
56+
_channel = rabbitMqConnectionFactory.CreateChannel(_endpoint, username, password, _virtualHost , _useSSL , _portNumber);
4557
_channel.ExchangeDeclare(_exchange, ExchangeType.Topic, durable: true, autoDelete: false);
4658
_channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);
4759
}
@@ -233,4 +245,4 @@ private static MessageReceivedEventArgs CreateMessage(string topic, BasicDeliver
233245
CancellationToken.None);
234246
}
235247
}
236-
}
248+
}

src/Messaging/Test/RabbitMq/RabbitMqMessagePublisherServiceTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public RabbitMqMessagePublisherServiceTest()
2828
_connectionFactory = new Mock<IRabbitMqConnectionFactory>();
2929
_model = new Mock<IModel>();
3030

31-
_connectionFactory.Setup(p => p.CreateChannel(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
31+
_connectionFactory.Setup(p => p.CreateChannel(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(),It.IsAny<string>(),It.IsAny<string>()))
3232
.Returns(_model.Object);
3333
}
3434

src/Messaging/Test/RabbitMq/RabbitMqMessageSubscriberServiceTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public RabbitMqMessageSubscriberServiceTest()
3030
_connectionFactory = new Mock<IRabbitMqConnectionFactory>();
3131
_model = new Mock<IModel>();
3232

33-
_connectionFactory.Setup(p => p.CreateChannel(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
33+
_connectionFactory.Setup(p => p.CreateChannel(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
3434
.Returns(_model.Object);
3535

3636
}

0 commit comments

Comments
 (0)