sexta-feira, 21 de março de 2008

Autenticação X.509 (e-cpf) e FORM no Tomcat, simultâneamente

Nessa semana tive um desafio interessante: como fazer uma aplicação que está rodando no Tomcat suportar tanto a autenticação comum (FORM ou BASIC) quanto via e-cpf (certificado cliente X.509), simultâneamente.

O Previne é uma aplicação voltada para empresas que fazem uso de regimes especiais da receita federal e tipicamente é acessada tanto pela empresa que a contrata quanto por fiscais da receita federal. A demanda era fazer com que o Previne suportasse a autenticação atual (FORM) no uso interno da empresa e via e-cpf para uso externo pelos fiscais da receita.

Fiz o trabalho de pesquisa tradicional e achei o excelente material Controle de Acesso com Certificação Digital usando JCE e JSSE desenvolvido por Ricardo Koji Ushizaki. Depois de construir o servlet de teste conforme indica a apresentação, me deparei com o fato de um mesmo web.xml não suportar duas marcações auth-method. A princípio pensei em usar uma válvula (Tomcat Valve) customizada, conforme o exemplo do wiki do tomcat, mas não fiquei muito seguro do funcionamento.

Finalmente optei pela seguinte solução: criei uma segunda aplicação autenticada via e-cpf que consiste somente de um servlet que redireciona para a aplicação destino e usei o recurso de single sign on do Tomcat. Dessa forma o usuário é autenticado na primeira aplicação e redirecionado para a segunda sem ter que passar por uma nova autenticação.

A grande vantagem que vi nessa solução foi que a aplicação original não sofreu nenhum tipo de manutenção e a aplicação que faz a autenticação ficou genérica, recebendo como parâmetro de contexto o caminho destino do redirecionamento de modo que pode ser usada com outras aplicações sem nenhuma alteração.

4 comentários:

Anônimo disse...

Walter, Estou precisando fazer a mesma autenticacao que voce fez para o pessoal da receita. Poderias estar passando mais detalhes? O que é checado no cartao, gravo alguma coisa?

Obrigado..


Jr
hunter@4u.com.br

Walter disse...

Oi Jr. Usando o Tomcat vc "nem vê" o cartão. As informações chegam direto para o realm através da classe java.security.cert.X509Certificate

Sds,

Walter

Michel disse...

Boa noite,
Como faço para pedir o certificado do cliente somente quando o mesmo clicar no login via certificado digital?, pois uma vez configurado o tomcat para clientAuth o certificado será solicitado ao acessar o sistema.

Walter disse...

Oi Michel.
Boa pergunta... uma forma que me vem à cabeça rapidamente é usando 2 IPs, aí vc pode configurar um com clientAuth="false" e o outro com clientAuth="true".