Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AmazonMQ with .NET Core 2.0

Has anyone managed to get connect to AmazonMQ using .NET Core 2.0 over SSL?

I'm getting following error using the Apache.NMS.ActiveMQ.Core package to connect:

System.NotSupportedException: The requested security protocol is not supported.
   at System.Net.SecurityProtocol.ThrowOnNotAllowed(SslProtocols protocols, Boolean allowNone)
   at System.Net.Security.SslStream.AuthenticateAsClient(String targetHost, X509CertificateCollection clientCertificates, SslProtocols enabledSslProtocols, Boolean checkCertificateRevocation)
   at Apache.NMS.ActiveMQ.Transport.Tcp.SslTransport.CreateSocketStream()
   at Apache.NMS.ActiveMQ.Transport.Tcp.TcpTransport.Start()
   at Apache.NMS.ActiveMQ.Transport.WireFormatNegotiator.Start()
   at Apache.NMS.ActiveMQ.Connection.CheckConnected()
   at Apache.NMS.ActiveMQ.Connection.CreateActiveMQSession(AcknowledgementMode ackMode)
   at SendToMQ.Program.SendMessage() in C:\GITLab\POC\SendToMQ\SendToMQ\SendToMQ\Program.cs:line 40
   at SendToMQ.Program.Main(String[] args) in C:\GITLab\POC\SendToMQ\SendToMQ\SendToMQ\Program.cs:line 15

Using the following code:

string url = "ssl://url:61617";
string userName = "name";
string password = "pw";


string payLoad = "This is a test.";
IConnectionFactory factory = new ConnectionFactory(new Uri(url));

using (IConnection connection = factory.CreateConnection(userName, password))
{
    using (ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
    {

        IDestination destination = Apache.NMS.Util.SessionUtil.GetDestination(session, "TestTopic");
        using (IMessageProducer producer = session.CreateProducer(destination))
        {
            connection.Start();

            ITextMessage request = session.CreateTextMessage(payLoad);
            request.Properties["id"] = 123;
            producer.Send(request);
        }
    }
}

Thanks in advance.

like image 713
Albert Avatar asked Dec 19 '22 00:12

Albert


1 Answers

You have to create an SslFactory and set the SslOption specificallly to Tls. Else, NMS defaults to SslProtocol.Default (in Apache.NMS.ActiveMQ.Transport.Tcp.SslTransport.GetAllowedProtocol() ), which is Ssl3.

        String uri = "ssl://yourinstance:61617?nms.AsyncSend=true";
        ITransportFactory sslTransportFactory = new SslTransportFactory();
        ((SslTransportFactory)sslTransportFactory).SslProtocol = "Tls";
        ITransport transport = sslTransportFactory.CreateTransport(new Uri(uri));
        Connection connection = new Connection(new Uri(uri), transport, new IdGenerator())
        {
            UserName = "user",
            Password = "pwd"
        };
        ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
        IDestination dest = session.GetQueue("my_queue");
        IMessageProducer producer = session.CreateProducer(dest);
        producer.DeliveryMode = MsgDeliveryMode.NonPersistent;
        var msg = session.CreateTextMessage("Some msg");
        producer.Send(msg);
        connection.Close();
like image 148
Jorrrit Visser Avatar answered Mar 10 '23 20:03

Jorrrit Visser