Orientações para o uso de Certificados Digitais
Introdução
O propósito deste documento é orientar o cliente que integrará seu produto com o e-SiTef 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 e-SiTef 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
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
Chrome
Internet Explorer
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 e-SiTef com servidores de clientes
O e-SiTef 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 e-SiTef, 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 e-SiTef 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 e-SiTef 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 comodominio.com
outestes.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.
- Um certificado emitido para
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 e-SiTef. Esta exigência no ambiente de homologação do e-SiTef 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
ezlib1.dll
. Copie esses arquivos no diretório:Windows\System32
. - Copie o arquivo
openssl.exe
existente em%APACHE_HOME%/bin
para o diretórioopenssl
. - Copie o arquivo
openssl.cnf
existente em%APACHE_HOME%/conf
para o diretórioopenssl
.
openssl.cnf
Configuração do openssl: 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 requestLogo 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çãohttpd-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 IP200.###.###.###
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: