Skip to content
mobius1qwe edited this page Nov 13, 2026 · 1 revision

Home > E-mail > S/MIME

Assinar e cifrar com S/MIME

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.

Assinar

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;

Cifrar

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.
  • EncryptToSelf cifra também para o seu certificado, para você conseguir abrir a cópia que guardou.

Abrir o que chega

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).

O que fica de fora

  • 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.

Erros comuns

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

Veja também

Começar

Servidor

MQTT 🚧

E-mail 🚧

Chatbot 🚧

Cliente

Motores

Avançado

Ajuda

🚧 = em desenvolvimento, pode mudar

Clone this wiki locally