Certificados Auto-Assinados

Caso sua empresa ou você deseje rodar um servidor web que só é usado por conhecidos, ou se quiser autenticar usuários conhecidos para conectar em sua máquina/acessar um serviço de VPN corporativo, então você não precisará pagar ou utilizar uma CA oficial para criar esses certificados. Você tem a opção de se tornar uma CA e criar quantos certificados quiser (isso é especialmente útil em servidores de VPN em empresas)

Usar um certificado auto-assinado (self signed), não significa que os dados que trafegam entre as duas pontas estarão inseguros, a principal diferença é que o sistema precisará ter a CA que você gerou instalada manualmente para que o certificado de cliente autentique como confiável a conexão.

Você precisará manter a sua chave CA privada segura, para prevenir que invadores utilize-a pra emitir certificados fraudulentos, mas isso é incontestavelmente não mais inseguro que confiar em uma CA de terceiros manter sua chave privada segura (como o caso da Diginotar mostrou).

Você já deve ter notado que se o navegador encontra um certificado emitido por uma CA auto-assinada, ele alertará que não se trata de uma fonte não confiável, ou em um repositório de certificados raíz conhecidos do navegador. Desta forma, ao instalar o certificado CA na máquina ou navegador dos usuários que precisam acessar o site, assim estes alertas serão facilmente removidos.

É impossível distribuir esse certificado para pessoas fora da organização de uma forma automatica, desta forma o uso de certificados auto-assinados são somente úteis para pessoas que precisam acessar aquela página web, seja dentro de seu grupo, de uma empresa, etc.

Beneficios de rodar uma CA própria

  • Te poupa de custos de comprar certificados SSL comerciais de uma CA autorizada, para cada dispositivo embarcado, resultando em altissima economia. Mesmo que possa gerar certificados usando LetsEncrypt, existe uma limitação de aproximadamente 200 certificados por domíno, e isso é uma limitação em economai de escala.

  • Certificados auto-assinados, cria um nível de segurança muito maior que usar certificados de terceiros, que são criados para uso em geral. Caso uma CA oficial seja comprometida, TODOS os certificados que foram emitidos por ela também estarão comprometidos e precisarão ser re-emitidos.

    Este problema simplesmente não existem em CA auto-assinadas, pois a segurança em ambas as pontas estão sob seu controle.

  • Maior granularidade no controle e níveis de acesso dos certificados gerados.

Criando Certificados Auto-Assinados

Basicamente certificados auto-assinados, possuem o campo issuer igual ao subject. Em algumas distribuições como o Debian, Ubuntu, CentOS, Mint, um certificado self-signed é criado automaticamente e por padrão e possui o nome Snake Oil para indicar que não são confiáveis, servindo apenas para criptografia básica, e uso didático, e não para utilização em ambientes de produção.

