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