101 lines
7.0 KiB
Markdown
101 lines
7.0 KiB
Markdown
# Certificados Digitais A1, A3 e PKCS#11
|
|
|
|
> **Guia Técnico de Suporte a Provedores Criptográficos, Hardware PC/SC e ICP-Brasil**
|
|
|
|
O **CyberCore Signer** fornece uma camada unificada de abstração para gerenciamento e consumo de certificados digitais brasileiros padrão **ICP-Brasil**, cobrindo certificados em arquivo de software (**A1**) e dispositivos físicos criptográficos em hardware (**A3** via tokens USB e cartões inteligentes smartcards).
|
|
|
|
---
|
|
|
|
## 1. Certificados Digitais A1 (Software / PKCS#12)
|
|
|
|
Os certificados padrão A1 são contêineres criptográficos protegidos por senha em formato `.pfx` ou `.p12`.
|
|
|
|
### 1.1 Arquitetura e Ciclo de Vida
|
|
1. **Importação:** O usuário seleciona o arquivo via diálogo nativo (`FileChooser`) na interface ou pelo método de importação no Dashboard.
|
|
2. **Coleta Segura de Senha:** A senha é obtida por meio do diálogo `A1PasswordDialog` e armazenada estritamente em um array de caracteres `char[]` volátil. Logo após o carregamento do `KeyStore`, o array é preenchido com zeros via `Arrays.fill(passwordChars, (char) 0)`.
|
|
3. **Instanciação JCA/JCE:** O provedor `Pkcs12CertificateProvider` inicializa um `KeyStore.getInstance("PKCS12")` e extrai o certificado X.509 e o manipulador da chave privada (`PrivateKey`).
|
|
4. **Isolamento de Memória:** A chave privada nunca é serializada, exportada para disco ou enviada em logs. Durante a assinatura, a chave privada em memória gera os bytes da assinatura via `Signature.getInstance("SHA256withRSA")`.
|
|
|
|
---
|
|
|
|
## 2. Certificados Digitais A3 no Windows (Windows Certificate Store)
|
|
|
|
No sistema operacional Microsoft Windows (Windows 10 e Windows 11), a grande maioria dos middlewares de fabricantes de tokens e smartcards registra os certificados automaticamente no repositório de certificados pessoais do usuário (`Windows-MY`).
|
|
|
|
### 2.1 Funcionamento do `WindowsCertificateStoreProvider`
|
|
* **Integração SunMSCAPI / CNG:** O agente consome o provedor JCA nativo `SunMSCAPI` (`KeyStore.getInstance("Windows-MY")`), integrando-se diretamente à CryptoAPI e à moderna Cryptography Next Generation (CNG) do Windows.
|
|
* **Preservação no Chip Físico:** A chave privada nunca sai do chip criptográfico do token. As operações de assinatura delegam a cifragem ao módulo de segurança em hardware (HSM/Token).
|
|
* **Diálogo Nativo de PIN do Fabricante:** Quando o token exige autenticação por PIN para liberar a chave privada, a janela nativa do próprio driver do fabricante (ex: diálogo nativo SafeSign ou SafeNet) é exibida com total segurança pelo subsistema de segurança do Windows.
|
|
* **Tratamento de Chaves Não Exportáveis:** O CyberCore Signer respeita integralmente a flag de chave privada não exportável, utilizando apenas referências de handle sem tentar copiar os bytes brutos da chave.
|
|
|
|
---
|
|
|
|
## 3. Acesso Direto a Hardware PKCS#11 (Tokens USB e Smartcards)
|
|
|
|
Para ambientes corporativos que requerem comunicação direta com bibliotecas de middleware ou para execução em ambientes Linux, o componente `Pkcs11CertificateProvider` interage com o driver PKCS#11 do fabricante através do módulo do JDK `jdk.crypto.cryptoki` (`SunPKCS11`).
|
|
|
|
### 3.1 Mapeamento de Middlewares Homologados no Brasil
|
|
|
|
O CyberCore Signer possui rotinas automáticas de varredura nos diretórios padrão do sistema (`System32`, `SysWOW64` no Windows e `/usr/lib/`, `/usr/local/lib/` no Linux):
|
|
|
|
| Fabricante / Modelo | Biblioteca Windows (DLL) | Biblioteca Linux (.so) | Tipo de Dispositivo |
|
|
|---|---|---|---|
|
|
| **SafeSign Identity Client** (AET / GD) | `aetpkss1.dll` | `libaetpkss.so` | Tokens e Smartcards (Certisign, Valid, Serasa) |
|
|
| **SafeNet Authentication Client** (Gemalto / Thales) | `eps2003csp11.dll`, `eTPKCS11.dll` | `libeTPkcs11.so` | Tokens eToken Pro / 5110 (Serpro, Safeweb) |
|
|
| **ACOS / Oberthur** (Idemia) | `acospkcs11.dll`, `OcsCryptoki.dll` | `libacospkcs11.so` | Smartcards e leitores de cartão |
|
|
| **Watchdata / PROXKey** | `Watchdata ProxKey PKCS11.dll` | `libwatchdata.so` | Tokens USB |
|
|
| **OpenSC (Padrão Aberto)** | `opensc-pkcs11.dll` | `opensc-pkcs11.so` | Leitores genéricos PC/SC e smartcards |
|
|
|
|
### 3.2 Configuração Dinâmica do Provedor SunPKCS11
|
|
A configuração do provedor é criada dinamicamente em memória (sem gravar arquivos temporários em disco com dados sensíveis):
|
|
|
|
```properties
|
|
name = CyberCore-Token
|
|
library = C:\Windows\System32\aetpkss1.dll
|
|
slotListIndex = 0
|
|
```
|
|
|
|
---
|
|
|
|
## 4. Monitoramento Dinâmico de Hardware (`SmartCardWatcher`)
|
|
|
|
O componente `SmartCardWatcher` executa um loop em segundo plano baseado na API padrão `javax.smartcardio` (subsistema PC/SC):
|
|
|
|
1. **Detecção de Conexão (Card Inserted):**
|
|
- Detecta quando um novo smartcard ou token USB é conectado a qualquer leitora do sistema.
|
|
- Dispara recarregamento assíncrono do repositório de certificados.
|
|
- Notifica a interface gráfica (`UIEventListener`) e emite evento de auditoria (`AUDITORIA [TOKEN_INSERTED]`).
|
|
2. **Detecção de Desconexão (Card Removed):**
|
|
- Ao detectar a remoção do dispositivo, registra imediatamente o evento de auditoria `AUDITORIA [TOKEN_REMOVED]`.
|
|
- Limpa e zera os buffers de memória de PIN mantidos pelo `PinSessionManager`.
|
|
- Força o encerramento das conexões com o leitor via `SmartCardSessionManager` para liberar handles travados no sistema operacional.
|
|
3. **Serialização de Concorrência (`signLock`):**
|
|
- Como grande parte dos drivers de smartcard e chips criptográficos físicos não suporta acesso concorrente multi-thread, todas as requisições de assinatura são processadas de forma estritamente sequencial (fila FIFO garantida por `ReentrantLock`).
|
|
|
|
---
|
|
|
|
## 5. Extração e Parsing de Identidade ICP-Brasil (OIDs X.509)
|
|
|
|
O CyberCore Signer implementa o analisador de extensões X.509 conforme os padrões da **Infraestrutura de Chaves Públicas Brasileira (ICP-Brasil)** estabelecidos pelo ITI (normas DOC-ICP-04).
|
|
|
|
As informações são extraídas da extensão `SubjectAlternativeName` (OID `2.5.29.17`) e analisadas a partir de seus identificadores de objeto (OIDs):
|
|
|
|
### 5.1 OID ICP-Brasil de Pessoa Física (e-CPF) — `2.16.76.1.3.1`
|
|
Contém uma estrutura ASN.1 com as informações cadastrais do titular:
|
|
* **Data de Nascimento:** 8 caracteres no formato `DDMMAAAA`;
|
|
* **CPF do Titular:** 11 dígitos numéricos;
|
|
* **Número do NIS/PIS/PASEP:** 11 dígitos numéricos;
|
|
* **Registro Geral (RG):** Número do documento de identidade;
|
|
* **Órgão Expedidor e UF:** Identificação do órgão emissor.
|
|
|
|
### 5.2 OID ICP-Brasil de Pessoa Jurídica (e-CNPJ) — `2.16.76.1.3.3`
|
|
Contém os dados cadastrais da empresa e do seu representante legal:
|
|
* **CNPJ da Entidade:** 14 dígitos numéricos;
|
|
* **Nome do Responsável:** Nome completo do signatário cadastrado na Receita Federal.
|
|
|
|
### 5.3 Demais OIDs Mapeados
|
|
* **OID `2.16.76.1.3.2`:** Título de Eleitor, zona e seção eleitoral.
|
|
* **OID `2.16.76.1.3.4`:** Cadastro Específico do INSS (CEI / CAEPF).
|
|
|
|
Essa extração permite ao agente preencher automaticamente o nome e documento do signatário para o SDK Web e selos visuais em PDF, garantindo conformidade com a legislação e auditoria fiscal.
|