Desta forma, para criar um certificado auto-assinado gerado por você, com seus parâmetros de segurança e criptografia customizados, siga os seguintes procedimentos:

  1. Antes de gerar a chave, vamos criar a estrutura de diretórios para armazenar os certificados. Aqui usaremos a pasta /tmp/ssl/guia e /tmp/ssl/foca pra criar 'duas empresas' fictícias: uma se chamará guia e a outra... humm... foca: mkdir -p /tmp/ssl/guia /tmp/ssl/foca

  2. O primeiro passo é criar a CA para cada uma das empresas criadas. Como convenção, vamos gravar as chaves privadas geradas em arquivos .key e as chaves públicas em arquivos .crt. Caso desejar gerar o certificado sem incluir uma senha de proteção do certificado da CA, apenas remova o parametro -des3 da linha e comando:

    # Gera a chave RSA 4096 para a empresa 'guia'
    openssl genrsa -des3 -out /tmp/ssl/guia/ca.key 4096
    # Gera o certificado X509 para a empresa 'guia'
    openssl req -new -x509 -days 365 -key /tmp/ssl/guia/ca.key -out /tmp/ssl/guia/ca.crt
    
    # Gera a chave RSA 4096 para a empresa 'foca'
    openssl genrsa -des3 -out /tmp/ssl/foca/ca.key 4096
    # Gera o certificado X509 para a empresa 'foca'
    openssl req -new -x509 -days 365 -key /tmp/ssl/foca/ca.key -out /tmp/ssl/foca/ca.crt
    

    Note que após concluir esse procedimento, temos a chave RSA (com o nome ca.key) e o certificado privado da CA (com o nome ca.crt).

  3. O segundo passo é criar o certificado do servidor. Ele é chamado assim, pois será instalado no serviço que fornecerá acesso a clientes (como um sevidor web NgINX, Apache, Postfix, VPN, etc). O primeiro passo é gerar os certificados, que serão assinados em seguida:

    
    # Gera o certificado privado do 'guia'
    openssl genrsa -des3 -out /tmp/ssl/guia/servidor.key 4096
    # Gera o certificado privado do 'foca'
    openssl genrsa -des3 -out /tmp/ssl/foca/servidor.key 4096
    
    

    Caso deseje gerar certificados sem senhas, remova o parametro -des3 do comando.

  4. Assim que tiver os certificados de servidores privados, precisaremos gerar um CSR (Certificate Signing Request). O CSR é simplesmente um arquivo de requisição de assinatura, que você envia para a CA para que ela devolva o certificado assinado, e usaremos isso para criar o certificado público.

    Quando ele pergutnar pelo Common Name para a empresa guia, coloque guiafoca.teste e da empresa foca será focalinux.teste:

    
    # Gera CSR para a empresa guia
    openssl req -new -key /tmp/ssl/guia/servidor.key -out /tmp/ssl/guia/servidor.csr
    # Cria o certificado publico assinando com a CA 'guia'
    openssl x509 -req -days 365 -in /tmp/ssl/guia/servidor.csr -CA /tmp/ssl/guia/ca.crt -CAkey /tmp/ssl/guia/ca.key -set_serial 01 -out /tmp/ssl/guia/servidor.crt
    
    # Gera CSR para a empresa foca
    openssl req -new -key /tmp/ssl/foca/servidor.key -out /tmp/ssl/foca/servidor.csr
    # Cria o certificado publico assinando com a CA 'foca'
    openssl x509 -req -days 365 -in /tmp/ssl/foca/servidor.csr -CA /tmp/ssl/foca/ca.crt -CAkey /tmp/ssl/foca/ca.key -set_serial 01 -out /tmp/ssl/foca/servidor.crt
    

    Voce poderá ainda fornecer uma senha desafio junto aos atributos extras:

    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []: Sua_senha_aqui
    An optional company name []: Sua_senha_aqui
    

Concatenando os Certificados gerados

Como estamos usando certificados de 2 empresas e auto-assinados, preciaremos enviar ambos os certificados e nossa CA para nos identificarmos. Este procedimento é bastante simples, e usaremos a simples concatenação de arquivos. Faremos o mesmo com as chaves privadas:

cat /tmp/ssl/guia/ca.crt /tmp/ssl/guia/servidor.crt > /tmp/ssl/guia/all.crt
cat /tmp/ssl/guia/ca.key /tmp/ssl/guia/servidor.key > /tmp/ssl/guia/all.key

Agora para o certificado foca:

cat /tmp/ssl/foca/ca.crt /tmp/ssl/foca/servidor.crt > /tmp/ssl/foca/all.crt
cat /tmp/ssl/foca/ca.key /tmp/ssl/foca/servidor.key > /tmp/ssl/foca/all.key

Configurando o Apache e Virtual Hosts

