Ir para o conteúdo

Lab 1.7: Utilizando Certificados Digitais

Alguns sites requerem autenticação via SSL para acesso, podemos ver esse tipo de requerimento em sites de governo.

Você pode facilmente superar esse problema configurando o certificado SSL em 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.

Descreveremos um método para superar esse problema convertendo o certificado SSL em um banco de dados de certificado NSS, o qual pode ser utilizado pelo Firefox para autenticação no site.

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é-criados para as ferramentas NSS do repositório BotCity Files .

Após baixar o arquivo, extraia o conteúdo para uma pasta em seu computador.

Embora você possa criar as ferramentas NSS a partir do código-fonte, é recomendável usar o gerenciador de pacotes de sua distribuição para instalá-lo.

Veja 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, verifique 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 instaladas as ferramentas NSS, para converter um certificado SSL em um banco de dados de certificados NSS, precisaremos do arquivo p12 ou pfx e da 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 esse comando na página de manual do pk12util.

Aqui está a estrutura do 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.

Utilizando o banco de dados de certificados NSS com o Web Framework da BotCity

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

Para isso, vamos aproveitar a propriedade options da classe WebBot e configurar o parâmetro user data directory para apontar para a pasta onde está localizado o arquivo cert9.db.

Isso fará com que o navegador copie o conteúdo desse diretório para um diretório temporário no sistema e utilize-o como o diretório de dados do usuário.

O código fica assim:

# Opções para Firefox
from botcity.web import WebBot
from botcity.web.browsers.firefox import default_options

...
bot = WebBot()

certificate_db_path = "<sua pasta com arquivo cert9.db>/"

# Obtendo as opções padrão e configurando o diretorio do certificado
options = default_options(headless=bot.headless, user_data_dir=certificate_db_path)

# Configurando as opcoes a serem utilizadas pelo WebBot
bot.options = options

...

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

Obtenção do Certificado

Você pode baixar o certificado no site badssl.com ou na 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 certificados NSS

Com o certificado baixado, podemos convertê-lo em um banco de dados de certificados NSS através do seguinte comando:

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

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ê terminará com os seguintes arquivos no diretório definido no <path to save files>:

  • cert9.db: Este é o banco de dados de certificados 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 certificados NSS

Não entraremos em detalhes sobre como criar o projeto WebBot, pois já foi abordado nas etapas anteriores.

Portanto, aqui assumiremos que você já tem 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 em seu bot apontando para https://client.badssl.com/.

Ao executar seu WebBot como está, sem as alterações para usar o banco de dados de certificados NSS, receberá a seguinte mensagem de erro:

400Error

Agora, vamos aplicar as alterações descritas acima para configurar nosso WebBot com o certificado:

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


def main():
    # Configurando modo Headless ou não
    bot.headless = False

    # Selecionando Firefox
    bot.browser = Browser.FIREFOX

    # Descomente para configurar o caminho do webdriver
    # bot.driver_path = "<>/geckodriver"

    # Caminho para a pasta com o certificado
    certificate_db_path = "<sua pasta com arquivo cert9.db>/"

    # Obtendo opcoes padrão com pasta do banco de dados NSS
    # como pasta de usuario do navegador
    options = default_options(
        headless=bot.headless,
        user_data_dir=certificate_db_path
    )

    # Configurando as opções no navegador
    bot.options = options

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

    # Aguardando 5 segundos antes de encerrar
    bot.sleep(5000)

    # Encerrando e liberando recursos
    bot.stop_browser()


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

if __name__ == '__main__':
    main()

Após terminar as alterações no código e executar o bot, verá a seguinte mensagem indicando que a autenticação do certificado foi bem-sucedida:

BadSSL Success