OpenSSL

密码学和 SSL/TLS 工具包

openssl-cms

名称

openssl-cms - CMS 命令

概要

openssl cms [-help]

一般选项

[-in filename] [-out filename] [-config configfile]

操作选项

[-encrypt] [-decrypt] [-sign] [-verify] [-resign] [-sign_receipt] [-verify_receipt receipt] [-digest digest] [-digest_create] [-digest_verify] [-compress] [-uncompress] [-EncryptedData_encrypt] [-EncryptedData_decrypt] [-data_create] [-data_out] [-cmsout]

文件格式选项

[-inform DER|PEM|SMIME] [-outform DER|PEM|SMIME] [-rctform DER|PEM|SMIME] [-stream] [-indef] [-noindef] [-binary] [-crlfeol] [-asciicrlf]

密钥和密码选项

[-pwri_password password] [-secretkey key] [-secretkeyid id] [-inkey filename|uri] [-passin arg] [-keyopt name:parameter] [-keyform DER|PEM|P12|ENGINE] [-engine id] [-provider name] [-provider-path path] [-propquery propq] [-rand files] [-writerand file]

加密选项

[-originator file] [-recip file] [recipient-cert ...] [-cipher] [-wrap cipher] [-aes128-wrap] [-aes192-wrap] [-aes256-wrap] [-des3-wrap] [-debug_decrypt]

签名选项

[-md digest] [-signer file] [-certfile file] [-cades] [-nodetach] [-nocerts] [-noattr] [-nosmimecap] [-receipt_request_all] [-receipt_request_first] [-receipt_request_from emailaddress] [-receipt_request_to emailaddress]

验证选项

[-signer file] [-content filename] [-no_content_verify] [-no_attr_verify] [-nosigs] [-noverify] [-nointern] [-cades] [-verify_retcode] [-CAfile file] [-no-CAfile] [-CApath dir] [-no-CApath] [-CAstore uri] [-no-CAstore]

输出选项

[-keyid] [-econtent_type type] [-text] [-certsout file] [-to addr] [-from addr] [-subject subj]

打印选项

[-noout] [-print] [-nameopt option] [-receipt_request_print]

验证选项

[-allow_proxy_certs] [-attime timestamp] [-no_check_time] [-check_ss_sig] [-crl_check] [-crl_check_all] [-explicit_policy] [-extended_crl] [-ignore_critical] [-inhibit_any] [-inhibit_map] [-partial_chain] [-policy arg] [-policy_check] [-policy_print] [-purpose purpose] [-suiteB_128] [-suiteB_128_only] [-suiteB_192] [-trusted_first] [-no_alt_chains] [-use_deltas] [-auth_level num] [-verify_depth num] [-verify_email email] [-verify_hostname hostname] [-verify_ip ip] [-verify_name name] [-x509_strict] [-issuer_checks]

描述

此命令处理 CMS 格式的数据,例如 S/MIME v3.1 电子邮件。它可以加密、解密、签名、验证、压缩、解压缩和打印消息。

选项

有许多操作选项可以设置要执行的操作类型:encrypt、decrypt、sign、verify、resign、sign_receipt、verify_receipt、digest_create、digest_verify、compress、uncompress、EncryptedData_encrypt、EncryptedData_decrypt、data_create、data_out 或 cmsout。其他选项的相关性取决于操作类型,它们的含义可能会根据操作类型而有所不同。

-help

打印使用信息。

一般选项

-in filename

要加密或签名的输入消息,或要解密或验证的消息。

-out filename

已解密或验证的消息文本,或已签名或验证的输出 MIME 格式消息。

-config configfile

参见 openssl(1) 中的“配置选项”

操作选项

-encrypt

为给定的收件人证书加密数据。输入文件是要加密的消息。输出文件是加密后的 MIME 格式数据。实际的 CMS 类型是 EnvelopedData

请注意,不会对收件人证书进行吊销检查,因此如果该密钥已被泄露,其他人可能能够解密文本。

-decrypt

使用提供的证书和私钥解密数据。期望输入文件中的加密数据为 MIME 格式。解密后的数据将写入输出文件。

-sign

使用提供的证书和私钥签名数据。输入文件是要签名的消息。签名后的 MIME 格式数据将写入输出文件。

-verify

验证签名数据。期望输入为签名数据,并输出签名数据。支持明文签名和不透明签名。

-resign

重新签名消息:获取现有消息和一个或多个新的签名者。

-sign_receipt

为提供的消息生成并输出签名收据。输入消息必须包含签名收据请求。其他功能类似于 -sign 操作。

-verify_receipt receipt

验证文件名 receipt 中的签名收据。输入消息必须包含原始收据请求。其他功能类似于 -verify 操作。

-digest digest

-sign 一起使用时,以十六进制形式提供摘要,而不是从原始消息内容计算摘要。不能与 -in-nodetach 结合使用。

此操作等同于 openssl-pkeyutl(1) 签名的 CMS 等效操作。在签名预先计算的摘要时,安全性依赖于摘要及其从原始消息的计算结果是否可信。

-digest_create

创建 CMS DigestedData 类型。

-digest_verify

验证 CMS DigestedData 类型并输出内容。

-compress

创建 CMS CompressedData 类型。OpenSSL 必须使用 zlib 支持编译才能使此选项生效,否则将输出错误。

-uncompress

解压缩 CMS CompressedData 类型并输出内容。OpenSSL 必须使用 zlib 支持编译才能使此选项生效,否则将输出错误。

-EncryptedData_encrypt

使用提供的对称密钥和算法使用 CMS EncryptedData 类型加密内容并输出内容。

-EncryptedData_decrypt

使用提供的对称密钥和算法使用 CMS EncryptedData 类型解密内容并输出内容。

-data_create

创建 CMS Data 类型。

-data_out

Data 类型并输出内容。

-cmsout

获取输入消息并写入 PEM 编码的 CMS 结构。

文件格式选项

-inform DER|PEM|SMIME

CMS 结构的输入格式(如果正在读取一个);默认值为 SMIME。有关详细信息,请参见 openssl-format-options(1)

-outform DER|PEM|SMIME

CMS 结构的输出格式(如果正在写入一个);默认值为 SMIME。有关详细信息,请参见 openssl-format-options(1)

-rctform DER|PEM|SMIME

-receipt_verify 一起使用的签名收据格式;默认值为 SMIME。有关详细信息,请参见 openssl-format-options(1)

-stream, -indef

-stream-indef 选项等效,并且为编码操作启用流式 I/O。这允许对数据进行单次处理,而无需将整个内容保存在内存中,从而可能支持非常大的文件。如果输出格式为 SMIME,则 S/MIME 签名带分离数据的流式传输会自动设置;对于所有其他操作,它当前默认处于关闭状态。

-noindef

在生成无限长度构造编码的地方禁用流式 I/O。此选项当前没有影响。将来,流式传输将在所有相关操作中默认启用,此选项将禁用它。

-binary

通常,输入消息将转换为“规范”格式,这实际上是使用 CR 和 LF 作为行尾:这是 S/MIME 规范所要求的。当此选项存在时,不会进行任何转换。这在处理可能不是 MIME 格式的二进制数据时非常有用。

-crlfeol

通常,输出文件使用单个 LF 作为行尾。当此选项存在时,将使用 CRLF 代替。

-asciicrlf

在签名时,使用 ASCII CRLF 格式规范化。这会从所有行中删除尾随空格,删除 EOF 处的尾随空白行,并设置封装的内容类型。此选项通常与分离内容和 DER 输出签名格式一起使用。在验证时通常不需要此选项,因为它会在检测到封装的内容格式时自动启用。

密钥和密码选项

-pwri_password password

指定收件人密码。

-secretkey key

指定要使用的对称密钥。密钥必须以十六进制格式提供,并且与使用的算法一致。受 -EncryptedData_encrypt -EncryptedData_decrypt-encrypt-decrypt 选项支持。与 -encrypt-decrypt 一起使用时,提供的密钥用于使用 KEKRecipientInfo 类型中的 AES 密钥包装或解包装内容加密密钥。

-secretkeyid id

KEKRecipientInfo 类型中提供的对称密钥的密钥标识符。如果 -secretkey 选项与 -encrypt 一起使用,则此选项必须存在。在 -decrypt 操作中,如果未提供 id,则会使用 id 来定位相关密钥;如果未提供,则会尝试解密任何 KEKRecipientInfo 结构。

