Как использовать файл в банке как javax.net.ssl.keystore?

Я пытаюсь сделать что-то вроде

URL clientks = com.messaging.SubscriptionManager.class.getResource( "client.ks" ); String path = clientks.toURI().getPath(); System.setProperty( "javax.net.ssl.keyStore", path); 

Где client.ks – это файл, хранящийся в com / messaging в файле jar, который я запускаю.

То, что читает javax.net.ssl.keyStore, ожидает путь к файлу client.ks, который находится в банке. Я бы предпочел не извлекать файл и не вставлять его на машину клиента, если это возможно. Так можно ли ссылаться на файл в банке?

Это не работает, поскольку getPath () возвращает null. Есть ли другой способ сделать это?

Все еще работаю над реализацией, но я считаю, что можно загрузить хранилище ключей из банки с помощью InputStream и явно настроить TrustStore программно (vs устанавливает свойства System). См. Статью: Настройка нескольких магазинов доверия на одной JVM

Сработало!

 InputStream keystoreInput = Thread.currentThread().getContextClassLoader() .getResourceAsStream(/client.ks"); InputStream truststoreInput = Thread.currentThread().getContextClassLoader() .getResourceAsStream(/client.ts"); setSSLFactories(keystoreInput, "password", truststoreInput); keystoreInput.close(); truststoreInput.close(); private static void setSSLFactories(InputStream keyStream, String keyStorePassword, InputStream trustStream) throws Exception { // Get keyStore KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); // if your store is password protected then declare it (it can be null however) char[] keyPassword = keyStorePassword.toCharArray(); // load the stream to your store keyStore.load(keyStream, keyPassword); // initialize a key manager factory with the key store KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyFactory.init(keyStore, keyPassword); // get the key managers from the factory KeyManager[] keyManagers = keyFactory.getKeyManagers(); // Now get trustStore KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); // if your store is password protected then declare it (it can be null however) //char[] trustPassword = password.toCharArray(); // load the stream to your store trustStore.load(trustStream, null); // initialize a trust manager factory with the trusted store TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustFactory.init(trustStore); // get the trust managers from the factory TrustManager[] trustManagers = trustFactory.getTrustManagers(); // initialize an ssl context to use these managers and set as default SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(keyManagers, trustManagers, null); SSLContext.setDefault(sslContext); } 

Вы можете получить InputStream для ресурса в файле jar, но не в File . Если «вещь», которая в конечном счете считывает хранилище ключей, ожидает File или путь к файлу, ваш единственный вариант – извлечь его в файловую систему.

Вот вычищенная версия ответа пользователя2529737 , если это поможет. Он удалил ненужную настройку хранилища доверия и добавил необходимые импорт, параметры для типа хранилища ключей и пароля ключа.

 import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.KeyManager; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.security.KeyStore; public class PlainJavaHTTPS2Test { public void setUp() throws Exception { final String KEYSTOREPATH = "clientkeystore.p12"; // or .jks // store password can be null if there is no password final char[] KEYSTOREPASS = "keystorepass".toCharArray(); // key password can be null if there is no password final char[] KEYPASS = "keypass".toCharArray(); try (InputStream storeStream = this.getClass().getResourceAsStream(KEYSTOREPATH)) { setSSLFactories(storeStream, "PKCS12", KEYSTOREPASS, KEYPASS); } } private static void setSSLFactories(InputStream keyStream, String keystoreType, char[] keyStorePassword, char[] keyPassword) throws Exception { KeyStore keyStore = KeyStore.getInstance(keystoreType); keyStore.load(keyStream, keyStorePassword); KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyFactory.init(keyStore, keyPassword); KeyManager[] keyManagers = keyFactory.getKeyManagers(); SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(keyManagers, null, null); SSLContext.setDefault(sslContext); } } 
  • Защищенный модификатор доступа в Java
  • Java HttpServletRequest получает URL-адрес в браузере URL-адрес
  • Увеличение пространства кучи в Eclipse: (java.lang.OutOfMemoryError)
  • конвертировать ключ openSSH rsa в формат javax.crypto.Cipher
  • Как найти путь к текущему проекту в Java, Eclipse?
  • бросок проверен Исключения из mocks с Mockito
  • Статический анализ графика вызовов Java
  • Использование JInternalFrame и некоторой кнопки
  • Сортировка объектов Java с использованием нескольких ключей
  • Синхронизация не конечного поля
  • Ожидается BEGIN_ARRAY, но BEGIN_OBJECT в строке 1 столбца 2
  • Interesting Posts

    ClassFormatError: Отсутствует атрибут кода в методе, который не является родным или абстрактным в файле classа javax / mail / MessagingException

    Как составить график данных банковского счета в Excel с таблицей изменений баланса?

    Разница между parseInt и valueOf в java?

    Распространение Anaconda Ошибка Python

    OAuth 2.0: Преимущества и варианты использования – почему?

    PCIE для USB / Thunderbolt для видеокарты

    TileProvider с использованием локальной плитки

    Как вручную запускать HTTP-запросы POST с помощью Firefox или Chrome?

    Может ли FFmpeg конвертировать mp3-файлы в m4a в полном объеме, т. Е. С копированием как аудио-, так и видеопотоков (jpeg cover)?

    Убийство streamа после определенного срока в Java

    Как подключить ноутбуки win7 и устройства Android с помощью Wi-Fi

    Включите пространство для отсутствия уровня фактора, используемого для эстетики заливки в geom_boxplot

    Невозможно загрузить альтернативную ОС или Live CD

    Как протрите карту microSD, на которую я не могу писать?

    В C # требуется «this» ключевое слово?

    Давайте будем гением компьютера.