|
JMeter example source code file (SSLManager.java)
The JMeter SSLManager.java source code/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.jmeter.util; import java.io.File; import java.io.FileInputStream; import java.net.HttpURLConnection; import java.security.KeyStore; import java.security.Provider; import java.security.Security; import javax.swing.JOptionPane; import org.apache.jmeter.gui.GuiPackage; import org.apache.jmeter.util.keystore.JmeterKeyStore; import org.apache.jorphan.logging.LoggingManager; import org.apache.jorphan.util.JOrphanUtils; import org.apache.log.Logger; /** * The SSLManager handles the KeyStore information for JMeter. Basically, it * handles all the logic for loading and initializing all the JSSE parameters * and selecting the alias to authenticate against if it is available. * SSLManager will try to automatically select the client certificate for you, * but if it can't make a decision, it will pop open a dialog asking you for * more information. * * TODO? - N.B. does not currently allow the selection of a client certificate. * */ public abstract class SSLManager { private static final Logger log = LoggingManager.getLoggerForClass(); private static final String SSL_TRUST_STORE = "javax.net.ssl.trustStore";// $NON-NLS-1$ private static final String KEY_STORE_PASSWORD = "javax.net.ssl.keyStorePassword"; // $NON-NLS-1$ public static final String JAVAX_NET_SSL_KEY_STORE = "javax.net.ssl.keyStore"; // $NON-NLS-1$ private static final String PKCS12 = "pkcs12"; // $NON-NLS-1$ /** Singleton instance of the manager */ //@GuardedBy("this") private static SSLManager manager; private static final boolean isSSLSupported = true; private static final Provider sslProvider = null; /** Cache the KeyStore instance */ private JmeterKeyStore keyStore; /** Cache the TrustStore instance - null if no truststore name was provided */ private KeyStore trustStore = null; // Have we yet tried to load the truststore? private volatile boolean truststore_loaded=false; /** Have the password available */ protected String defaultpw = System.getProperty(KEY_STORE_PASSWORD); /** * Resets the SSLManager so that we can create a new one with a new keystore */ public static synchronized void reset() { SSLManager.manager = null; } public abstract void setContext(HttpURLConnection conn); /** * Default implementation of setting the Provider */ protected void setProvider(Provider provider) { if (null != provider) { Security.addProvider(provider); } } /** * Opens and initializes the KeyStore. If the password for the KeyStore is * not set, this method will prompt you to enter it. Unfortunately, there is * no PasswordEntryField available from JOptionPane. */ protected JmeterKeyStore getKeyStore() { if (null == this.keyStore) { String defaultName = JMeterUtils.getJMeterProperties() .getProperty("user.home") // $NON-NLS-1$ + File.separator + ".keystore"; // $NON-NLS-1$ String fileName = System.getProperty(JAVAX_NET_SSL_KEY_STORE, defaultName); log.info("JmeterKeyStore Location: " + fileName); try { if (fileName.endsWith(".p12") || fileName.endsWith(".P12")) { // $NON-NLS-1$ // $NON-NLS-2$ this.keyStore = JmeterKeyStore.getInstance(PKCS12); log.info("KeyStore created OK, Type: PKCS 12"); System.setProperty("javax.net.ssl.keyStoreType", PKCS12); // $NON-NLS-1$ } else { this.keyStore = JmeterKeyStore.getInstance("JKS"); // $NON-NLS-1$ log.info("KeyStore created OK, Type: JKS"); } } catch (Exception e) { this.keyStore = null; throw new RuntimeException("Could not create keystore: "+e.getMessage()); } FileInputStream fileInputStream = null; try { File initStore = new File(fileName); if (initStore.exists()) { fileInputStream = new FileInputStream(initStore); this.keyStore.load(fileInputStream, getPassword()); log.info("Keystore loaded OK from file, found alias: "+keyStore.getAlias()); } else { log.warn("Keystore file not found, loading empty keystore"); this.defaultpw = ""; // Ensure not null this.keyStore.load(null, ""); } } catch (Exception e) { log.error("Problem loading keystore: " +e.getMessage()); } finally { JOrphanUtils.closeQuietly(fileInputStream); } log.debug("JmeterKeyStore type: " + this.keyStore.getClass().toString()); } return this.keyStore; } /* * The password can be defined as a property; this dialogue is provided to allow it * to be entered at run-time. * * However, this does not gain much, as the dialogue does not (yet) support hidden input ... * */ private String getPassword() { String password = this.defaultpw; if (null == password) { this.defaultpw = System.getProperty(KEY_STORE_PASSWORD); if (null == defaultpw) { synchronized (this) { this.defaultpw = JOptionPane.showInputDialog( GuiPackage.getInstance().getMainFrame(), JMeterUtils.getResString("ssl_pass_prompt"), // $NON-NLS-1$ JMeterUtils.getResString("ssl_pass_title"), // $NON-NLS-1$ JOptionPane.QUESTION_MESSAGE); System.setProperty(KEY_STORE_PASSWORD, this.defaultpw); } } password = this.defaultpw; System.setProperty(KEY_STORE_PASSWORD, password); } return password; } /** * Opens and initializes the TrustStore. * * There are 3 possibilities: * - no truststore name provided, in which case the default Java truststore should be used * - truststore name is provided, and loads OK * - truststore name is provided, but is not found or does not load OK, in which case an empty * truststore is created * * If the KeyStore object cannot be created, then this is currently treated the same * as if no truststore name was provided. * * @return truststore * - null: use Java truststore * - otherwise, the truststore, which may be empty if the file could not be loaded. * */ protected KeyStore getTrustStore() { if (!truststore_loaded) { truststore_loaded=true;// we've tried ... String fileName = System.getProperty(SSL_TRUST_STORE); if (fileName == null) { return null; } log.info("TrustStore Location: " + fileName); try { this.trustStore = KeyStore.getInstance("JKS"); log.info("TrustStore created OK, Type: JKS"); } catch (Exception e) { this.trustStore = null; throw new RuntimeException("Problem creating truststore: "+e.getMessage()); } FileInputStream fileInputStream = null; try { File initStore = new File(fileName); if (initStore.exists()) { fileInputStream = new FileInputStream(initStore); this.trustStore.load(fileInputStream, null); log.info("Truststore loaded OK from file"); } else { log.info("Truststore file not found, loading empty truststore"); this.trustStore.load(null, null); } } catch (Exception e) { throw new RuntimeException("Can't load TrustStore: " + e.toString()); } finally { JOrphanUtils.closeQuietly(fileInputStream); } } return this.trustStore; } /** * Protected Constructor to remove the possibility of directly instantiating * this object. Create the SSLContext, and wrap all the X509KeyManagers with * our X509KeyManager so that we can choose our alias. */ protected SSLManager() { } /** * Static accessor for the SSLManager object. The SSLManager is a singleton. */ public static final synchronized SSLManager getInstance() { if (null == SSLManager.manager) { SSLManager.manager = new JsseSSLManager(SSLManager.sslProvider); // if (SSLManager.isSSLSupported) { // String classname = null; // classname = "org.apache.jmeter.util.JsseSSLManager"; // $NON-NLS-1$ // // try { // Class clazz = Class.forName(classname); // Constructor con = clazz.getConstructor(new Class[] { Provider.class }); // SSLManager.manager = (SSLManager) con.newInstance(new Object[] { SSLManager.sslProvider }); // } catch (Exception e) { // log.error("Could not create SSLManager instance", e); // $NON-NLS-1$ // SSLManager.isSSLSupported = false; // return null; // } // } } return SSLManager.manager; } /** * Test whether SSL is supported or not. */ public static final boolean isSSLSupported() { return SSLManager.isSSLSupported; } } Other JMeter examples (source code examples)Here is a short list of links related to this JMeter SSLManager.java source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.