viernes, 6 de noviembre de 2015

JMeter: Certificados Cliente SSL

Uno de los retos que presentan las pruebas de rendimiento con JMeter es la construcción de escenarios de pruebas de rendimiento que utilicen certificados cliente SSL (en formato *.pfx/*.p12).

Existen en la red diferentes recursos que permiten obtener información acerca de cómo conseguir grabar y reproducir escenarios JMeter que utilicen certificados cliente, sin embargo la preparación de este tipo de pruebas suele ser bastante costosa y se acaba por invertir un gran esfuerzo. 
Esta entrada, únicamente quiere centralizar la información ya expuesta en otras páginas y proveer algunos consejos y ayudas para que la configuración de las pruebas se acorte en el tiempo teniendo en cuenta unicamente el punto de vista de las pruebas de rendimiento.


La entrada más completa que hemos encontrado acerca de este tema se encuentra en: https://blog.flood.io/mutual-two-way-ssl-with-jmeter/ por lo que os recomendamos que la visitéis con independencia de que lo expuesto en esta entrada resuelva otras dudas.

Definiciones Previas

 Antes de comenzar veamos algunas definiciones previas:
  • Truststore: Es un almacén de certificados con claves públicas. En general, almacenará certificados de entidades de confianza (por ejemplo en formato *.cer, *.pem, etc...) necesarios para negociar la conexión SSL entre el navegador y el servidor.
  • Keystore: Es un almacén de certificados de claves privadas (por ejemplo en formato *p12 o *.pfx) encargados de asegurar que las comunicaciones con el servidor se realiza de manera privada y segura.  

Antes de empezar

Antes de dar ningún paso, conviene empezar por recopilar y asegurarnos que tenemos un entorno correcto para empezar:
  1. Comprobar las Versiones de JAVA:  Debemos comprobar que las versiones de JRE utilizadas por el navegador que utilizaremos en la grabación (IE, Firefox, Chrome, etc.. ) y por el cliente JMeter coinciden tanto en versión, como si son para 32 bits/64 bits.
  2. Java Secure Socket Extension (JSSE) instalado y configurado:  Debemos asegurarnos que nuestra JRE dispone de las clases JSSE de java y que se encuentran instaladas correctamente:
  3. Antes de la grabación, asegurarnos que la aplicación funciona correctamente haciendo uso de los certificados que tenemos instalados.
  4. Disponer localmente de los certificados necesarios para la realización de las pruebas: Debemos disponer de manera local de los certificados en formato *.p12 y/o *.pfx, y en caso de ser necesarias, las passwords de los mismos.
    • Si las pruebas de involucran que cada uno de los usuarios simulados utilice un certificado cliente diferente, será necesario disponer de tantos certificados como usuarios concurrentes (threads) simulemos en las pruebas.
    • En caso de no disponer de ellos físicamente, será necesario realizar una exportación desde algún navegador, o generarlos de manera expresa para las pruebas.
  5. Generar el Truststore: Este paso, en general, no será necesario y únicamente lo tendremos que dar si  durante la grabación de scripts encontramos el siguiente problema en los logs de JMeter

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: 
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target

    • En caso de que recibamos en JMeter un error generaremos el Trustore haciendo uso de la herramienta Keytool:

$> keytool -importcert -alias MyPublicCert_1 -file PublicCertificate_1.cer -keystore MyTruststore.jks -storepass password


    • Repetir este paso para cada certificado_x.cer. Al final MyTrustore.jks contendrá todos los certificados necesarios.
  1. Generar el Keystore: Deberemos generar el Keystore de claves privadas (certificados *.p12/*.pfx). Podemos introducir en él, tantos certificados como vayamos a utilizar mediante la utilidad Keytool:

$> keytool -importkeystore -destkeystore MyKeystore.jks -srckeystore qatecnico_1.p12 -srcstoretype pkcs12 -alias MyPrivateCert_1 

    • Una vez finalizado el proceso podemos comprobar los certificados almacenados en nuestro Keystore:
$> keytool -list -v -keystore MyKeystore.jks 

Grabación

Para realizar la grabación, empezaremos por arrancar JMeter indicando los almacenes de certificados creados, tenemos dos opciones:
  • ·         Mediante línea de comandos:
$> jmeter -Djavax.net.ssl.trustStore=[path]\MyTruststore.jks –
Djavax.net.ssl.keyStore=[path]\Mykeystore.jks –
Djavax.net.ssl.keyStorePassword=password –
Jhttps.use.cached.ssl.context=false -t MyKeystore.jmx

  • ·         Modificando las mismas propiedades en el fichero system.properties de JMeter:

# SSL properties (moved from jmeter.properties)
 
# See http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/J
SSERefGuide.html#Customization
# for information on the javax.ssl system properties
 
#Truststore properties (trusted certificates)
javax.net.ssl.trustStore=[path]\MyTrustStore.jks
javax.net.ssl.trustStorePassword=password
#javax.net.ssl.trustStoreType [default = KeyStore.getDefaultType()]
 
Keystore properties (client certificates)
# Location
javax.net.ssl.keyStore==[path]\Mykeystore.jks
#
#The password to your keystore
javax.net.ssl.keyStorePassword=password

  • Si en las pruebas se van a utilizar varios certificados será necesario fijar en  JMeter.properties, la propiedad:
o    https.use.cached.ssl.context=false
o   O, alternativamente introducirla en la línea de comando de arranque de JMeter, como se mostraba más arriba.

Ejecución

Una vez realizada nuestra grabación, podremos lanzar nuestro escenario:


    •   Variable: Es el nombre con el que podemos direccionar el alias del certificado que será utilizado en cada iteración/thread. Podemos tenerlos almacenados en un fichero CSV y direccionar esta variable a una de las columnas. En el caso de la imagen, la variable ${MyCert}, apuntará en cada iteración/thread al alias correcpondiente del certificado en el Keystore. 
    • Alias Star/End: Número de certificados almacenados e nuestro Keystore teniendo en cuenta que el primero se direcciona con el índice 0.

Factores a tener en cuenta

  • En la grabación utilizar HttpClient4
  • Si solo utilizamos un certificado de clave privada, podemos obviar la generación de keystore y direccionar directamente nuestro certificado en formato *.p12 al arrancar JMeter.
  • En caso de utilizar varios certificados de claves privadas, el alias asignado al generar el KeyStore es el que nos permitirá direccionar los diferentes certificados mediante el uso de una variable.
  • En caso de utilizar un KeyStore con varios certificados en la ejecución debemos arrancar JMeter con:  
    •  https.use.cached.ssl.context=false
  • Debemos prestar especial cuidado a las diferentes passwords que asignamos a los certificados y a los keystores.



2 comentarios:

  1. Hola, esto a alguien le puede servir, la ruta en jmeter.properties para las entradas javax.net.ssl.trustStore y javax.net.ssl.keyStore solo me funciona si uso forward slashes (/) para la ruta. Un saludo.

    ResponderEliminar
  2. Me gustó mucho la redacción, felicidades!!!

    Yo ya me pude ver los precios certificados ssl

    ResponderEliminar