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:
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.
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.
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: