Ir para o conteúdo

Automações da Web e autenticação SSL

Alguns sites podem exigir autenticação SSL para acesso. Muitas vezes, podemos ver esse requisito nos sites do governo.

Você pode facilmente superar esse problema configurando o certificado SSL no seu sistema operacional, mas isso limita o número de credenciais diferentes que você pode usar para executar seus scripts de automação em paralelo na mesma máquina.

Aqui, descreveremos um método para superar esse problema usando o Firefox e convertendo o certificado SSL em um banco de dados de certificado NSS que pode ser usado pelo Firefox para autenticação no site.

Atenção

Certifique-se de usar o navegador Firefox, pois outros navegadores não suportam a solução abaixo.

Pré-requisitos

Para converter o certificado SSL em um banco de dados de certificado NSS, você precisará instalar as ferramentas NSS.

Você pode baixar os binários pré-construídos para as ferramentas NSS do repositório BotCity Files.

Depois de baixar o arquivo, extraia o conteúdo para uma pasta em seu computador.

Embora você possa criar as ferramentas NSS a partir da fonte, é recomendável que você use o gerenciador de pacotes da sua distribuição para instalá-lo.

Aqui está como fazer isso com as distribuições Linux mais comuns:

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

Para todas as outras distribuições, consulte o seu gerenciador de pacotes para obter o nome de pacote adequado.

A maneira mais fácil de obter as ferramentas NSS para macOS é usar o gerenciador de pacotes Homebrew.

brew install nss

Convertendo o certificado SSL em um banco de dados de certificado NSS

Após a instalação das ferramentas NSS, para converter um certificado SSL em um banco de dados de certificado NSS, precisaremos do arquivo p12 ou pfx e a senha associada a ele.

O comando que usaremos para converter o certificado em um banco de dados que pode ser usado pelo Firefox é o comando pk12util. Você pode encontrar mais informações sobre este comando na página de manual do pk12util.

Aqui está a estrutura de comando:

pk12util -i <p12 or pfx path file> -d <path to save files> sql:. -W <certificate password> -K <slot password>

Certifique-se de substituir <p12 or pfx path file> pelo caminho para o arquivo p12 ou pfx, definir uma pasta para salvar os arquivos, passando o caminho em <path to save files> e substituir <certificate password> pela senha associada ao certificado.

Importante

Usando o sistema operacional Windows, certifique-se de abrir o terminal no mesmo local onde está a ferramenta NSS para o que não ocorra erro no comando.

O comando acima criará um arquivo de banco de dados no diretório especificado no <path to save files> chamado cert9.db.

Usando o banco de dados de certificados NSS com o Web Framework do BotCity

Agora que temos um banco de dados de certificado NSS, podemos usá-lo com nosso navegador Firefox.

Para isso, aproveitaremos a propriedade options da classe WebBot e configuraremos o parâmetro user data dir para apontar para a pasta em que o arquivo cert9.db está localizado.

Isso será para que o navegador copie o conteúdo deste diretório para um diretório temporário no sistema e use-o como diretório de dados do usuário.

Aqui está como seria:

# Para Firefox
from botcity.web.browsers.firefox import default_options
# Importa para o WebBot
from botcity.web import WebBot, Browser, By


...
caminho_certificado_db = "<sua_pasta_com_arquivo_cert9.db>/"

bot = WebBot()

# Obtenha as opções padrão para o navegador do Firefox
options = default_options(headless=bot.headless, user_data_dir=caminho_certificado_db)

# Configure as opções a serem usadas pelo WebBot
bot.options = options

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

...
String caminhoCertificadoDb = "<sua_pasta_com_arquivo_cert9.db>/";

// Obtenha as opções padrão para o navegador do Firefox
FirefoxConfig firefoxConfig = new FirefoxConfig();
MutableCapabilities options = firefoxConfig.defaultOptions(
        isHeadless(), // Definindo o modo headless (usando o padrão)
        getDownloadPath(), // Definindo o caminho da pasta de download (usando o padrão)
        caminhoCertificadoDb // Definindo o diretório de dados do usuário
);

// Configure as opções a serem usadas pelo webbot
setOptions(options);

...

Exemplo: Usando o certificado SSL para acessar o site badssl.com

badssl.com oferece um conjunto de páginas de teste, incluindo uma com autenticação de certificado de cliente SSL.

Obtendo o certificado

Você pode baixar o certificado do site badssl.com ou da tabela abaixo.