-inkey filename|uri

签名或解密时要使用的私钥。这必须与相应的证书匹配。如果未指定此选项,则私钥必须包含在使用 -recip-signer 文件指定的证书文件中。在签名时,此选项可以多次使用以指定后续密钥。

-passin arg

私钥密码源。有关 arg 格式的更多信息,请参见 openssl-passphrase-options(1)

-keyopt name:parameter

对于签名和加密,此选项可以多次使用以设置先前密钥或证书的自定义参数。它目前可用于设置 RSA-PSS 进行签名,RSA-OAEP 进行加密,或修改 ECDH 的默认参数。

-keyform DER|PEM|P12|ENGINE

私钥文件的格式;默认情况下未指定。有关详细信息,请参见 openssl-format-options(1)

-engine id

参见 openssl(1) 中的“引擎选项”。此选项已弃用。

-provider name
-provider-path path
-propquery propq

参见 openssl(1) 中的“提供者选项”provider(7)property(7)

-rand files, -writerand file

有关详细信息,请参见 openssl(1) 中的“随机状态选项”

加密和解密选项

-originator file

加密消息的发起者的证书。当使用密钥协商来共享密钥时,解密时需要此项。

-recip file

解密消息时,这将指定收件人的证书。证书必须与消息的收件人之一匹配。

加密消息时,此选项可以多次使用以指定每个收件人。如果需要自定义参数(例如,指定 RSA-OAEP),则必须使用此形式。

此选项仅支持包含 RSA、Diffie-Hellman 或 EC 密钥的证书。

recipient-cert ...

这是在加密消息时使用 -recip 选项的替代方法。可以指定一个或多个证书文件名。

-cipher

要使用的加密算法。例如,三倍 DES(168 位) - -des3 或 256 位 AES - -aes256。任何标准算法名称(与 EVP_get_cipherbyname() 函数中使用的名称相同)也可以使用,前面加一个破折号,例如 -aes-128-cbc。有关 OpenSSL 版本支持的密码列表,请参见 openssl-enc(1)

目前,使用 GCM 模式的 AES 变体是唯一支持的 AEAD 算法。

如果未指定,将使用三重 DES。仅与 -encrypt-EncryptedData_create 命令一起使用。

-wrap cipher

使用密钥协商进行密钥传输时,用于对消息进行加密的密钥包装时要使用的密码算法。指定的算法应适合密钥包装。

-aes128-wrap, -aes192-wrap, -aes256-wrap, -des3-wrap

分别使用 AES128、AES192、AES256 或 3DES-EDE 来包装密钥。根据使用的 OpenSSL 构建选项,-des3-wrap 可能不受支持。

-debug_decrypt

此选项设置 CMS_DEBUG_DECRYPT 标志。此选项应谨慎使用:请参阅下面的说明部分。

签名选项

-md digest

签名或重新签名时要使用的摘要算法。如果不存在,则将使用签名密钥的默认摘要算法(通常为 SHA1)。

-signer file

签名证书。签名或重新签名消息时,如果需要多个签名者,则此选项可以多次使用。

-certfile file

允许指定其他证书。签名时,这些证书将包含在消息中。验证时,将搜索这些证书以查找签名者的证书。输入可以是 PEM、DER 或 PKCS#12 格式。

-cades

-sign 一起使用时,向 SignerInfo 添加 ESS signingCertificate 或 ESS signingCertificateV2 签名属性,以使签名符合 CAdES 基本电子签名 (CAdES-BES) 的要求。

-nodetach

签名消息时使用不透明签名:此形式更能抵抗邮件中继的转换,但无法被不支持 S/MIME 的邮件代理读取。没有此选项,将使用具有 MIME 类型 multipart/signed 的明文签名。

-nocerts

签名消息时,签名者的证书通常会包含在其中,使用此选项时,它将被排除在外。这将减少签名消息的大小,但验证者必须在本地拥有签名者证书的副本(例如,使用 -certfile 选项传递)。

-noattr

通常,签名消息时,会包含一组属性,其中包括签名时间和支持的对称算法。使用此选项时,它们不会被包含。

-nosmimecap

从签名属性中排除支持算法列表,其他选项(如签名时间和内容类型)仍然包含在内。

-receipt_request_all, -receipt_request_first

