Orientações para o uso de Certificados Digitais

Introdução#

O propósito deste documento é orientar o cliente que integrará seu produto com o Carat sobre o uso de Certificados Digitais.

O intuito deste é apresentar de forma simplificada pequenas orientações sobre o uso destes para garantir a segurança da comunicação entre o Carat e o produto do cliente.

Caso seja necessário um aprofundamento maior sobre os assuntos apresentados, sugerimos consultar outras literaturas e/ou fontes na Internet.

Certificado Digital#

O Certificado Digital ou Certificado de chave pública (apenas ‘certificado’ daqui em diante) é um documento digital que tem o propósito de certificar a identidade de uma pessoa, ou entidade na comunicação digital. Uma forma de comunicação digital segura muito utilizada na Internet é o HTTPS, que é uma abreviação de HTTP via SSL/TLS.

O certificado em geral é solicitado pela pessoa ou entidade e emitido por uma CA (Autoridade Certificadora, ou Certification Authority, em inglês) como Verisign, CertSign, etc. Um certificado válido é aquele que, entre outros requisitos, esteja dentro da sua data de validade e assinado por uma CA confiável.

Como exemplo de seu uso, quando utilizamos um browser (Firefox, Chrome, etc..) para acessar um site que oferece segurança na comunicação usando HTTPS, em geral é apresentado o certificado utilizado pelo servidor do site, em geral simbolizado por um ícone de cadeado que se localiza próximo ao local que se apresenta a URL. Clicando neste ícone cadeado é possível observar as características deste certificado.

A característica principal de um certificado é o nome para qual ele é emitido, isto é, qual é o nome identificado no certificado. Na imagem abaixo podemos visualizar as informações, onde o certificado é emitido pela CA “Network Solutions DV Server” e emitido para o nome esitef.softwareexpress.com.br

Informação do Certificado -no-filter

Certificados self-signed#

Para ambientes de testes, existem casos em que a obtenção de um certificado válido não é viável, então algumas vezes é utilizado um certificado auto-assinado ou self-signed.

Um certificado self-signed é gerado e assinado pela própria pessoa/entidade, e não é aceito como confiável para uma comunicação segura. Como exemplo, quando se acessa um site via browser via HTTPS, onde o servidor utiliza um certificado self-signed, um aviso semelhante às imagens abaixo é apresentado no browser:

Firefox#

Certificado Firefox

Chrome#

Certificado Chrome -no-filter

Internet Explorer#

Certificado IE -no-filter

Ao navegar nesses sites que utilizam certificados self-signed, temos a opção de confiar no site e acessá-los, mesmo sabendo que o certificado apresentado neles não é confiável, assumindo o risco de acessar e enviar informações para um site que não possui o certificado confiável ou até com um certificado que não possui a identidade de quem ele diz ser. Isto pode ser aplicado também na comunicação entre servidores.

Comunicação do Carat com servidores de clientes#

O Carat frequentemente se comunica com servidores de clientes via POST’s HTTPS, para validar a autenticidade da requisição, como em transações de recarga e estorno de pagamentos. Para esta comunicação, é necessário que o servidor do cliente apresente certificados válidos para garantir a segurança das informações transmitidas. No ambiente de produção do Carat, em geral todos os clientes já possuem uma infraestrutura pronta, com servidores com seus respectivos certificados válidos e assinados por CA’s reconhecidas no mercado.

Porém, na etapa de homologação, muitos sistemas ainda estão em fase de testes ou em desenvolvimento, utilizando certificados temporários, e muitas vezes self-signed. Neste caso, utilizamos uma abordagem semelhante à citada no item anterior, abrindo exceções para que o Carat confie em um servidor que apresente um certificado self-signed. Isso é feito importando-o em uma lista de certificados confiáveis. Assim facilitamos o processo de homologação dos sistemas de clientes.

Como a tecnologia utilizada no Carat segue a especificação de comunicação HTTPS RFC-2818, esta abordagem possui algumas restrições:

  • O certificado precisa estar válido, isto é, no mínimo deve estar com sua data de validade adequada para o período em uso;

  • A identificação do servidor do cliente deve ser compatível com o nome apresentado no certificado. Logo, as seguintes situações irão resultar em fracasso na comunicação:

    • Um certificado emitido para www.dominio.com não será compatível para um servidor identificado como dominio.com ou testes.dominio.com, pois são consideradas identificações diferentes.
    • Um servidor com um IP único, mas com múltiplos domínios e respectivamente múltiplos certificados, pode ser identificado de formas diferentes e inesperadas.
  • A especificação não permite certificados emitidos para o endereço IP de um servidor, a não ser que Nomes Alternativos(Subject Alternative Names) de IP’s ou domínios sejam adicionados ao certificado.

Logo, certificados que estejam em condições fora da especificação não serão aceitos na comunicação HTTPS mesmo que sejam importados na lista de certificados confiáveis no Carat. Esta exigência no ambiente de homologação do Carat acaba por preparar o cliente a fim de garantir o uso de um certificado corretamente emitido por uma CA para o sistema no ambiente de produção.

Criação de certificados self-signed#

