Como configuro o apache para usar client certificates

O usuário do navegador pode se autenticar usando um certificado digital como
por exemplo o e-cpf, para isso devemos configurar o apache e a nossa aplicação
para ler as informações passadas e autenticar o usuário. Vamos ver como
fazer isso no apache.

CONFIGURANDO O APACHE

Devemos acessasr o arquivo de configuração (em sites-available) e configurar o conf desejado , por exemplo: default-ssl.conf.

SSL options

No arquivo conf devemos adicionar a seguinte configuração:

1
2
SSLOptions +ExportCertData +StdEnvVars 
SSLCACertificateFile /usr/share/ca-certificates/mozilla/serasa_rfb_v5.crt

Devemos ter o arquivo com a cadeia certificadora desejada, como por exemplo o da serasa (serasa_rfb_v5.crt).

O arquivo serava_rfb_v5.crt foi gerado com o seguinte comando:

1
$ cat ICP-Brasilv5.crt AC_Secretaria_da_Receita_Federal_do_Brasil_v4.crt AC_Serasa_RFB_v5.crt > serasa_rfb_v5.ca_bundle

Esta é a configuração mais fácil , o problema desta configuração é que vai funcionar apenas para os certificados emitidos
pela serasa, para colocar para funcionar para todos você deve usar o malfadado SSLCACertificatePath .

SSLCACertificatePath

Este parâmetro é um dos parâmetros mais complicados de configurar que existe. Para funcionar você deve criar um diretório com os códigos hash dos arquivos crt que deseja trabalhar. O pulo do gato é como criar este diretório.

Os arquivos hash devem seguir o formato HHHHHHHH.D , mas qual o algoritmo de hash qual o valor de D,
a primeira dica é que o apache usa este formato por causa do openssl e é nele que se encontra a solução.

O openssl tem uma ferramenta chamada c_rehash que
monta os links para você, mas antes de executar a ferramenta você vai precisar dos arquivos com os certificados.

Caso você queira trabalhar com o ICP-BRASIL estes certificados podem ser pegos no link.

Coloque todos os certificados em uma pasta acessível pelo apache e então execute o comando:

1
c_rehash -v ./

O comando vai criar os links para os ceritificados com o formato esperado pelo apache.

Então você pode usar o SSLCACertificatePath apontando para a pasta com os certificados:

1
SSLCACertificatePath "/caminho/certificados/"

Substitua o SSLCACertificateFile pelo SSLCACertificatePath, apesar de que você pode usar ambos.

Location

Agora falta apenas definir o caminho que desejamnos aplicar a verificação, para
isso crie um location com a configuração:

1
2
3
4
5
6
7
8
9
10
11
<Location /meulocal/ca/>
SSLVerifyClient optional_no_ca
SSLVerifyDepth 10

RequestHeader set clientVerify "%{SSL_CLIENT_VERIFY}s"
RequestHeader set clientId "%{SSL_CLIENT_S_DN_CN}s"
RequestHeader set SSL_CLIENT_V_END "%{SSL_CLIENT_V_END}s"
RequestHeader set SSL_CLIENT_CERT "%{SSL_CLIENT_CERT}s"

ProxyPass http://localhost:3000/api/
</Location>

Agora você pode autenticar os seus usuário usando e-cpf.

Pronto !

Links

https://www.iti.gov.br/repositorio/84-repositorio/489-certificados-das-acs-da-icp-brasil-arquivo-unico-compactado
http://openssl.cs.utah.edu/docs/apps/c_rehash.html