Come utilizzare un file in un jar come javax.net.ssl.keystore?

Sto provando a fare qualcosa di simile

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

Dove client.ks è un file memorizzato in com / messaggistica nel file jar che sto utilizzando.

La cosa che legge javax.net.ssl.keyStore è in attesa di un percorso per il file client.ks che si trova nel barattolo. Preferirei non estrarre il file e inserirmi sulla macchina del cliente se ansible. Quindi è ansible fare riferimento a un file in un barattolo?

Questo non funziona quando getPath () restituisce null. c’è un altro modo per fare ciò?

Sto ancora lavorando all’implementazione, ma credo che sia ansible caricare il keystore dal jar tramite InputStream e impostare in modo esplicito il TrustStore a livello di programmazione (vs impostare le proprietà di sistema). Vedi l’articolo: Impostazione di più truststore sulla stessa JVM

Ho funzionato!

 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); } 

È ansible ottenere un InputStream su una risorsa in un file jar, ma non su un File . Se la “cosa” che alla fine legge il keystore si aspetta un File o un percorso in un file, l’unica opzione è estrarla nel filesystem.

Ecco una versione ripulita della risposta dell’utente2529737 , nel caso in cui aiuta. Ha rimosso la configurazione del negozio di fiducia non necessario e ha aggiunto le importazioni richieste, i parametri per il tipo di keystore e la password della chiave.

 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); } }