Existem várias formas já conhecidas para gerar certificados auto-assinados ou self-signed. Aqui iremos apresentar uma delas, utilizando a ferramenta openssl, que pode ser encontrada em pacotes do servidor web Apache. Todos as referências e comandos apresentados a seguir são baseados nas versões Apache HTTP 2.2 e openssl 0.9.8 em ambiente Windows. Caso seja da preferência do cliente, um procedimento análogo pode ser executado em ambiente Linux, com as devidas ferramentas e adaptações.

Como preparação de ambiente, sugerimos:

  • Crie uma pasta separada de nome openssl (ou escolha outro nome qualquer) e copie três arquivos existentes em %APACHE_HOME%/bin: libeay32.dll, ssleay.dll e zlib1.dll. Copie esses arquivos no diretório: Windows\System32.
  • Copie o arquivo openssl.exe existente em %APACHE_HOME%/bin para o diretório openssl.
  • Copie o arquivo openssl.cnf existente em %APACHE_HOME%/conf para o diretório openssl.

Configuração do openssl: openssl.cnf#

O arquivo openssl.cnf contém as configurações para a geração de certificados. Inicialmente, crie uma cópia deste com outro nome (por exemplo openssl_editado.cnf ou um nome da sua preferência).

Sugerimos editar os seguintes campos do arquivo openssl_editado.cnf para facilitar o seu uso futuro:

  • Descomente (remova o caractere #) do início da seguinte linha:

    req_extensions = v3_req # The extensions to add to a certificate request

  • Logo abaixo, adicione ou altere valores default para os campos:

    • countryName_default = BR (ou outro país)
    • stateOrProvinceName_default = \<nome do estado>
    • localityName_default = \<Nome da cidade>
    • 0.organizationName_default = \<Nome da Empresa>
    • organizationalUnitName_default = \<nome do setor, equipe>
    • commonName_default = \<nome comum a ser registrado>
    • emailAddress_default = \<email>
  • Após o trecho:

    [ v3_req ]
    # Extensions to add to a certificate request
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  • Adicionar:

    subjectAltName=@alt_names
    [alt_names]
  • E então, logo abaixo adicionar nome alternativos ao commonName, em forma de DNS ou IP como nos exemplos abaixo, conforme necessidade de identificação do servidor:

    DNS.1 = www.dominio.com
    DNS.2 = *.dominio.com
    ...
    IP.1 = 192.168.4.34
    IP.2 = 200.122.10.66
    ...

Assim se finaliza a customização do arquivo de configuração do openssl.

Comandos openssl para gerar o certificado#

Supondo que queremos gerar um certificado de nome dominio.

  • Criar uma chave privada RSA de 2048 bits executando o seguinte comando no diretório openssl:

    openssl genrsa -out dominio.pem 2048
  • Execute o comando abaixo para requisitar a criação do certificado

    openssl req -config openssl_editado.cnf -extensions v3_req -new -out dominio.cer -keyout dominio.pem

Após a execução desse comando serão pedidos alguns dados (Pais, Estado, Cidade, Nome e Unidade da Organização, email) de preenchimento opcional e dois de preenchimento obrigatório: o Common Name que é o domínio associado ao certificado (ou o IP do servidor) e uma senha para ser associada a chave privada. Por padrão, aceite as opções default sugeridas.

  • A seguir execute o comando abaixo para criar a chave privada não protegida por senha (a senha associada à chave privada será removida). Dessa forma, a chave será legível apenas para o servidor Apache e o administrador:

    openssl rsa –in dominio.pem –out dominio.key

Após a execução desse comando será pedida a senha da chave privada.

É recomendado a remoção do arquivo .rnd, pois ele contém informações sigilosas a respeito da criação da chave. Removendo-o evita-se ataques criptográficos contra a chave privada.

  • Por último, execute o comando abaixo para criar o certificado assinado que durará um ano:

    openssl x509 -in dominio.cer -out dominio.cer -req -signkey dominio.key -days 365 -extensions v3_req extfile openssl_editado.cnf

Os arquivos dominio.cer e dominio.key serão usados no servidor.

Instalação do certificado self-signed gerado no servidor Apache#

Aqui apresentaremos um exemplo de instalação do certificado no servidor HTTP Apache 2.2.

  • Na pasta onde o Apache está instalado, abrir a pasta conf e abrir o arquivo de configuração httpd-ssl.conf;

  • Editar os seguintes itens abaixo no arquivo httpd-ssl.conf:

    ServerName <nome/dominio ou IP do servidor>

    Ex: www.dominio.com.br ou IP 200.###.###.###

    SSLCertificateFile <caminho+nome do certificado>
    Ex: `%APACHE_HOME%/conf/dominio.cer`
    SSLCertificateKeyFile <caminho+nome do arquivo de chave do certificado>

    Ex: %APACHE_HOME%/conf/dominio.key

  • Reiniciar o Apache

Verificação do certificado gerado#

Para verificar se o certificado foi gerado e instalado corretamente, abra um browser de sua preferência e digite a URL por qual o Apache responde, e clique no ícone do cadeado para abrir o certificado. As figuras abaixo ilustram a visualização do certificado em diferentes ambientes:

Detalhe do certificado no ambiente Windows#

Detalhes do Certificado 1 -no-filter

Detalhe do certificado no Firefox#

Detalhes do Certificado 2 -no-filter