72 lines
3.2 KiB
Markdown
72 lines
3.2 KiB
Markdown
# Autenticação e Login Digital via CyberCore Signer
|
|
|
|
Este documento descreve o fluxo de **Login e Autenticação de Usuários com Certificado Digital ICP-Brasil (A1 e A3)** através do agente desktop **CyberCore Signer** e o protocolo **CCSP/1**.
|
|
|
|
---
|
|
|
|
## 1. Visão Geral do Modelo de Autenticação
|
|
|
|
O login por certificado digital no CyberCore Signer adota o padrão de mercado **Challenge-Response Criptográfico**:
|
|
1. O backend da sua aplicação web gera um **desafio único (challenge / nonce)** para a sessão atual.
|
|
2. A aplicação web solicita a assinatura desse desafio ao **CyberCore Signer** através do SDK JavaScript.
|
|
3. O CyberCore Signer apresenta ao usuário na tela nativa do computador uma solicitação visual com destaque de **LOGIN / AUTENTICAÇÃO**:
|
|
- Identifica a aplicação solicitante e a origem;
|
|
- Mostra o certificado selecionado e o titular;
|
|
- Solicita aprovação expressa do usuário (e a digitação do PIN caso seja token ou smart card A3).
|
|
4. O CyberCore assina o desafio com a chave privada do certificado local e devolve:
|
|
- A **assinatura digital do desafio**;
|
|
- O **certificado X.509 completo** (DER Base64) e cadeia;
|
|
- O **nome e CPF/CNPJ** do titular extraídos do certificado.
|
|
5. O frontend web envia a resposta de volta ao backend, que:
|
|
- Valida criptograficamente a assinatura com a chave pública do certificado recebido;
|
|
- Confirma a validade e cadeia do certificado junto à ICP-Brasil;
|
|
- Localiza o usuário correspondente no banco de dados pelo CPF/CNPJ;
|
|
- Cria a sessão autenticada do usuário no sistema.
|
|
|
|
---
|
|
|
|
## 2. Exemplo de Integração Frontend com o SDK
|
|
|
|
```javascript
|
|
import { CyberCoreSigner } from '@cybercore/signer-sdk';
|
|
|
|
const signer = new CyberCoreSigner({
|
|
applicationName: 'Portal Corporativo'
|
|
});
|
|
|
|
async function realizarLoginComCertificado(certificateId) {
|
|
// 1. Obter desafio único gerado pelo seu backend
|
|
const { challenge } = await fetch('/api/auth/challenge').then(r => r.json());
|
|
|
|
// 2. Solicitar autenticação ao CyberCore Signer
|
|
const authResult = await signer.authenticate({
|
|
certificateId: certificateId,
|
|
challenge: challenge
|
|
});
|
|
|
|
// 3. Enviar assinatura e certificado ao backend para validação e abertura de sessão
|
|
const sessionResponse = await fetch('/api/auth/login-certificate', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({
|
|
challenge: authResult.challenge,
|
|
signature: authResult.signature,
|
|
certificate: authResult.certificate
|
|
})
|
|
});
|
|
|
|
if (sessionResponse.ok) {
|
|
console.log('Usuário autenticado com sucesso:', authResult.subjectName);
|
|
window.location.href = '/dashboard';
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 3. Segurança e Prevenção de Ataques
|
|
|
|
- **Prevenção de Ataques de Replay:** Cada desafio deve possuir tempo de expiração curto (ex: 60 a 90 segundos) e ser descartado no servidor após uma única tentativa.
|
|
- **Proteção da Chave Privada:** A chave privada e o PIN do usuário permanecem exclusivamente sob custódia do hardware/computador local do usuário.
|
|
- **Consentimento Explícito:** O CyberCore Signer nunca assina desafios em segundo plano sem a exibição do diálogo e autorização do usuário na tela nativa.
|