Reading Time: 6 minutes

A autenticação por parte dos utilizadores em múltiplos serviços dentro da organização é uma necessidade fundamental para a operação do dia a dia. Não só a autenticação dos utilizadores é importante, com a crescente corrente de perigos e ameaças é cada vez mais fundamental a existência de um modelo de autenticação que verifique ambas as partes, tanto os utilizadores como os serviços.

Neste artigo vai ser exposto um caso exemplo, sobre como implementar uma PKI (Public Key Infrastructure) interna numa organização. Em seguida, é apresentada a configuração de um servidor web (Apache) com autenticação da parte do cliente e da parte do servidor, usando certificados digitais, e por fim, vai também ser configurado um serviço OCSP (Online Certficate Status Protocol) para verificar a validade e revogação de certificados.

NOTA: Convém salientar que esta configuração foi realizada numa máquina com o SO CentOS7 instalado; no entanto, a larga maioria dos passos/comandos endereçados são similares noutras distribuições, podendo haver pequenas alterações na sua sintaxe.

Criação de PKI com OpenSSL

Para começar, deve-se instalar o OpenSSL na máquina:
yum install openssl

Em seguida; por gosto pessoal, e para manter alguma estrutura e organização na pasta onde vão estar os ficheiros gerados para a CA (Entidade Certificadora); acedemos ao directório da CA em (/etc/pki/CA) e criam-se 3 novas directorias:

cd /etc/pki/CA
#guardar as chaves;
mkdir private

#guardar os requests de certs a serem assinados pela CA;
mkdir requests

#certificados gerados;
mkdir certs

#pasta para os certificados no formato PKCS12;
mkdir pkcs12

Depois dos pequenos passos preparatórios pode-se iniciar a criação da PKI, começando pela CA:

#Criação da Chave da CA
openssl genrsa -des3 -out /etc/pki/CA/private/cakey.pem

#Criação do certificado da CA
openssl req -new -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/ca.crt

#Criação do certificado x509 da CA
openssl x509 -req -days 3650 -in /etc/pki/CA/ca.crt -out /etc/pki/CA/cacert.pem -signkey /etc/pki/CA/private/cakey.pem

Pode-se validar as informações no certificado x509 com o comando:

openssl x509 -in /etc/pki/CA/cacert.pem -text

Antes de prosseguir com a criação dos certificados para os serviços ou utilizadores ,deve-se ainda executar mais alguns passos adicionais, nomeadamente:

#criação da diretoriade controlo interno OpenSSL
mkdir /etc/pki/CA/newcerts

#Ficheiro que serve como BD ao OpenSSL com a info dos certificados emitidos
touch /etc/pki/CA/index.txt

#Ficheiro com o número sequencial de certificados emitidos
echo 01 > /etc/pki/CA/serial

Criação de um utilizador

De seguida pode-se criar um utilizador validado pela CA interna. Para esse efeito, podemos executar os seguintes comandos:

#criação de uma chave para o utilizador
openssl genrsa -des3 -out /etc/pki/CA/private/hvalentim.key

#Criação de um CSRF para o utilizador
openssl req -new -key /etc/pki/CA/private/hvalentim.key -out /etc/pki/CA/requests/hvalentim.csr

#emissão do certificado com base no CSR 
openssl ca -in /etc/pki/CA/requests/hvalentim.csr -cert /etc/pki/CA/cacert.pem -keyfile /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/certs/hvalentim.crt

#exportar certificado em formato PKCS12
openssl pkcs12 -export -out /etc/pki/CA/pkcs12/hvalentim.p12 -inkey /etc/pki/CA/private/hvalentim.key -in /etc/pki/CA/certs/hvalentim.crt -certfile /etc/pki/CA/cacert.pem

NOTA: Durante o processo de criação do certificado; no campo CN; deve-se colocar o nome do utilizador.

Apache e Certificados

Depois da criação do utilizador com sucesso, é agora altura de criar um certificado para o servidor Apache e, em seguida, configurá-lo para usar o certificado.

A criação do certificado pode ser conseguida através dos seguintes comandos:

#criação de uma chave para o Apache
openssl genrsa -des3 -out /etc/pki/CA/private/web.key

#Criação de um CSRF para o Apache
openssl req -new -key /etc/pki/CA/private/web.key -out /etc/pki/CA/requests/web.csr

#emissão do certificado com base no CSR 
openssl ca -in /etc/pki/CA/requests/web.csr -cert /etc/pki/CA/cacert.pem -keyfile /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/certs/web.crt

NOTA: No campo CN deve-se colocar o TLD (Top Level Domain) do servidor web, por ex. “teste.com”. Neste caso, em específico, o domínio escolhido foi “seguranca.ssl”. Posteriormente, e para a que a máquina consiga traduzir este domínio, pode-se adicionar uma entrada no ficheiro “/etc/hosts”.

Com o certificado criado, pode-se proceder com a instalação do Apache:

#INSTALAÇÃO APACHE
yum install httpd
systemctl start httpd
systemctl enable httpd

#configuração da Firewall
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload

Em seguida, é necessário fazer alterações às configurações do ssl (https) do Apache. Para isso, é necessário ed o ficheiro “/etc/httpd/conf.d/ssl.conf” e modificar as linhas necessárias:

nano /etc/httpd/conf.d/ssl.conf
   SSLCertificateFile /etc/pki/CA/certs/web.crt
   SSLCertificateKeyFile /etc/pki/CA/private/web.key
   SSLCACertificateFile /etc/pki/CA/cacert.pem

Finalmente, é necessário reiniciar o serviço:

systemctl restart httpd

Nesta altura, pode-se abrir um navegador de Internet  e colocar no endereço “seguranca.ssl” e ver que o apache está a funcionar, como mostrado na imagem seguinte:

Em contraste, se agora  colocar na barra “https://seguranca.ssl” deve ser emitido um erro (como mostrado na imagem seguinte) devido ao facto de o certificado não ser reconhecido uma vez que foi auto-assinado (self-signed) pela CA não confiável (not trusted); e que é interna. A maneira clássica para resolver esta situação é a de adicionar uma excepção para a página clicando em “Avançado”.

Como neste caso está a ser tratado um caso de uma organização que está a criar uma PKI interna, o ideal é adicionar o certificado da CA ao navegador de Internet, assim todos os sites/utilizadores validados pela CA serão reconhecidos.

Aqui fica demonstrado como fazer essa importação com o navegador Firefox. As configurações podem depender um pouco do navegador utilizado, e os sistemas antivírus endpoint-protection também podem ter influência nessa configuração.

Para avançar com essa tarefa é necessário aceder ao menu de “Preferências” do Firefox;

De seguida, abrir a tab “Privacidade e Segurança”, e em seguida “Ver Certificados”;

Na tab “Autoridades” clicar em “importar” e escolher o certificado da CA “cacert.pem”;

Pode-se ver os detalhes do certificado no processo de importação;

Deve, de seguida, escolher o tipo de permissões para a nova CA;

Após a importação da CA para o navegador, podemos  fazer refresh da página e observar que o browser reconhece agora o novo domínio como seguro.

 

Autenticação de Clientes

Chegou agora a altura de validar que só os utilizadores com certificados têm acesso ao servidor web (apache) que foi configurado na secção anterior.

Para tal, é necessário novamente editar o ficheiro “/etc/httpd/conf.d/ssl.conf” e descomentar as linhas seguintes:

nano /etc/httpd/conf.d/ssl.conf
   #UNCOMENT
   SSLVerifyClient require
   SSLVerifyDepth  10

Em seguida, deve ser reiniciado o  serviço novamente:

systemctl restart httpd

Neste momento, e voltando via navegador web ao endereço “https://seguranca.ssl”, não é possível carregar a página. É apresentado um erro como o ilustrado na imagem seguinte.

Isto deve-se ao facto de neste momento o Apache apenas autorizar utilizadores com a CA configurada anteriormente  aceder à página. Para resolver este problema deve-se importar o certificado do utilizador para o navegador.