对于 -sign 选项,包括一个签名的回执请求。指示请求应由所有收件人或第一层收件人(直接邮寄的收件人,而不是来自邮件列表的收件人)提供。如果包含 -receipt_request_from,则忽略它。

-receipt_request_from emailaddress

对于 -sign 选项,包括一个签名的回执请求。添加一个明确的电子邮件地址,用于提供回执。

-receipt_request_to emailaddress

添加一个明确的电子邮件地址,用于将签名的回执发送到该地址。如果请求签名的回执,则必须提供此选项。

验证选项

-signer file

如果成功验证了消息,则如果验证成功,则将签名者的证书写入此文件。

-content filename

这指定了一个包含用于执行 S/MIME 输入的操作(例如 -verify 命令)的独立内容的文件。这仅在 CMS 结构使用独立签名形式(内容未包含在其中)时可用。如果输入格式是 S/MIME 并且它使用 multipart/signed MIME 内容类型,则此选项将覆盖任何内容。

-no_content_verify

不验证签名的内容签名。

-no_attr_verify

不验证签名属性签名。

-nosigs

不要验证消息签名。

-noverify

不要验证签名消息的签名者证书。

-nointern

验证消息时,通常会搜索消息中包含的证书以查找签名证书。使用此选项时,仅使用在 -certfile 选项中指定的证书。但是,提供的证书仍然可以用作不受信任的 CA。

-cades

-verify 一起使用时,要求并检查签名者证书摘要。有关详细信息,请参阅说明部分。

-verify_retcode

验证失败时退出非零值。

-CAfile file, -no-CAfile, -CApath dir, -no-CApath, -CAstore uri, -no-CAstore

有关详细信息,请参阅 "openssl-verification-options(1) 中的受信任证书选项"

输出选项

-keyid

使用主体密钥标识符来标识证书,而不是使用颁发者名称和序列号。提供的证书必须包含主体密钥标识符扩展。受 -sign-encrypt 选项支持。

-econtent_type type

如果未提供,则将封装的内容类型设置为 type,将使用 Data 类型。type 参数可以是任何有效的 OID 名称,以文本或数字格式表示。

-text

此选项在加密或签名时向提供的消息添加纯文本 (text/plain) MIME 标头。如果解密或验证,则它会剥离文本标头:如果解密或验证后的消息不是 MIME 类型 text/plain,则会发生错误。

-certsout file

输入消息中包含的任何证书都将写入 file

-to, -from, -subject

相关的电子邮件标头。这些包含在消息的签名部分之外,因此可以手动包含。如果签名,则许多 S/MIME 邮件客户端会检查签名者证书的电子邮件地址是否与 From: 地址中指定的地址匹配。

打印选项

-noout

对于 -cmsout 操作,不输出解析的 CMS 结构。这在检查 CMS 结构的语法时非常有用。

-print

对于 -cmsout 操作,打印出 CMS 结构的所有字段。这意味着 -noout。这主要用于测试目的。

-nameopt option

对于 -cmsout 操作,当 -print 选项处于使用状态时,指定字符串字段的打印选项。对于大多数情况,utf8 是一个合理的值。有关详细信息,请参阅 openssl-namedisplay-options(1)

-receipt_request_print

对于 -verify 操作,打印出任何签名回执请求的内容。

验证选项

-allow_proxy_certs, -attime, -no_check_time, -check_ss_sig, -crl_check, -crl_check_all, -explicit_policy, -extended_crl, -ignore_critical, -inhibit_any, -inhibit_map, -no_alt_chains, -partial_chain, -policy, -policy_check, -policy_print, -purpose, -suiteB_128, -suiteB_128_only, -suiteB_192, -trusted_first, -use_deltas, -auth_level, -verify_depth, -verify_email, -verify_hostname, -verify_ip, -verify_name, -x509_strict -issuer_checks

设置证书链验证的各种选项。有关详细信息,请参阅 "openssl-verification-options(1) 中的验证选项"

任何验证错误都会导致命令退出。

说明

MIME 消息必须在标头和输出之间不包含任何空行。某些邮件程序会自动添加空行。将邮件直接管道到 sendmail 是实现正确格式的一种方法。

要签名的提供的消息或要加密的消息必须包含必要的 MIME 标头,否则许多 S/MIME 客户端将无法正确显示它(如果有的话)。可以使用 -text 选项自动添加纯文本标头。

