Entendo a PKI razoavelmente bem do ponto de vista conceitual - ou seja, chaves privadas / chaves públicas - a matemática por trás delas, uso de hash e criptografia para assinar um certificado, Assinatura digital de transações ou documentos etc. Também trabalhei em projetos em que openssl As bibliotecas C foram usadas com certificados para garantir a comunicação e a autenticação. Também estou extremamente familiarizado com as ferramentas de linha de comando openssl.
No entanto, tenho muito pouca experiência com projetos habilitados para PKI baseados na Web e, portanto, estou tentando criar e codificar um projeto pessoal para entender melhor isso.
Os requisitos
Este é o site de um banco. Todos os usuários do Internet Banking podem usar qualquer certificado emitido por algumas CAs conhecidas (verisign, Thawte, confiar etc.). O Banco não é responsável por adquirir certificados para o usuário. Esses certificados serão usados para autenticação no site dos bancos. As plataformas / SO etc ainda não foram corrigidas.
Projeto
Eu queria saber qual é a melhor maneira de fazer autenticação.
Eu vi que o Apache tem uma maneira de habilitar o SSL de 2 vias - nesse caso, acho que a navegação no site solicitaria automaticamente um certificado ao usuário. Mas não tenho certeza se isso é suficiente, porque parece que tudo o que verifica é se um certificado é assinado por uma CA confiável e também pode ser se ele se enquadra em uma lista branca de linhas de assunto dos certificados etc. Mas isso não é suficiente para um caso bancário, porque você precisa associar um ID do usuário do banco a um certificado.
O IIS parece ter uma maneira pela qual eu posso ter um certificado armazenado para cada usuário no Active Directory. Isso é o que eu entendi ao ler alguns artigos do MSDN. Você ativa o SSL bidirecional no IIS e, quando o usuário tenta navegar para o site, o IIS envia uma solicitação ao navegador com uma lista de CAs aprovadas e o navegador permite que o usuário escolha um certificado apropriado em seu armazenamento certeiro e o envie para back-end. Estou assumindo que o IIS fará duas coisas
- Verifique se o usuário possui a chave privada correspondente ao certificado (nas negociações de cobertura)
- Com base no mapeamento de certificado de usuário do AD, o IIS reportará o nome de usuário ao aplicativo.
Faça a autenticação explicitamente chamando funções de criptografia, dependendo da dependência do servidor da web para fazê-lo.
- Mostre uma tela de usuário em que ele carrega um certificado e o aplicativo garante que o usuário tenha a chave privada correspondente ao certificado (solicitando ao front-end que assine alguma string usando o certificado).
- O aplicativo possui um banco de dados, onde alguns dados são armazenados, permitindo que cada usuário seja mapeado para sua identificação de usuário. Isso pode ser
- todo o certificado correspondente a cada ID do usuário
- o número de série da CA e do certificado correspondente a cada ID de usuário.
Eu queria saber qual é o método mais usado? quais são as melhores práticas? Se eu for com o # 3, quais são as melhores maneiras de fazer isso?
Algo que também pode funcionar facilmente com aplicativos para smartphones será um bônus adicional.
Atualizar
Deixe-me esclarecer minha afirmação "codifique a parte da autenticação", porque algumas das respostas parecem indicar que ela foi mal interpretada - o que é ruim por não ser clara.
Isso não significa que eu mesmo escreva coisas criptográficas. Significa apenas que, na verdade, chamarei rotinas criptográficas explicitamente, em vez de depender do IIS ou de qualquer outro servidor da Web, implicitamente.