diff --git a/lib/java/src/org/apache/thrift/transport/TSSLTransportFactory.java b/lib/java/src/org/apache/thrift/transport/TSSLTransportFactory.java
index e830bb9..76c98c8 100755
--- a/lib/java/src/org/apache/thrift/transport/TSSLTransportFactory.java
+++ b/lib/java/src/org/apache/thrift/transport/TSSLTransportFactory.java
@@ -20,8 +20,12 @@
 package org.apache.thrift.transport;
 
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
 import java.io.IOException;
 import java.net.InetAddress;
+import java.net.URL;
+import java.net.MalformedURLException;
 import java.security.KeyStore;
 import java.util.Arrays;
 
@@ -171,8 +175,8 @@
 
   private static SSLContext createSSLContext(TSSLTransportParameters params) throws TTransportException {
     SSLContext ctx;
-    FileInputStream fin = null;
-    FileInputStream fis = null;
+    InputStream in = null;
+    InputStream is = null;
 
     try {
       ctx = SSLContext.getInstance(params.protocol);
@@ -182,17 +186,17 @@
       if (params.isTrustStoreSet) {
         tmf = TrustManagerFactory.getInstance(params.trustManagerType);
         KeyStore ts = KeyStore.getInstance(params.trustStoreType);
-        fin = new FileInputStream(params.trustStore);
-        ts.load(fin,
-          (params.trustPass != null ? params.trustPass.toCharArray() : null));
+        in = getStoreAsStream(params.trustStore);
+        ts.load(in,
+                (params.trustPass != null ? params.trustPass.toCharArray() : null));
         tmf.init(ts);
       }
 
       if (params.isKeyStoreSet) {
         kmf = KeyManagerFactory.getInstance(params.keyManagerType);
         KeyStore ks = KeyStore.getInstance(params.keyStoreType);
-        fis = new FileInputStream(params.keyStore);
-        ks.load(fis, params.keyPass.toCharArray());
+        is = getStoreAsStream(params.keyStore);
+        ks.load(is, params.keyPass.toCharArray());
         kmf.init(ks, params.keyPass.toCharArray());
       }
 
@@ -209,16 +213,16 @@
     } catch (Exception e) {
       throw new TTransportException("Error creating the transport", e);
     } finally {
-      if (fin != null) {
+      if (in != null) {
         try {
-          fin.close();
+          in.close();
         } catch (IOException e) {
           e.printStackTrace();
         }
       }
-      if (fis != null) {
+      if (is != null) {
         try {
-          fis.close();
+          is.close();
         } catch (IOException e) {
           e.printStackTrace();
         }
@@ -228,6 +232,30 @@
     return ctx;
   }
 
+  private static InputStream getStoreAsStream(String store) throws IOException {
+    try {
+      return new FileInputStream(store);
+    } catch(FileNotFoundException e) {
+    }
+
+    InputStream storeStream = null;
+    try {
+      storeStream = new URL(store).openStream();
+      if (storeStream != null) {
+        return storeStream;
+      }
+    } catch(MalformedURLException e) {
+    }
+
+    storeStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(store);
+
+    if (storeStream != null) {
+      return storeStream;
+    } else {
+      throw new IOException("Could not load file: " + store);
+    }
+  }
+
   private static TSocket createClient(SSLSocketFactory factory, String host, int port, int timeout) throws TTransportException {
     try {
       SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
