Saltar a contenido

Automatización web y autenticación SSL

Algunos sitios web pueden requerir autenticación SSL para el acceso. A menudo podemos ver este requisito en sitios web gubernamentales.

Puede superar fácilmente este problema configurando el certificado SSL en su sistema operativo, pero esto limita la cantidad de credenciales diferentes que puede usar para ejecutar sus scripts de automatización en paralelo en la misma máquina.

Aquí describiremos un método para superar este problema utilizando Firefox y convirtiendo el certificado SSL en una base de datos de certificados NSS que puede ser utilizada por Firefox para autenticarse con el sitio web.

Advertencia

Asegúrese de usar el navegador Firefox, ya que otros navegadores no admiten la solución a continuación.

Prerrequisitos

Para convertir el certificado SSL en una base de datos de certificados NSS, deberá instalar las Herramientas NSS.

Puede descargar los binarios precompilados de las Herramientas NSS desde el repositorio de archivos de BotCity.

Después de descargar el archivo, extraiga el contenido en una carpeta en su computadora.

Si bien puede compilar las Herramientas NSS desde el código fuente, se recomienda que utilice el administrador de paquetes de su distribución para instalarlo.

Aquí le mostramos cómo hacerlo con las distribuciones de Linux más comunes:

apt-get install libnss3-tools
yum install nss-tools
dnf install nss-tools
apk add nss
pacman -S nss

Para todas las demás distribuciones, consulte el administrador de paquetes para obtener el nombre del paquete correcto.

La forma más sencilla de obtener las Herramientas NSS para macOS es utilizar el administrador de paquetes Homebrew.

brew install nss

Conversión del certificado SSL en una base de datos de certificados NSS

Después de instalar las Herramientas NSS, para convertir un certificado SSL en una base de datos de certificados NSS, necesitaremos el archivo p12 o pfx y la contraseña asociada.

El comando que utilizaremos para convertir el certificado en una base de datos que pueda ser utilizada por Firefox es el comando pk12util. Puede encontrar más información sobre este comando en la página del manual de pk12util.

Aquí está la estructura del comando:

pk12util -i <ruta del archivo p12 o pfx> -d <ruta para guardar los archivos> sql:. -W <contraseña del certificado> -K <contraseña del slot>

Asegúrese de reemplazar <ruta del archivo p12 o pfx> con la ruta al archivo p12 o pfx, establezca una carpeta para guardar los archivos pasando la ruta a <ruta para guardar los archivos> y reemplace <contraseña del certificado> por la contraseña asociada con el certificado.

Importante

Al utilizar el sistema operativo Windows, asegúrese de abrir la terminal en el mismo lugar donde se encuentra la herramienta NSS para evitar errores en el comando.

El comando anterior creará un archivo de base de datos en el directorio especificado en <ruta para guardar los archivos> llamado cert9.db.

Uso de la base de datos de certificados NSS con el marco web de BotCity

Ahora que tenemos una base de datos de certificados NSS, podemos usarla con nuestro navegador Firefox.

Para ello, aprovecharemos la propiedad de opciones de la clase WebBot y configuraremos el parámetro directorio de datos de usuario para que apunte a la carpeta en la que se encuentra el archivo cert9.db.

De esta manera, el navegador copiará el contenido de este directorio en un directorio temporal del sistema y lo utilizará como directorio de datos de usuario.

Esto es cómo se vería:

# For Firefox
from botcity.web.browsers.firefox import default_options
# Import for the Web Bot
from botcity.web import WebBot, Browser, By

...
certificate_db_path = "<your folder with the cert9.db file>/"

bot = WebBot()

# Get the default options for the Firefox browser
options = default_options(headless=bot.headless, user_data_dir=certificate_dir)

# Configure the options to be used by the WebBot
bot.options = options

...
// For Firefox
import dev.botcity.framework.web.browsers.FirefoxConfig;

...
String certificateDbPath = "<your folder with the cert9.db file>/";

// Get the default options for the Firefox browser
FirefoxConfig firefoxConfig = new FirefoxConfig();
MutableCapabilities options = firefoxConfig.defaultOptions(
        isHeadless(), // Setting headless mode (using default)
        getDownloadPath(), // Setting the download folder path (using default)
        certificateDbPath // Setting the user data directory
);

// Configure the options to be used by the WebBot
setOptions(options);

...

Ejemplo: Uso de un certificado SSL para acceder al sitio web badssl.com

badssl.com ofrece un conjunto de páginas de prueba, incluida una con autenticación de certificado de cliente SSL.

Obtención del certificado

Puede descargar el certificado desde el sitio web de badssl.com o desde la tabla a continuación.

Descargar Contraseña Formato
badssl.com-client.p12 badssl.com PKCS #12