"已签名和加密" 消息是指已签名消息然后加密的消息。这可以通过加密已签名的消息来实现:请参阅示例部分。

此版本的程序仅允许每个消息一个签名者,但它会验证接收到的消息上的多个签名者。如果消息包含多个签名者,则某些 S/MIME 客户端会阻塞。可以通过签名已签名的消息来“并行”签名消息。

选项 -encrypt-decrypt 反映了 S/MIME 客户端中的常见用法。严格来说,这些过程处理 CMS 包裹数据:CMS 加密数据用于其他目的。

-resign 选项在添加新签名者时使用现有的消息摘要。这意味着属性必须至少存在于使用相同消息摘要的一个现有签名者中,否则此操作将失败。

-stream-indef 选项启用流式 I/O 支持。因此,编码是使用不确定长度构造编码的 BER,不再是 DER。流式传输支持 -encrypt 操作,如果内容未分离,则支持 -sign 操作。

对于具有分离数据的 -sign 操作,始终使用流式传输,但由于内容不再是 CMS 结构的一部分,因此编码仍然是 DER。

如果使用 -decrypt 选项,但没有接收者证书,则会尝试通过依次尝试每个潜在接收者(使用提供的私钥)来找到接收者。为了挫败 MMA 攻击(Bleichenbacher 对 PKCS #1 v1.5 RSA 填充的攻击),所有接收者都会被尝试,无论它们是否成功,如果找不到匹配的消息接收者,则将使用随机密钥“解密”消息,这通常会输出垃圾。-debug_decrypt 选项可以用来禁用 MMA 攻击保护,如果找不到接收者,则返回错误:此选项应谨慎使用。有关更完整的描述,请参阅 CMS_decrypt(3))。

CADES 基本电子签名 (CADES-BES)

根据欧洲标准 ETSI EN 319 122-1 V1.1.1 中的定义,CAdES 基本电子签名 (CAdES-BES) 包含

  • CMS (RFC 3852) 中定义的签名的用户数据;

  • 正在签名的 EncapsulatedContentInfo 值的内容类型;

  • 正在签名的 encapContentInfo 中的 eContent OCTET STRING 的消息摘要;

  • 根据增强型安全服务 (ESS) RFC 2634 和 RFC 5035 中的定义,ESS signingCertificate 或 ESS signingCertificateV2 属性。ESS signingCertificate 属性仅允许 SHA-1 作为摘要算法。ESS signingCertificateV2 属性允许任何摘要算法。

  • 根据用户数据以及(如果存在)签名属性计算的数字签名值。

    注意,-cades 选项适用于 -sign-verify 操作。使用此选项,-verify 操作还需要 signingCertificate 属性存在,并检查给定的标识符是否与验证过程中构建的验证信任链匹配。

退出代码

0

操作完全成功。

1

解析命令选项时发生错误。

2

无法读取输入文件之一。

3

创建 CMS 文件或读取 MIME 消息时发生错误。

4

解密或验证消息时发生错误。

5

消息已正确验证,但在写入签名者证书时发生错误。

与 PKCS#7 格式的兼容性

openssl-smime(1) 只能处理旧的 PKCS#7 格式。openssl cms 支持加密消息语法格式。使用某些功能将导致消息无法由仅支持旧格式的应用程序处理。这些将在下面详细介绍。

-sign-encrypt 一起使用 -keyid 选项。

-outform PEM 选项使用不同的标头。

-compress 选项。

-encrypt 一起使用时的 -secretkey 选项。

-sign 一起使用时的 PSS。

-encrypt 一起使用时的 OAEP 或非 RSA 密钥。

此外,旧的 openssl-smime(1) 命令无法处理 -EncryptedData_create-data_create 类型。

示例

创建明文签名消息

openssl cms -sign -in message.txt -text -out mail.msg \
       -signer mycert.pem

创建不透明签名消息

openssl cms -sign -in message.txt -text -out mail.msg -nodetach \
       -signer mycert.pem

创建签名消息,包括一些其他证书,并从另一个文件读取私钥

openssl cms -sign -in in.txt -text -out mail.msg \
       -signer mycert.pem -inkey mykey.pem -certfile mycerts.pem

创建带有两个签名者的签名消息,使用密钥标识符

openssl cms -sign -in message.txt -text -out mail.msg \
       -signer mycert.pem -signer othercert.pem -keyid

在 Unix 下将签名消息直接发送到 sendmail,包括标头

openssl cms -sign -in in.txt -text -signer mycert.pem \
       -from [email protected] -to someone@somewhere \
       -subject "Signed message" | sendmail someone@somewhere

验证消息,并在成功后提取签名者的证书

openssl cms -verify -in mail.msg -signer user.pem -out signedtext.txt

使用三重 DES 发送加密邮件

openssl cms -encrypt -in in.txt -from [email protected] \
       -to someone@somewhere -subject "Encrypted message" \
       -des3 user.pem -out mail.msg

签名和加密邮件

openssl cms -sign -in ml.txt -signer my.pem -text \
       | openssl cms -encrypt -out mail.msg \
       -from [email protected] -to someone@somewhere \
       -subject "Signed and Encrypted message" -des3 user.pem

注意:加密命令不包含 -text 选项,因为要加密的消息已经包含 MIME 头部。

解密消息

openssl cms -decrypt -in mail.msg -recip mycert.pem -inkey key.pem

Netscape 表单签名的输出是带有分离签名的 PKCS#7 结构。可以使用此程序通过换行 base64 编码的结构并将其包围在

-----BEGIN PKCS7-----
-----END PKCS7-----

中,并使用命令进行验证签名,

openssl cms -verify -inform PEM -in signature.pem -content content.txt

或者可以对签名进行 base64 解码并使用

openssl cms -verify -inform DER -in signature.der -content content.txt

使用 128 位 Camellia 创建加密消息

openssl cms -encrypt -in plain.txt -camellia128 -out mail.msg cert.pem

向现有消息添加签名者

openssl cms -resign -in mail.msg -signer newsign.pem -out mail2.msg

使用 RSA-PSS 签名消息

openssl cms -sign -in message.txt -text -out mail.msg \
       -signer mycert.pem -keyopt rsa_padding_mode:pss

使用 RSA-OAEP 创建加密消息

openssl cms -encrypt -in plain.txt -out mail.msg \
       -recip cert.pem -keyopt rsa_padding_mode:oaep

将 SHA256 KDF 与 ECDH 证书一起使用

openssl cms -encrypt -in plain.txt -out mail.msg \
       -recip ecdhcert.pem -keyopt ecdh_kdf_md:sha256

以人类可读的形式打印 CMS 签名的二进制数据

openssl cms -in signed.cms -binary -inform DER -cmsout -print

错误

MIME 解析器不太聪明:它似乎可以处理我扔给它的多数消息,但可能会遇到其他消息。

当前代码只会将签名者的证书写入文件:如果签名者有单独的加密证书,则必须手动提取。应该有一些启发式算法来确定正确的加密证书。

理想情况下,应该维护一个数据库,其中包含每个电子邮件地址的证书。

当前代码不会注意到 SMIMECapabilities 签名属性中提供的允许的对称加密算法。这意味着用户必须手动包含正确的加密算法。它应该将允许的密码列表存储在数据库中,并且只使用那些密码。

不会对签名者的证书进行吊销检查。

另请参见

ossl_store-file(7)

历史

多个 -signer 选项的使用以及 -resign 命令首次在 OpenSSL 1.0.0 中添加。

-keyopt 选项在 OpenSSL 1.0.2 中添加。

在 OpenSSL 1.0.2 中添加了对 RSA-OAEP 和 RSA-PSS 的支持。

在 OpenSSL 1.0.2 中添加了使用非 RSA 密钥与 -encrypt-decrypt 的支持。

-no_alt_chains 选项在 OpenSSL 1.0.2b 中添加。

-nameopt 选项在 OpenSSL 3.0.0 中添加。

-engine 选项在 OpenSSL 3.0 中已弃用。

-digest 选项在 OpenSSL 3.2 中添加。

版权所有 2008-2023 OpenSSL 项目作者。版权所有。

根据 Apache 许可证 2.0(“许可证”)授权。除非符合许可证,否则您不得使用此文件。您可以在源代码分发中的 LICENSE 文件或 https://www.openssl.org/source/license.html 上获取副本。