Repository navigation
email smime
Important
Em desenvolvimento (2.0). Ainda não está numa versão lançada e pode mudar.
Nível: intermediário
Em uma frase: TRALSMIME assina e cifra mensagens com certificado digital
(S/MIME 4.0), no formato que Outlook, Thunderbird e Apple Mail entendem, e confere e
abre as que chegam assinadas ou cifradas.
Você vai precisar: o pacote RALModuleMailPackage (e-mail) e um
certificado de e-mail com a chave privada (arquivo PFX/P12, ou PEM). Não precisa de
OpenSSL: a criptografia é do próprio RAL.
uses RALMailMIME, RALSMIME;
FSMIME := TRALSMIME.Create(Self);
FSMIME.PFXFile := 'C:\MeuApp\certificado.pfx';
FSMIME.PFXPassword := 'senha';
vSaida := TMemoryStream.Create;
try
FSMIME.Sign(vMsg, vSaida); // multipart/signed
vSaida.Position := 0;
FSMTP.SendRaw('vendas@minhaempresa.com.br', vDestinatarios, vSaida);
finally
vSaida.Free;
end;Para cifrar, você precisa do certificado (só a parte pública) de cada destinatário:
FSMIME.Encrypt(vMsg, [vCertCliente], vSaida); // TRALX509Certificate; ou SignAndEncrypt
FSMIME.Encrypt(vMsg, TextoPEMDosCertificados, vSaida); // ou os certificados em PEM-
Cipher: AES-256-CBC (o que todo programa abre) ou AES-GCM (S/MIME 4.0, mais moderno; nem todo programa antigo abre). -
KeyTransport: RSA-OAEP (recomendado) ou o RSA antigo, para destinatários velhos. -
EncryptToSelfcifra também para o seu certificado, para você conseguir abrir a cópia que guardou.
var
vInfo: TRALSMIMEInfo;
begin
FSMIME.Open(vRecebida, vMsg, vInfo); // decifra e confere, em qualquer ordem
if vInfo.Signed and not vInfo.Valid then
Avisar('assinatura inválida: ' + vInfo.Error);TRALSMIMEInfo diz se veio assinada (Signed, SignatureValid), se o certificado
valia na hora da assinatura (CertificateValid), se a cadeia chega a um certificado em
que você confia (ChainTrusted, com TrustedCertificates), quem assinou
(SignerSubject, SignerEmail) e se veio cifrada (Encrypted, ContentCipher).
- Certificado no repositório do Windows e token A3 (PKCS#11): por enquanto só arquivo PFX ou PEM.
- PFX antigos com 3DES (o padrão até a OpenSSL 1.1): exporte de novo com AES
(
openssl pkcs12 -export ... -certpbe AES-256-CBC -keypbe AES-256-CBC). - Chaves EC, assinaturas PSS, listas de revogação (CRL) e OCSP.
- O assunto (
Subject) vai em claro, como em quase todo programa de e-mail.
| sintoma | causa | o que fazer |
|---|---|---|
ERALSMIME ao ler o PFX |
PFX com 3DES | exporte de novo com AES (acima) |
| o destinatário não consegue abrir | AES-GCM num programa antigo |
Cipher AES-256-CBC |
ChainTrusted falso com assinatura válida |
a autoridade não está em TrustedCertificates
|
inclua o certificado da autoridade |
Começar
Servidor
- Rotas e parâmetros
- Rotas avançadas: tipos, grupos, versões 🚧
- Ler o pedido e responder
- Objetos no corpo 🚧
- Resposta em fluxo 🚧
- Plugins 🚧
- Serviços (contêiner de dependências) 🚧
- Barramento de eventos 🚧
- Autenticação
- Banco de dados (DBWare)
- Servir site e arquivos
- JSON-RPC 2.0 🚧
- Servidor MCP (IA) 🚧
-
Protocol Buffers 🚧
- gRPC 🚧
- WebSocket 🚧
- Hubs (WebSocket) 🚧
- Swagger e Postman
- Servidor SOAP 🚧
- WS-Security 🚧
- HTTPS
- Criptografia ponto a ponto
- Segurança para produção
- Colocar no ar
- Desempenho
- Testes em memória 🚧
MQTT 🚧
- O que é e quando usar 🚧
- Cliente MQTT 🚧
- Broker MQTT 🚧
- MQTT-SN 🚧
- Ponte REST 🚧
- Segurança 🚧
- Rede ruim 🚧
E-mail 🚧
- Mensagens 🚧
- Enviar 🚧
- Receber 🚧
- Ler a caixa postal 🚧
- Verificar o que chega 🚧
- Servir caixas postais 🚧
- S/MIME 🚧
- OpenPGP 🚧
Chatbot 🚧
- O robô e os canais 🚧
- Telegram 🚧
- Gateways REST (WhatsApp não oficial) 🚧
- Discord 🚧
- Slack 🚧
- Microsoft Teams 🚧
- Conversa em etapas 🚧
Cliente
Motores
- Qual motor escolher?
- Compatibilidade
- Recursos
- QUIC
- Motor NgHttp2 (HTTP/2) 🚧
- Motor XSocket 🚧
- Motor AdvancedHTTP (experimental) 🚧
Avançado
Ajuda
- Problemas comuns
- Atualizar o Indy
- Várias versões do Delphi
- Vídeos e guias
- Módulos de terceiros
- Licenças
- Contribuir
- Roadmap e changelog
🚧 = em desenvolvimento, pode mudar