Importante

Asegúrese de descargar el archivo PKCS #12 y no el archivo PEM.

Preparación de la base de datos de certificados NSS

Con el certificado descargado, podemos convertirlo en una base de datos de certificados NSS.

Abra una terminal en la carpeta donde se encuentra el certificado y ejecute el siguiente comando:

pk12util -i <ruta>\\badssl.com-client.p12 -d <ruta para guardar los archivos> sql:. -W badssl.com -K ""

Advertencia

Asegúrese de mantener el parámetro -k recibiendo una cadena vacía "", como en el ejemplo anterior. Los espacios o valores definidos en este parámetro pueden provocar un comportamiento inesperado, donde incluso al pasar el certificado a través del navegador, continúa solicitando la contraseña a través de un cuadro emergente del sistema.

Importante

Al utilizar el sistema operativo Windows, asegúrese de abrir la terminal en el mismo lugar donde se encuentra la herramienta NSS para evitar errores en el comando.

Obtendrá los siguientes archivos en el directorio definido en <ruta para guardar los archivos>:

  • cert9.db: Esta es la base de datos de certificados NSS que se utilizará en Firefox.
  • key4.db: Esta es la base de datos de claves NSS que se utilizará en Firefox.
  • pkcs11.txt: Este es el archivo de configuración NSS PKCS #11 que se utilizará en Firefox.
  • badssl.com-client.p12: Este es el certificado que se descargó.

Uso de la base de datos de certificados NSS

No entraremos en los detalles de cómo crear el proyecto WebBot, ya que ya está cubierto en los tutoriales de Python y Java.

Así que aquí asumiremos que ya tiene un proyecto WebBot estándar configurado y listo para usar.

Comencemos abriendo el sitio web badssl.com para realizar esta prueba de autenticación de certificado.

Agregue una llamada al método browse en su bot apuntando a https://client.badssl.com/.

Si ejecuta su WebBot tal como está, sin los cambios para usar la base de datos de certificados NSS, recibirá el siguiente mensaje de error.

400Error

Entonces, ahora, apliquemos los cambios descritos anteriormente para configurar nuestro WebBot con el certificado.

Su código debería verse similar a esto:

from botcity.web import WebBot, Browser
from botcity.web.browsers.firefox import default_options


def main():
    bot = WebBot()

    # Configure whether or not to run on headless mode
    bot.headless = False

    # Switch to Firefox
    bot.browser = Browser.FIREFOX

    # Uncomment if you need to override the WebDriver path
    # bot.driver_path = "</geckodriver>"

    # The path to our certificate database folder
    certificate_db_path = "<your folder with the cert9.db file>/"

    # Get the default options for Firefox with the certificate
    # database folder as the user data directory
    options = default_options(
        headless=bot.headless,
        user_data_dir=certificate_db_path
    )

    # Set the options for the browser
    bot.options = options

    # badssl.com client certificate test website.
    bot.browse("https://client.badssl.com/")

    # Wait 5 seconds before cleanup
    bot.sleep(5000)

    # Stop the browser and clean up
    bot.stop_browser()

def not_found(label):
    print(f"Element not found: {label}")

if __name__ == '__main__':
    main()
import dev.botcity.framework.bot.WebBot;
import dev.botcity.framework.web.browsers.Browser;
import dev.botcity.framework.web.browsers.FirefoxConfig;
import org.openqa.selenium.MutableCapabilities;

...
@Override
public void action(BotExecution botExecution) {

    try {
        // Configure whether or not to run on headless mode
        setHeadless(false);

        // Switch to Firefox
        setBrowser(Browser.FIREFOX);

        // Uncomment if you need to override the WebDriver path
        // setDriverPath("<>/geckodriver.exe")

        // The path to our certificate database folder
        String certificateDbPath = "<your folder with the cert9.db file>/";

        // Get the default options for Firefox with the certificate
        // database folder as the user data directory
        FirefoxConfig firefoxConfig = new FirefoxConfig();
        MutableCapabilities options = firefoxConfig.defaultOptions(
                isHeadless(), // Setting headless mode (using default)
                getDownloadPath(), // Setting the download folder path (using default)
                certificateDbPath // Setting the user data directory
        );
        // Set the options for the browser
        setOptions(options);

        // Sitio web de prueba de certificado de cliente badssl.com
        browse("https://client.badssl.com/");

        // Esperar 5 segundos antes de limpiar
        wait(5000);

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        // Detener el navegador y limpiar
        stopBrowser();
    }
}
...

Una vez que hayas terminado el código, puedes ejecutar el bot y verás el siguiente mensaje que indica que la autenticación del certificado fue exitosa:

BadSSL Success