Assim que tivermos todos os certificados que precisamos, nós poderemos testar se temos acesso ao site via SSL. Faremos o seguinte procedimento:

  1. Crie o diretório /etc/apache2/ssl: mkdir /etc/apache2/ssl

  2. Crie um arquivo guiafoca.conf em /etc/apache2/sites-available com o conteúdo:

      <VirtualHost *:443>
        ServerName guiafoca.teste
    
        DocumentRoot /var/www/html
    
        SSLEngine On
        SSLCertificateFile /etc/apache2/ssl/all.crt
        SSLCertificateKeyFile /etc/apache2/ssl/all.key
        SSLCACertificateFile /etc/apache2/ssl/ca.crt
      </VirtualHost>
      
  3. Ative o site recém gerado com: a2ensite guiafoca

  4. Ative o módulo ssl do Apache com o comando: a2enmod ssl

  5. Reinicie o servidor Apache com: apache2ctl reload

Após isso, terá um site configurado para servidor SSL na porta 443. Para exibir uma página web padrão, crie um arquivo /var/www/html/index.php com o seguinte conteúdo:

<?php

print_r($_SERVER);

Testando a conexão SSL

Novamente utilizaremos o canivete suiço dos profissionais de segurança: o curl. Utilizaremos ele para fazer a conexão usando SSL e validarndo o site: curl https://guiafoca.teste

Durante a execução da abertura do SSL, o curl executará as seguintes ações:

  1. Ele tentará autenticar o certificado SSL padrão, usando as chaves instaladas no sistema operacional. Caso esse certificado não esteja instalado, você pode orientar o curl a abrir o certificado correto, apontando ele diretamente para o certificando gerado usando o parametro --cacert [arquivo].

  2. Se obter um erro de certificado expirado, ou problemas relacionados as verificações de certificado, você poderá usar a opção --insecure / -k no curl para ignorar validações de certificado, assumindo que o mesmo é confiável e permitindo o uso de criptografia para tráfego de dados.

Por exemplo, para permitir a abertura de um site usando um certificado sem retornar erros:

  • Validando o certificado auto-assinado: curl --cacert /tmp/ssl/foca/ca.crt https://guiafoca.teste

  • Ignorando a validação de auto-assinado: curl --ignore /tmp/ssl/foca/ca.crt https://guiafoca.teste

Sobre certificados usando Curva Eliptica

A técnica de criptografia usando Curva Eliptica (ECC) é bastante recente, e os certificados gerados por ela são bem menores em tamamnho que os gerados usando RSA. Nem por causa do tamanho reduzido sua segurança é menor: Um certifica ECC de 224 bits possui segurança igualmetne forte se comparada a um certificado 2048 bits, embora consuma bem menos CPU.

Devido a essas características, certificados ECC devem ser preferenciais quando utilizar dispositivos embarcados ou quando o o número de acessos a um determinado tiver um grande número de concorrencias.

Programas para gerenciamento de CA usando ambiente gráfico e WEB

Esta sessão documenta uma série de programas e suas características que podem ser usados para gerenciar uma CA de forma mais fácil. Algumas ferramentas possuem profundo nível de maturidade, assim como o openssl e algumas são voltadas para facilidade, apenas gerando o certificado e facilitando seu gerenciamento:

  • TinyCA - Um dos melhores, suportam muitos algoritmos e permitem trabalhar com CAs independentes

  • Xca - Muito bom, baseado em qt, e salva os dados em banco de dados criptografado.

  • easy-rsa - Voltado principalmente a gerencia de certificados no OpenVPN. Não é muito usado para gerenciamento de CA de forma customizada.

  • GnoMint - Somente usa SHA1 como assinatura e o desenvolvimento não é mais ativo. Google Microsoft consideram SHA1 obsoleto nos produtos desde 2017.

  • FreeIPA - Possui o módulo de gerenciamento de certificados em sua interface gráfica, embora tenha como funcionaldiade principal o provimento de autenticação no sistema.

  • SimpleAuthority - Este é pago, e possui excelentes recursos de gerenciamento de certificados. O programa simpleAuthority pode ser usado para gerenciar as CAs, rodando em Linux, Windows, MacOS.