Download Password Format
badssl.com-client.p12 badssl.com PKCS #12

Importante

Certifique-se de baixar o arquivo PKCS #12 e não o arquivo PEM.

Preparando o banco de dados de certificação NSS

Com o certificado baixado, podemos convertê-lo em um banco de dados de certificado NSS.

Abra um terminal na pasta onde o certificado está localizado e execute o seguinte comando:

pk12util -i <path>\\badssl.com-client.p12 -d <path to save files> sql:. -W badssl.com -K ""

Importante

Certifique-se de manter o parâmetro -K recebendo uma string vazia "", como no exemplo acima. Espaços ou valores definidos neste parâmetro pode resultar em um comportamento não esperado, onde mesmo passando o certificado via navegador, ele continua solicitando a senha através de um pop-up do sistema.

Importante

Usando o sistema operacional Windows, certifique-se de abrir o terminal no mesmo local onde está a ferramenta NSS para o que não ocorra erro no comando.

Você acabará com os seguintes arquivos no diretório definido no <path to save files>:

  • cert9.db: Este é o banco de dados do certificado NSS que será usado pelo Firefox.
  • key4.db: Este é o banco de dados de chaves NSS que será usado pelo Firefox.
  • pkcs11.txt: Este é o arquivo de configuração NSS PKCS #11 que será usado pelo Firefox.
  • badssl.com client.p12: este é o certificado que foi baixado.

Usando o banco de dados de certificado NSS

Não entraremos nos detalhes de como criar o projeto Webbot, pois ele já está abordado nos tutoriais Python e Java.

Então, aqui vamos assumir que você já possui um projeto Webbot padrão configurado e pronto para uso.

Vamos começar abrindo o site badssl.com para este teste de autenticação de certificado.

Adicione uma chamada ao método browse no seu bot apontando para https://client.badsssl.com/ .

Se você executar seu webbot como está, sem as alterações para usar o banco de dados do certificado NSS, receberá a seguinte mensagem de erro.

400Error

Então agora, vamos aplicar as alterações conforme descrito acima para configurar nosso WebBot com o certificado.

Seu código deve ser parecido com isso:

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


def main():
    bot = WebBot()

    # Configure se deve ou não funcionar no modo sem cabeça
    bot.headless = False

    # Mude para o Firefox
    bot.browser = Browser.FIREFOX

    # Descomente se você precisar substituir o caminho do webdriver
    # bot.driver_path = "<>/geckodriver"

    # O caminho para a nossa pasta de banco de dados de certificado
    caminho_certificado_db = "<sua_pasta_com_arquivo_cert9.db>/"

    # Obtenha as opções padrão para o Firefox com o certificado
    # pasta de banco de dados como diretório de dados do usuário
    options = default_options(
        headless=bot.headless,
        user_data_dir=caminho_certificado_db
    )

    # Defina as opções para o navegador
    bot.options = options

    # badssl.com Site de teste de certificado de cliente.
    bot.browse("https://client.badssl.com/")

    # Espere 5 segundos antes da limpeza
    bot.sleep(5000)

    # Para o navegador o limpa
    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 se deve ou não funcionar no modo sem cabeça
        setHeadless(false);

        // Mude para o Firefox
        setBrowser(Browser.FIREFOX);

        // Uncomment se você precisar substituir o caminho do webdriver
        // SetDriverPath ("<>/Geckodriver.exe")

        // O caminho para a nossa pasta de banco de dados de certificado
        String caminhoCertificadoDb = "<sua_pasta_com_arquivo_cert9.db>/";

        // Obtenha as opções padrão para o Firefox com o certificado
        // pasta de banco de dados como diretório de dados do usuário
        FirefoxConfig firefoxConfig = new FirefoxConfig();
        MutableCapabilities options = firefoxConfig.defaultOptions(
                isHeadless(), // Configurando o modo sem cabeça (usando o padrão)
                getDownloadPath(), // Definindo o caminho da pasta de download (usando o padrão)
                caminhoCertificadoDb // Definindo o diretório de dados do usuário
        );
        // Defina as opções para o navegador
        setOptions(options);

        // badssl.com Site de teste de certificado de cliente
        browse("https://client.badssl.com/");

        // Espere 5 segundos antes da limpeza
        wait(5000);

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        // Pare o navegador e o limpe
        stopBrowser();
    }
}
...

Depois de terminar o código, você pode executar o bot e verá a seguinte mensagem indicando que a autenticação do certificado foi bem sucedida:

BadSSL Success