É possível configurar o servidor web para exigir autenticação com certificado emitido por uma AC específica.
No nosso caso, usamos a ICP Brasil. Feito isso, basta que o token esteja corretamente instalado (ou leitora de
cartão) para que A3 seja aceito.
No PHP é possível verificar se foi autenticado com sucesso (mas sem diferenciar, a princípio, A1 de A3).
Também é possível recuperar os dados do certificado usado para a autenticação (CPF ou CNPJ, nome, email).
Se precisar assinar alguma solicitação mais crítica, veja esse post meu em outro fórum:
http://groups.google.com.br/group/gophp/browse_thread/thread/d8ac7a250785da10/ec6ed5a63868b581
Exemplo do configuração do APACHE:
O site precisa ter um certificado SSL instalado (conexão https).
Veja essa dica:
http://www.vivaolinux.com.br/dica/Ativando-SSL-no-Apache-2/
O ideal é configurar um diretório do seu site pra solicitar o
certificado.
Exemplo: o diretório principal funciona com o https, mas sem solicitar
o certificado.
Mas se entrar no diretório "/certificado" é então solicitado.
Para solicitar um certificado você precisa informar ao Apache de qual
AC (autoridade
certificadora) você aceitará os certificados.
Não precisa ser da mesma AC que emitiu o certificado SSL do site.
Depois que você conseguir fazer o apache usar o SSL (https) é que deve
tentar
solicitar o certificado. Não tente exigir certificado antes disso,
senão você vai
acabar se perdendo nas mensagens de erro.
Para informar ao apache qual AC é válida:
SSLCACertificateFile
"/private/etc/apache2/certs/icp.crt"
/private/etc/apache2/certs/icp.crt é o caminho completo para o
certificado da AC
Para solicitar o certificado do cliente, coloque isso na configuração
do Apache:
SSLVerifyClient require
SSLVerifyDepth 4
E para passar os dados do certificado ao PHP, coloque isso na
configuração do Apache:
SSLOptions +FakeBasicAuth +ExportCertData
+StrictRequire
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
Para testar isso, crie um script PHP:
<pre>
<?php
$certBase64 = $_SERVER['SSL_CLIENT_CERT'];
$cert = openssl_x509_read( $certBase64 );
$certArray = openssl_x509_parse($cert,true);
echo "Cliente autenticado...........:
",$_SERVER['SSL_CLIENT_VERIFY'],"\n";
echo "Número de série do certificado:
0x",$_SERVER['SSL_CLIENT_M_SERIAL'],"\n";
echo "Versão do certificado.........:
",$_SERVER['SSL_CLIENT_M_VERSION'],"\n";
echo "Identificação do emissor......:
",$_SERVER['SSL_CLIENT_I_DN'],"\n";
echo "Nome..........................:
",$_SERVER['SSL_CLIENT_I_DN_CN'],"\n";
echo "Empresa.......................:
",$_SERVER['SSL_CLIENT_I_DN_O'],"\n";
echo "\n";
echo "Identificação do cliente......:
",$_SERVER['SSL_CLIENT_S_DN'],"\n";
echo "Nome..........................:
",$_SERVER['SSL_CLIENT_S_DN_CN'],"\n";
echo "E-Mail........................:
",$_SERVER['SSL_CLIENT_S_DN_Email'],"\n";
echo "Validade......................:
",$_SERVER['SSL_CLIENT_V_START'],' /
',$_SERVER['SSL_CLIENT_V_END'],"\n";
echo "\n";
echo "Protocolo SSL.................:
",$_SERVER['SSL_PROTOCOL'],"\n";
echo "Codificação...................: ",$_SERVER['SSL_CIPHER'],' -
Usando ',$_SERVER['SSL_CIPHER_USEKEYSIZE'],' bits',"\n";
echo '<hr>';
print_r($certArray);
?>
</pre>
[]'s
Reinaldo Borges
Proteja o endereço de seus amigos como estou protegendo o seu.
Ao enviar mensagens para mais de um endereço use SEMPRE o
"Cco" (cópia oculta) ou "Bcc" (Blind carbon copy).