1=pod 2 3=head1 NAME 4 5openssl-cms, 6cms - CMS utility 7 8=head1 SYNOPSIS 9 10B<openssl> B<cms> 11[B<-help>] 12[B<-encrypt>] 13[B<-decrypt>] 14[B<-sign>] 15[B<-verify>] 16[B<-cmsout>] 17[B<-resign>] 18[B<-data_create>] 19[B<-data_out>] 20[B<-digest_create>] 21[B<-digest_verify>] 22[B<-compress>] 23[B<-uncompress>] 24[B<-EncryptedData_encrypt>] 25[B<-sign_receipt>] 26[B<-verify_receipt receipt>] 27[B<-in filename>] 28[B<-inform SMIME|PEM|DER>] 29[B<-rctform SMIME|PEM|DER>] 30[B<-out filename>] 31[B<-outform SMIME|PEM|DER>] 32[B<-stream -indef -noindef>] 33[B<-noindef>] 34[B<-content filename>] 35[B<-text>] 36[B<-noout>] 37[B<-print>] 38[B<-CAfile file>] 39[B<-CApath dir>] 40[B<-no-CAfile>] 41[B<-no-CApath>] 42[B<-attime timestamp>] 43[B<-check_ss_sig>] 44[B<-crl_check>] 45[B<-crl_check_all>] 46[B<-explicit_policy>] 47[B<-extended_crl>] 48[B<-ignore_critical>] 49[B<-inhibit_any>] 50[B<-inhibit_map>] 51[B<-no_check_time>] 52[B<-partial_chain>] 53[B<-policy arg>] 54[B<-policy_check>] 55[B<-policy_print>] 56[B<-purpose purpose>] 57[B<-suiteB_128>] 58[B<-suiteB_128_only>] 59[B<-suiteB_192>] 60[B<-trusted_first>] 61[B<-no_alt_chains>] 62[B<-use_deltas>] 63[B<-auth_level num>] 64[B<-verify_depth num>] 65[B<-verify_email email>] 66[B<-verify_hostname hostname>] 67[B<-verify_ip ip>] 68[B<-verify_name name>] 69[B<-x509_strict>] 70[B<-md digest>] 71[B<-I<cipher>>] 72[B<-nointern>] 73[B<-noverify>] 74[B<-nocerts>] 75[B<-noattr>] 76[B<-nosmimecap>] 77[B<-binary>] 78[B<-crlfeol>] 79[B<-asciicrlf>] 80[B<-nodetach>] 81[B<-certfile file>] 82[B<-certsout file>] 83[B<-signer file>] 84[B<-recip file>] 85[B<-keyid>] 86[B<-receipt_request_all>] 87[B<-receipt_request_first>] 88[B<-receipt_request_from emailaddress>] 89[B<-receipt_request_to emailaddress>] 90[B<-receipt_request_print>] 91[B<-secretkey key>] 92[B<-secretkeyid id>] 93[B<-econtent_type type>] 94[B<-inkey file>] 95[B<-keyopt name:parameter>] 96[B<-passin arg>] 97[B<-rand file...>] 98[B<-writerand file>] 99[B<cert.pem...>] 100[B<-to addr>] 101[B<-from addr>] 102[B<-subject subj>] 103[cert.pem]... 104 105=head1 DESCRIPTION 106 107The B<cms> command handles S/MIME v3.1 mail. It can encrypt, decrypt, sign and 108verify, compress and uncompress S/MIME messages. 109 110=head1 OPTIONS 111 112There are fourteen operation options that set the type of operation to be 113performed. The meaning of the other options varies according to the operation 114type. 115 116=over 4 117 118=item B<-help> 119 120Print out a usage message. 121 122=item B<-encrypt> 123 124Encrypt mail for the given recipient certificates. Input file is the message 125to be encrypted. The output file is the encrypted mail in MIME format. The 126actual CMS type is <B>EnvelopedData<B>. 127 128Note that no revocation check is done for the recipient cert, so if that 129key has been compromised, others may be able to decrypt the text. 130 131=item B<-decrypt> 132 133Decrypt mail using the supplied certificate and private key. Expects an 134encrypted mail message in MIME format for the input file. The decrypted mail 135is written to the output file. 136 137=item B<-debug_decrypt> 138 139This option sets the B<CMS_DEBUG_DECRYPT> flag. This option should be used 140with caution: see the notes section below. 141 142=item B<-sign> 143 144Sign mail using the supplied certificate and private key. Input file is 145the message to be signed. The signed message in MIME format is written 146to the output file. 147 148=item B<-verify> 149 150Verify signed mail. Expects a signed mail message on input and outputs 151the signed data. Both clear text and opaque signing is supported. 152 153=item B<-cmsout> 154 155Takes an input message and writes out a PEM encoded CMS structure. 156 157=item B<-resign> 158 159Resign a message: take an existing message and one or more new signers. 160 161=item B<-data_create> 162 163Create a CMS B<Data> type. 164 165=item B<-data_out> 166 167B<Data> type and output the content. 168 169=item B<-digest_create> 170 171Create a CMS B<DigestedData> type. 172 173=item B<-digest_verify> 174 175Verify a CMS B<DigestedData> type and output the content. 176 177=item B<-compress> 178 179Create a CMS B<CompressedData> type. OpenSSL must be compiled with B<zlib> 180support for this option to work, otherwise it will output an error. 181 182=item B<-uncompress> 183 184Uncompress a CMS B<CompressedData> type and output the content. OpenSSL must be 185compiled with B<zlib> support for this option to work, otherwise it will 186output an error. 187 188=item B<-EncryptedData_encrypt> 189 190Encrypt content using supplied symmetric key and algorithm using a CMS 191B<EncryptedData> type and output the content. 192 193=item B<-sign_receipt> 194 195Generate and output a signed receipt for the supplied message. The input 196message B<must> contain a signed receipt request. Functionality is otherwise 197similar to the B<-sign> operation. 198 199=item B<-verify_receipt receipt> 200 201Verify a signed receipt in filename B<receipt>. The input message B<must> 202contain the original receipt request. Functionality is otherwise similar 203to the B<-verify> operation. 204 205=item B<-in filename> 206 207The input message to be encrypted or signed or the message to be decrypted 208or verified. 209 210=item B<-inform SMIME|PEM|DER> 211 212This specifies the input format for the CMS structure. The default 213is B<SMIME> which reads an S/MIME format message. B<PEM> and B<DER> 214format change this to expect PEM and DER format CMS structures 215instead. This currently only affects the input format of the CMS 216structure, if no CMS structure is being input (for example with 217B<-encrypt> or B<-sign>) this option has no effect. 218 219=item B<-rctform SMIME|PEM|DER> 220 221Specify the format for a signed receipt for use with the B<-receipt_verify> 222operation. 223 224=item B<-out filename> 225 226The message text that has been decrypted or verified or the output MIME 227format message that has been signed or verified. 228 229=item B<-outform SMIME|PEM|DER> 230 231This specifies the output format for the CMS structure. The default 232is B<SMIME> which writes an S/MIME format message. B<PEM> and B<DER> 233format change this to write PEM and DER format CMS structures 234instead. This currently only affects the output format of the CMS 235structure, if no CMS structure is being output (for example with 236B<-verify> or B<-decrypt>) this option has no effect. 237 238=item B<-stream -indef -noindef> 239 240The B<-stream> and B<-indef> options are equivalent and enable streaming I/O 241for encoding operations. This permits single pass processing of data without 242the need to hold the entire contents in memory, potentially supporting very 243large files. Streaming is automatically set for S/MIME signing with detached 244data if the output format is B<SMIME> it is currently off by default for all 245other operations. 246 247=item B<-noindef> 248 249Disable streaming I/O where it would produce and indefinite length constructed 250encoding. This option currently has no effect. In future streaming will be 251enabled by default on all relevant operations and this option will disable it. 252 253=item B<-content filename> 254 255This specifies a file containing the detached content, this is only 256useful with the B<-verify> command. This is only usable if the CMS 257structure is using the detached signature form where the content is 258not included. This option will override any content if the input format 259is S/MIME and it uses the multipart/signed MIME content type. 260 261=item B<-text> 262 263This option adds plain text (text/plain) MIME headers to the supplied 264message if encrypting or signing. If decrypting or verifying it strips 265off text headers: if the decrypted or verified message is not of MIME 266type text/plain then an error occurs. 267 268=item B<-noout> 269 270For the B<-cmsout> operation do not output the parsed CMS structure. This 271is useful when combined with the B<-print> option or if the syntax of the CMS 272structure is being checked. 273 274=item B<-print> 275 276For the B<-cmsout> operation print out all fields of the CMS structure. This 277is mainly useful for testing purposes. 278 279=item B<-CAfile file> 280 281A file containing trusted CA certificates, only used with B<-verify>. 282 283=item B<-CApath dir> 284 285A directory containing trusted CA certificates, only used with 286B<-verify>. This directory must be a standard certificate directory: that 287is a hash of each subject name (using B<x509 -hash>) should be linked 288to each certificate. 289 290=item B<-no-CAfile> 291 292Do not load the trusted CA certificates from the default file location 293 294=item B<-no-CApath> 295 296Do not load the trusted CA certificates from the default directory location 297 298=item B<-md digest> 299 300Digest algorithm to use when signing or resigning. If not present then the 301default digest algorithm for the signing key will be used (usually SHA1). 302 303=item B<-I<cipher>> 304 305The encryption algorithm to use. For example triple DES (168 bits) - B<-des3> 306or 256 bit AES - B<-aes256>. Any standard algorithm name (as used by the 307EVP_get_cipherbyname() function) can also be used preceded by a dash, for 308example B<-aes-128-cbc>. See L<enc(1)> for a list of ciphers 309supported by your version of OpenSSL. 310 311If not specified triple DES is used. Only used with B<-encrypt> and 312B<-EncryptedData_create> commands. 313 314=item B<-nointern> 315 316When verifying a message normally certificates (if any) included in 317the message are searched for the signing certificate. With this option 318only the certificates specified in the B<-certfile> option are used. 319The supplied certificates can still be used as untrusted CAs however. 320 321=item B<-noverify> 322 323Do not verify the signers certificate of a signed message. 324 325=item B<-nocerts> 326 327When signing a message the signer's certificate is normally included 328with this option it is excluded. This will reduce the size of the 329signed message but the verifier must have a copy of the signers certificate 330available locally (passed using the B<-certfile> option for example). 331 332=item B<-noattr> 333 334Normally when a message is signed a set of attributes are included which 335include the signing time and supported symmetric algorithms. With this 336option they are not included. 337 338=item B<-nosmimecap> 339 340Exclude the list of supported algorithms from signed attributes, other options 341such as signing time and content type are still included. 342 343=item B<-binary> 344 345Normally the input message is converted to "canonical" format which is 346effectively using CR and LF as end of line: as required by the S/MIME 347specification. When this option is present no translation occurs. This 348is useful when handling binary data which may not be in MIME format. 349 350=item B<-crlfeol> 351 352Normally the output file uses a single B<LF> as end of line. When this 353option is present B<CRLF> is used instead. 354 355=item B<-asciicrlf> 356 357When signing use ASCII CRLF format canonicalisation. This strips trailing 358whitespace from all lines, deletes trailing blank lines at EOF and sets 359the encapsulated content type. This option is normally used with detached 360content and an output signature format of DER. This option is not normally 361needed when verifying as it is enabled automatically if the encapsulated 362content format is detected. 363 364=item B<-nodetach> 365 366When signing a message use opaque signing: this form is more resistant 367to translation by mail relays but it cannot be read by mail agents that 368do not support S/MIME. Without this option cleartext signing with 369the MIME type multipart/signed is used. 370 371=item B<-certfile file> 372 373Allows additional certificates to be specified. When signing these will 374be included with the message. When verifying these will be searched for 375the signers certificates. The certificates should be in PEM format. 376 377=item B<-certsout file> 378 379Any certificates contained in the message are written to B<file>. 380 381=item B<-signer file> 382 383A signing certificate when signing or resigning a message, this option can be 384used multiple times if more than one signer is required. If a message is being 385verified then the signers certificates will be written to this file if the 386verification was successful. 387 388=item B<-recip file> 389 390When decrypting a message this specifies the recipients certificate. The 391certificate must match one of the recipients of the message or an error 392occurs. 393 394When encrypting a message this option may be used multiple times to specify 395each recipient. This form B<must> be used if customised parameters are 396required (for example to specify RSA-OAEP). 397 398Only certificates carrying RSA, Diffie-Hellman or EC keys are supported by this 399option. 400 401=item B<-keyid> 402 403Use subject key identifier to identify certificates instead of issuer name and 404serial number. The supplied certificate B<must> include a subject key 405identifier extension. Supported by B<-sign> and B<-encrypt> options. 406 407=item B<-receipt_request_all>, B<-receipt_request_first> 408 409For B<-sign> option include a signed receipt request. Indicate requests should 410be provided by all recipient or first tier recipients (those mailed directly 411and not from a mailing list). Ignored it B<-receipt_request_from> is included. 412 413=item B<-receipt_request_from emailaddress> 414 415For B<-sign> option include a signed receipt request. Add an explicit email 416address where receipts should be supplied. 417 418=item B<-receipt_request_to emailaddress> 419 420Add an explicit email address where signed receipts should be sent to. This 421option B<must> but supplied if a signed receipt it requested. 422 423=item B<-receipt_request_print> 424 425For the B<-verify> operation print out the contents of any signed receipt 426requests. 427 428=item B<-secretkey key> 429 430Specify symmetric key to use. The key must be supplied in hex format and be 431consistent with the algorithm used. Supported by the B<-EncryptedData_encrypt> 432B<-EncryptedData_decrypt>, B<-encrypt> and B<-decrypt> options. When used 433with B<-encrypt> or B<-decrypt> the supplied key is used to wrap or unwrap the 434content encryption key using an AES key in the B<KEKRecipientInfo> type. 435 436=item B<-secretkeyid id> 437 438The key identifier for the supplied symmetric key for B<KEKRecipientInfo> type. 439This option B<must> be present if the B<-secretkey> option is used with 440B<-encrypt>. With B<-decrypt> operations the B<id> is used to locate the 441relevant key if it is not supplied then an attempt is used to decrypt any 442B<KEKRecipientInfo> structures. 443 444=item B<-econtent_type type> 445 446Set the encapsulated content type to B<type> if not supplied the B<Data> type 447is used. The B<type> argument can be any valid OID name in either text or 448numerical format. 449 450=item B<-inkey file> 451 452The private key to use when signing or decrypting. This must match the 453corresponding certificate. If this option is not specified then the 454private key must be included in the certificate file specified with 455the B<-recip> or B<-signer> file. When signing this option can be used 456multiple times to specify successive keys. 457 458=item B<-keyopt name:opt> 459 460For signing and encryption this option can be used multiple times to 461set customised parameters for the preceding key or certificate. It can 462currently be used to set RSA-PSS for signing, RSA-OAEP for encryption 463or to modify default parameters for ECDH. 464 465=item B<-passin arg> 466 467The private key password source. For more information about the format of B<arg> 468see L<openssl(1)/Pass Phrase Options>. 469 470=item B<-rand file...> 471 472A file or files containing random data used to seed the random number 473generator. 474Multiple files can be specified separated by an OS-dependent character. 475The separator is B<;> for MS-Windows, B<,> for OpenVMS, and B<:> for 476all others. 477 478=item [B<-writerand file>] 479 480Writes random data to the specified I<file> upon exit. 481This can be used with a subsequent B<-rand> flag. 482 483=item B<cert.pem...> 484 485One or more certificates of message recipients: used when encrypting 486a message. 487 488=item B<-to, -from, -subject> 489 490The relevant mail headers. These are included outside the signed 491portion of a message so they may be included manually. If signing 492then many S/MIME mail clients check the signers certificate's email 493address matches that specified in the From: address. 494 495=item B<-attime>, B<-check_ss_sig>, B<-crl_check>, B<-crl_check_all>, 496B<-explicit_policy>, B<-extended_crl>, B<-ignore_critical>, B<-inhibit_any>, 497B<-inhibit_map>, B<-no_alt_chains>, B<-no_check_time>, B<-partial_chain>, B<-policy>, 498B<-policy_check>, B<-policy_print>, B<-purpose>, B<-suiteB_128>, 499B<-suiteB_128_only>, B<-suiteB_192>, B<-trusted_first>, B<-use_deltas>, 500B<-auth_level>, B<-verify_depth>, B<-verify_email>, B<-verify_hostname>, 501B<-verify_ip>, B<-verify_name>, B<-x509_strict> 502 503Set various certificate chain validation options. See the 504L<verify(1)> manual page for details. 505 506=back 507 508=head1 NOTES 509 510The MIME message must be sent without any blank lines between the 511headers and the output. Some mail programs will automatically add 512a blank line. Piping the mail directly to sendmail is one way to 513achieve the correct format. 514 515The supplied message to be signed or encrypted must include the 516necessary MIME headers or many S/MIME clients won't display it 517properly (if at all). You can use the B<-text> option to automatically 518add plain text headers. 519 520A "signed and encrypted" message is one where a signed message is 521then encrypted. This can be produced by encrypting an already signed 522message: see the examples section. 523 524This version of the program only allows one signer per message but it 525will verify multiple signers on received messages. Some S/MIME clients 526choke if a message contains multiple signers. It is possible to sign 527messages "in parallel" by signing an already signed message. 528 529The options B<-encrypt> and B<-decrypt> reflect common usage in S/MIME 530clients. Strictly speaking these process CMS enveloped data: CMS 531encrypted data is used for other purposes. 532 533The B<-resign> option uses an existing message digest when adding a new 534signer. This means that attributes must be present in at least one existing 535signer using the same message digest or this operation will fail. 536 537The B<-stream> and B<-indef> options enable streaming I/O support. 538As a result the encoding is BER using indefinite length constructed encoding 539and no longer DER. Streaming is supported for the B<-encrypt> operation and the 540B<-sign> operation if the content is not detached. 541 542Streaming is always used for the B<-sign> operation with detached data but 543since the content is no longer part of the CMS structure the encoding 544remains DER. 545 546If the B<-decrypt> option is used without a recipient certificate then an 547attempt is made to locate the recipient by trying each potential recipient 548in turn using the supplied private key. To thwart the MMA attack 549(Bleichenbacher's attack on PKCS #1 v1.5 RSA padding) all recipients are 550tried whether they succeed or not and if no recipients match the message 551is "decrypted" using a random key which will typically output garbage. 552The B<-debug_decrypt> option can be used to disable the MMA attack protection 553and return an error if no recipient can be found: this option should be used 554with caution. For a fuller description see L<CMS_decrypt(3)>). 555 556=head1 EXIT CODES 557 558=over 4 559 560=item Z<>0 561 562The operation was completely successfully. 563 564=item Z<>1 565 566An error occurred parsing the command options. 567 568=item Z<>2 569 570One of the input files could not be read. 571 572=item Z<>3 573 574An error occurred creating the CMS file or when reading the MIME 575message. 576 577=item Z<>4 578 579An error occurred decrypting or verifying the message. 580 581=item Z<>5 582 583The message was verified correctly but an error occurred writing out 584the signers certificates. 585 586=back 587 588=head1 COMPATIBILITY WITH PKCS#7 format. 589 590The B<smime> utility can only process the older B<PKCS#7> format. The B<cms> 591utility supports Cryptographic Message Syntax format. Use of some features 592will result in messages which cannot be processed by applications which only 593support the older format. These are detailed below. 594 595The use of the B<-keyid> option with B<-sign> or B<-encrypt>. 596 597The B<-outform PEM> option uses different headers. 598 599The B<-compress> option. 600 601The B<-secretkey> option when used with B<-encrypt>. 602 603The use of PSS with B<-sign>. 604 605The use of OAEP or non-RSA keys with B<-encrypt>. 606 607Additionally the B<-EncryptedData_create> and B<-data_create> type cannot 608be processed by the older B<smime> command. 609 610=head1 EXAMPLES 611 612Create a cleartext signed message: 613 614 openssl cms -sign -in message.txt -text -out mail.msg \ 615 -signer mycert.pem 616 617Create an opaque signed message 618 619 openssl cms -sign -in message.txt -text -out mail.msg -nodetach \ 620 -signer mycert.pem 621 622Create a signed message, include some additional certificates and 623read the private key from another file: 624 625 openssl cms -sign -in in.txt -text -out mail.msg \ 626 -signer mycert.pem -inkey mykey.pem -certfile mycerts.pem 627 628Create a signed message with two signers, use key identifier: 629 630 openssl cms -sign -in message.txt -text -out mail.msg \ 631 -signer mycert.pem -signer othercert.pem -keyid 632 633Send a signed message under Unix directly to sendmail, including headers: 634 635 openssl cms -sign -in in.txt -text -signer mycert.pem \ 636 -from steve@openssl.org -to someone@somewhere \ 637 -subject "Signed message" | sendmail someone@somewhere 638 639Verify a message and extract the signer's certificate if successful: 640 641 openssl cms -verify -in mail.msg -signer user.pem -out signedtext.txt 642 643Send encrypted mail using triple DES: 644 645 openssl cms -encrypt -in in.txt -from steve@openssl.org \ 646 -to someone@somewhere -subject "Encrypted message" \ 647 -des3 user.pem -out mail.msg 648 649Sign and encrypt mail: 650 651 openssl cms -sign -in ml.txt -signer my.pem -text \ 652 | openssl cms -encrypt -out mail.msg \ 653 -from steve@openssl.org -to someone@somewhere \ 654 -subject "Signed and Encrypted message" -des3 user.pem 655 656Note: the encryption command does not include the B<-text> option because the 657message being encrypted already has MIME headers. 658 659Decrypt mail: 660 661 openssl cms -decrypt -in mail.msg -recip mycert.pem -inkey key.pem 662 663The output from Netscape form signing is a PKCS#7 structure with the 664detached signature format. You can use this program to verify the 665signature by line wrapping the base64 encoded structure and surrounding 666it with: 667 668 -----BEGIN PKCS7----- 669 -----END PKCS7----- 670 671and using the command, 672 673 openssl cms -verify -inform PEM -in signature.pem -content content.txt 674 675alternatively you can base64 decode the signature and use 676 677 openssl cms -verify -inform DER -in signature.der -content content.txt 678 679Create an encrypted message using 128 bit Camellia: 680 681 openssl cms -encrypt -in plain.txt -camellia128 -out mail.msg cert.pem 682 683Add a signer to an existing message: 684 685 openssl cms -resign -in mail.msg -signer newsign.pem -out mail2.msg 686 687Sign mail using RSA-PSS: 688 689 openssl cms -sign -in message.txt -text -out mail.msg \ 690 -signer mycert.pem -keyopt rsa_padding_mode:pss 691 692Create encrypted mail using RSA-OAEP: 693 694 openssl cms -encrypt -in plain.txt -out mail.msg \ 695 -recip cert.pem -keyopt rsa_padding_mode:oaep 696 697Use SHA256 KDF with an ECDH certificate: 698 699 openssl cms -encrypt -in plain.txt -out mail.msg \ 700 -recip ecdhcert.pem -keyopt ecdh_kdf_md:sha256 701 702=head1 BUGS 703 704The MIME parser isn't very clever: it seems to handle most messages that I've 705thrown at it but it may choke on others. 706 707The code currently will only write out the signer's certificate to a file: if 708the signer has a separate encryption certificate this must be manually 709extracted. There should be some heuristic that determines the correct 710encryption certificate. 711 712Ideally a database should be maintained of a certificates for each email 713address. 714 715The code doesn't currently take note of the permitted symmetric encryption 716algorithms as supplied in the SMIMECapabilities signed attribute. this means the 717user has to manually include the correct encryption algorithm. It should store 718the list of permitted ciphers in a database and only use those. 719 720No revocation checking is done on the signer's certificate. 721 722The B<-binary> option does not work correctly when processing text input which 723(contrary to the S/MIME specification) uses LF rather than CRLF line endings. 724 725=head1 HISTORY 726 727The use of multiple B<-signer> options and the B<-resign> command were first 728added in OpenSSL 1.0.0. 729 730The B<keyopt> option was added in OpenSSL 1.0.2. 731 732Support for RSA-OAEP and RSA-PSS was added in OpenSSL 1.0.2. 733 734The use of non-RSA keys with B<-encrypt> and B<-decrypt> 735was added in OpenSSL 1.0.2. 736 737The -no_alt_chains option was added in OpenSSL 1.0.2b. 738 739=head1 COPYRIGHT 740 741Copyright 2008-2022 The OpenSSL Project Authors. All Rights Reserved. 742 743Licensed under the OpenSSL license (the "License"). You may not use 744this file except in compliance with the License. You can obtain a copy 745in the file LICENSE in the source distribution or at 746L<https://www.openssl.org/source/license.html>. 747 748=cut 749