PROTON-1451 : Only register BouncyCastle provider if not already present
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactory.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactory.java
index 64eb2ca..4efc055 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactory.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactory.java
@@ -130,10 +130,7 @@
             PrivateKeyInfoClassResult = Class.forName("org.bouncycastle.asn1.pkcs.PrivateKeyInfo");
             getPrivateKeyMethodResult = jcaPEMKeyConverterClass.getMethod("getPrivateKey", PrivateKeyInfoClassResult);
 
-            // Try loading BC as a provider
-            Class<?> klass = Class.forName("org.bouncycastle.jce.provider.BouncyCastleProvider");
-            Provider provider = (Provider) klass.getConstructor().newInstance();
-            Security.addProvider(provider);
+            registerBouncyCastleProvider();
         }
         catch (Exception e)
         {
@@ -155,6 +152,23 @@
         }
     }
 
+    static void registerBouncyCastleProvider()
+            throws ClassNotFoundException, InstantiationException, IllegalAccessException,
+                   InvocationTargetException, NoSuchMethodException
+    {
+        // Try loading BC as a provider
+        Class<?> klass = Class.forName("org.bouncycastle.jce.provider.BouncyCastleProvider");
+
+        Provider bouncyCastleProvider = (Provider) klass.getConstructor().newInstance();
+        synchronized (Security.class)
+        {
+            if(Security.getProvider(bouncyCastleProvider.getName()) == null)
+            {
+                Security.addProvider(bouncyCastleProvider);
+            }
+        }
+    }
+
     SslEngineFacadeFactory()
     {
     }
diff --git a/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactoryTest.java b/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactoryTest.java
index 84ba8cb..e43988e 100644
--- a/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactoryTest.java
+++ b/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactoryTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.qpid.proton.engine.impl.ssl;
 
+import static junit.framework.TestCase.fail;
 import static org.junit.Assert.assertNotNull;
 
 import java.net.URL;
@@ -29,6 +30,21 @@
     private static final String PASSWORD = "unittest";
 
     @Test
+    public void testDuplicateRegistrationOfSecurityProvider() {
+        // ensure the provider is already registered
+        SslEngineFacadeFactory factory = new SslEngineFacadeFactory();
+
+        try
+        {
+            SslEngineFacadeFactory.registerBouncyCastleProvider();
+        }
+        catch (Exception e)
+        {
+            fail("Exception thrown when re-registering BouncyCastle provider " + e.getMessage());
+        }
+    }
+    
+    @Test
     public void testCertifcateLoad() {
         String ipFile = resolveFilename("cert.pem.txt");
         SslEngineFacadeFactory factory = new SslEngineFacadeFactory();