最常见的内容类型是 SignedData:包含内容(分离签名时只包含对内容的引用)、签名者证书,以及每个签名者各一个 SignerInfo。SignerInfo 通常包含已签名属性——至少有内容类型和内容的 messageDigest,常常还有签名时间——签名是对这些属性的 DER 编码计算的,而不是直接对内容计算。
EnvelopedData 为接收方加密内容,每个接收方分别使用密钥传输(RSA)、密钥协商(ECDH),或者自 RFC 9629 起使用 ML-KEM(RFC 9936)等 KEM。AuthEnvelopedData 增加了 AEAD 内容加密(RFC 5083)。PEM 标签为 PKCS7 和 CMS。
大多数验证失败源于细节:分离的内容与签名时的字节不完全一致(S/MIME 中的行尾符)、缺少证书链、已签名属性按不同的 SET OF 顺序重新编码,或者验证方已不再接受所用的摘要算法。openssl cms -verify 和 S/MIME 签名验证工具可以显示是哪一步出了问题。