Para executar essa tarefa, deve-se aceder novamente à área de gestão de certificados, e desta vez, na tab “Os seus certificados”, importar o certificado do utilizador;

Neste momento, e tentando novamente abrir a página pelo navegador de Internet,  deve-se ver algo como na imagem seguinte, onde o navegador solicita ao utilizador qual o certificado que pretende utilizar (para o caso de ter mais que uma opção):

Após a validação, a página abrirá novamente.

OCSP – Revogação e validação de certificados

Com a autenticação de clientes já configurada, é altura de tratar do problema da revogação de certificados.

É comum em instituições ser necessário revogar certificados antes do fim da sua data de validade (por exemplo se um colaborador deixar de pertencer a essa instituição). A forma mais comum de informar os serviços, destas revogações é através de uma lista de revogação (CRL).

O maior problema com esta abordagem é que após a criação (ou alguma actualização) a uma CRL é necessário distribuir manualmente (embora se possa automatizar a tarefa) pelas diferentes máquinas e serviços que possam necessitar dessa informação.

Existe, no entanto, uma outra solução que é disponibilizar um serviço web que responde a pedidos dessa natureza e verifica assim a validade dos certificados revogados.

Disponibilização do serviço OCSP

A primeira etapa é disponibilizar o serviço em si. Neste cenário, tal pode ser obtido com um único comando, mas é necessário também configurar a firewall:

#Configuração da Firewall
firewall-cmd --add-port=81/tcp --permanent
firewall-cmd --reload

#Colocar OCSP em funcionamento
openssl ocsp -index /etc/pki/CA/index.txt -port 81 -rsigner /etc/pki/CA/cacert.pem -rkey /etc/pki/CA/private/cakey.pem -CA /etc/pki/CA/cacert.pem -text -out /var/log/ocsp_log.txt

Neste momento, o serviço encontra-se a correr na porta 81. Para optimização o ideal é criar um serviço para executar este comando, ou de maneira mais simples, colocar o comando num ficheiro de boot, como por exemplo o “/etc/rc.local” ( um detalhe que não será abordado neste tutorial).

Com o serviço a correr, devemos configurar o Apache para fazer a validação dos certificados via o OCSP. Para isso, devemos adicionar ao ficheiro “/etc/httpd/conf.d/ssl.conf” as seguintes linhas:

nano /etc/httpd/conf.d/ssl.conf
   SSLOCSPEnable on
   SSLOCSPDefaultResponder http://localhost:81
   SSLOCSPOverrideResponder off

E reiniciar o Apache:

systemctl restart httpd

NOTA: Neste caso o campo SSLOCSPDefaultResponder tem o valor “http://localhost:81” pois o Apache e OCSP correm na mesma máquina. Em caso contrário, deve-se sempre substituir “localhost” pelo IP/Domínio da máquina onde corre o serviço OCSP.

Para além de configurar o Apache para validar a revogação dos certificados dos clientes via OCSP, também é importante configurar o navegador de Internet  para validar o certificado. No caso do Firefox, tal pode ser obtido nas configurações, como mostrado na imagem seguinte.

Neste momento é a altura mais oportuna para ver o OCSP em ação na revogação de um certificado.

Para revogar o certificado usa-se o seguinte comando:

openssl ca -revoke /etc/pki/CA/certs/hvalentim.crt -keyfile /etc/pki/CA/private/cakey.pem -cert /etc/pki/CA/cacert.pem

De seguida tentando aceder pelo navegador de Internet ao endereço “https://seguranca.ssl” pode-se observar o erro de certificado revogado.

E também se pode observar o mesmo na máquina onde corre o serviço OCSP abrindo o log (definido no comando do OCSP) neste caso “/var/log/ocsp_log.txt”

Como é possível observar, combinar certificados digitais permite obter um ambiente PKI confiável para protecção robusta de identidade, um ecossistema autenticando ponto a ponto e também garantindo a integridade desse mesmo dispositivo.

Espero que achem útil mais este tutorial. Deixem os vossos comentários, sugestões e dúvidas.