xref: /openssl/doc/man1/openssl-cms.pod.in (revision 7ed6de99)
1=pod
2{- OpenSSL::safe::output_do_not_edit_headers(); -}
3
4=head1 NAME
5
6openssl-cms - CMS command
7
8=head1 SYNOPSIS
9
10B<openssl> B<cms>
11[B<-help>]
12
13General options:
14
15[B<-in> I<filename>]
16[B<-out> I<filename>]
17{- $OpenSSL::safe::opt_config_synopsis -}
18
19Operation options:
20
21[B<-encrypt>]
22[B<-decrypt>]
23[B<-sign>]
24[B<-verify>]
25[B<-resign>]
26[B<-sign_receipt>]
27[B<-verify_receipt> I<receipt>]
28[B<-digest> I<digest>]
29[B<-digest_create>]
30[B<-digest_verify>]
31[B<-compress>]
32[B<-uncompress>]
33[B<-EncryptedData_encrypt>]
34[B<-EncryptedData_decrypt>]
35[B<-data_create>]
36[B<-data_out>]
37[B<-cmsout>]
38
39File format options:
40
41[B<-inform> B<DER>|B<PEM>|B<SMIME>]
42[B<-outform> B<DER>|B<PEM>|B<SMIME>]
43[B<-rctform> B<DER>|B<PEM>|B<SMIME>]
44[B<-stream>]
45[B<-indef>]
46[B<-noindef>]
47[B<-binary>]
48[B<-crlfeol>]
49[B<-asciicrlf>]
50
51Keys and password options:
52
53[B<-pwri_password> I<password>]
54[B<-secretkey> I<key>]
55[B<-secretkeyid> I<id>]
56[B<-inkey> I<filename>|I<uri>]
57[B<-passin> I<arg>]
58[B<-keyopt> I<name>:I<parameter>]
59[B<-keyform> B<DER>|B<PEM>|B<P12>|B<ENGINE>]
60{- $OpenSSL::safe::opt_engine_synopsis -}{- $OpenSSL::safe::opt_provider_synopsis -}
61{- $OpenSSL::safe::opt_r_synopsis -}
62
63Encryption options:
64
65[B<-originator> I<file>]
66[B<-recip> I<file>]
67[I<recipient-cert> ...]
68[B<-I<cipher>>]
69[B<-wrap> I<cipher>]
70[B<-aes128-wrap>]
71[B<-aes192-wrap>]
72[B<-aes256-wrap>]
73[B<-des3-wrap>]
74[B<-debug_decrypt>]
75
76Signing options:
77
78[B<-md> I<digest>]
79[B<-signer> I<file>]
80[B<-certfile> I<file>]
81[B<-cades>]
82[B<-nodetach>]
83[B<-nocerts>]
84[B<-noattr>]
85[B<-nosmimecap>]
86[B<-receipt_request_all>]
87[B<-receipt_request_first>]
88[B<-receipt_request_from> I<emailaddress>]
89[B<-receipt_request_to> I<emailaddress>]
90
91Verification options:
92
93[B<-signer> I<file>]
94[B<-content> I<filename>]
95[B<-no_content_verify>]
96[B<-no_attr_verify>]
97[B<-nosigs>]
98[B<-noverify>]
99[B<-nointern>]
100[B<-cades>]
101[B<-verify_retcode>]
102{- $OpenSSL::safe::opt_trust_synopsis -}
103
104Output options:
105
106[B<-keyid>]
107[B<-econtent_type> I<type>]
108[B<-text>]
109[B<-certsout> I<file>]
110[B<-to> I<addr>]
111[B<-from> I<addr>]
112[B<-subject> I<subj>]
113
114Printing options:
115
116[B<-noout>]
117[B<-print>]
118[B<-nameopt> I<option>]
119[B<-receipt_request_print>]
120
121Validation options:
122
123{- $OpenSSL::safe::opt_v_synopsis -}
124
125=head1 DESCRIPTION
126
127This command handles data in CMS format such as S/MIME v3.1 email messages.
128It can encrypt, decrypt, sign, verify, compress, uncompress, and print messages.
129
130=head1 OPTIONS
131
132There are a number of operation options that set the type of operation to be
133performed: encrypt, decrypt, sign, verify, resign, sign_receipt, verify_receipt,
134digest_create, digest_verify, compress, uncompress,
135EncryptedData_encrypt, EncryptedData_decrypt, data_create, data_out, or cmsout.
136The relevance of the other options depends on the operation type
137and their meaning may vary according to it.
138
139=over 4
140
141=item B<-help>
142
143Print out a usage message.
144
145=back
146
147=head2 General options
148
149=over 4
150
151=item B<-in> I<filename>
152
153The input message to be encrypted or signed or the message to be decrypted
154or verified.
155
156=item B<-out> I<filename>
157
158The message text that has been decrypted or verified or the output MIME
159format message that has been signed or verified.
160
161{- $OpenSSL::safe::opt_config_item -}
162
163=back
164
165=head2 Operation options
166
167=over 4
168
169=item B<-encrypt>
170
171Encrypt data for the given recipient certificates. Input file is the message
172to be encrypted. The output file is the encrypted data in MIME format. The
173actual CMS type is B<EnvelopedData>.
174
175Note that no revocation check is done for the recipient cert, so if that
176key has been compromised, others may be able to decrypt the text.
177
178=item B<-decrypt>
179
180Decrypt data using the supplied certificate and private key. Expects
181encrypted datain MIME format for the input file. The decrypted data
182is written to the output file.
183
184=item B<-sign>
185
186Sign data using the supplied certificate and private key. Input file is
187the message to be signed. The signed data in MIME format is written
188to the output file.
189
190=item B<-verify>
191
192Verify signed data. Expects a signed data on input and outputs
193the signed data. Both clear text and opaque signing is supported.
194
195=item B<-resign>
196
197Resign a message: take an existing message and one or more new signers.
198
199=item B<-sign_receipt>
200
201Generate and output a signed receipt for the supplied message. The input
202message B<must> contain a signed receipt request. Functionality is otherwise
203similar to the B<-sign> operation.
204
205=item B<-verify_receipt> I<receipt>
206
207Verify a signed receipt in filename B<receipt>. The input message B<must>
208contain the original receipt request. Functionality is otherwise similar
209to the B<-verify> operation.
210
211=item B<-digest> I<digest>
212
213When used with B<-sign>, provides the digest in hexadecimal form instead of
214computing it from the original message content. Cannot be combined with B<-in>
215or B<-nodetach>.
216
217This operation is the CMS equivalent of L<openssl-pkeyutl(1)> signing.
218When signing a pre-computed digest, the security relies on the digest and its
219computation from the original message being trusted.
220
221=item B<-digest_create>
222
223Create a CMS B<DigestedData> type.
224
225=item B<-digest_verify>
226
227Verify a CMS B<DigestedData> type and output the content.
228
229=item B<-compress>
230
231Create a CMS B<CompressedData> type. OpenSSL must be compiled with B<zlib>
232support for this option to work, otherwise it will output an error.
233
234=item B<-uncompress>
235
236Uncompress a CMS B<CompressedData> type and output the content. OpenSSL must be
237compiled with B<zlib> support for this option to work, otherwise it will
238output an error.
239
240=item B<-EncryptedData_encrypt>
241
242Encrypt content using supplied symmetric key and algorithm using a CMS
243B<EncryptedData> type and output the content.
244
245=item B<-EncryptedData_decrypt>
246
247Decrypt content using supplied symmetric key and algorithm using a CMS
248B<EncryptedData> type and output the content.
249
250=item B<-data_create>
251
252Create a CMS B<Data> type.
253
254=item B<-data_out>
255
256B<Data> type and output the content.
257
258=item B<-cmsout>
259
260Takes an input message and writes out a PEM encoded CMS structure.
261
262=back
263
264=head2 File format options
265
266=over 4
267
268=item B<-inform> B<DER>|B<PEM>|B<SMIME>
269
270The input format of the CMS structure (if one is being read);
271the default is B<SMIME>.
272See L<openssl-format-options(1)> for details.
273
274=item B<-outform> B<DER>|B<PEM>|B<SMIME>
275
276The output format of the CMS structure (if one is being written);
277the default is B<SMIME>.
278See L<openssl-format-options(1)> for details.
279
280=item B<-rctform> B<DER>|B<PEM>|B<SMIME>
281
282The signed receipt format for use with the B<-receipt_verify>; the default
283is B<SMIME>.
284See L<openssl-format-options(1)> for details.
285
286=item B<-stream>, B<-indef>
287
288The B<-stream> and B<-indef> options are equivalent and enable streaming I/O
289for encoding operations. This permits single pass processing of data without
290the need to hold the entire contents in memory, potentially supporting very
291large files. Streaming is automatically set for S/MIME signing with detached
292data if the output format is B<SMIME> it is currently off by default for all
293other operations.
294
295=item B<-noindef>
296
297Disable streaming I/O where it would produce and indefinite length constructed
298encoding. This option currently has no effect. In future streaming will be
299enabled by default on all relevant operations and this option will disable it.
300
301=item B<-binary>
302
303Normally the input message is converted to "canonical" format which is
304effectively using CR and LF as end of line: as required by the S/MIME
305specification. When this option is present no translation occurs. This
306is useful when handling binary data which may not be in MIME format.
307
308=item B<-crlfeol>
309
310Normally the output file uses a single B<LF> as end of line. When this
311option is present B<CRLF> is used instead.
312
313=item B<-asciicrlf>
314
315When signing use ASCII CRLF format canonicalisation. This strips trailing
316whitespace from all lines, deletes trailing blank lines at EOF and sets
317the encapsulated content type. This option is normally used with detached
318content and an output signature format of DER. This option is not normally
319needed when verifying as it is enabled automatically if the encapsulated
320content format is detected.
321
322=back
323
324=head2 Keys and password options
325
326=over 4
327
328=item B<-pwri_password> I<password>
329
330Specify password for recipient.
331
332=item B<-secretkey> I<key>
333
334Specify symmetric key to use. The key must be supplied in hex format and be
335consistent with the algorithm used. Supported by the B<-EncryptedData_encrypt>
336B<-EncryptedData_decrypt>, B<-encrypt> and B<-decrypt> options. When used
337with B<-encrypt> or B<-decrypt> the supplied key is used to wrap or unwrap the
338content encryption key using an AES key in the B<KEKRecipientInfo> type.
339
340=item B<-secretkeyid> I<id>
341
342The key identifier for the supplied symmetric key for B<KEKRecipientInfo> type.
343This option B<must> be present if the B<-secretkey> option is used with
344B<-encrypt>. With B<-decrypt> operations the I<id> is used to locate the
345relevant key if it is not supplied then an attempt is used to decrypt any
346B<KEKRecipientInfo> structures.
347
348=item B<-inkey> I<filename>|I<uri>
349
350The private key to use when signing or decrypting. This must match the
351corresponding certificate. If this option is not specified then the
352private key must be included in the certificate file specified with
353the B<-recip> or B<-signer> file. When signing this option can be used
354multiple times to specify successive keys.
355
356=item B<-passin> I<arg>
357
358The private key password source. For more information about the format of B<arg>
359see L<openssl-passphrase-options(1)>.
360
361=item B<-keyopt> I<name>:I<parameter>
362
363For signing and encryption this option can be used multiple times to
364set customised parameters for the preceding key or certificate. It can
365currently be used to set RSA-PSS for signing, RSA-OAEP for encryption
366or to modify default parameters for ECDH.
367
368=item B<-keyform> B<DER>|B<PEM>|B<P12>|B<ENGINE>
369
370The format of the private key file; unspecified by default.
371See L<openssl-format-options(1)> for details.
372
373{- $OpenSSL::safe::opt_engine_item -}
374
375{- $OpenSSL::safe::opt_provider_item -}
376
377{- $OpenSSL::safe::opt_r_item -}
378
379=back
380
381=head2 Encryption and decryption options
382
383=over 4
384
385=item B<-originator> I<file>
386
387A certificate of the originator of the encrypted message. Necessary for
388decryption when Key Agreement is in use for a shared key.
389
390=item B<-recip> I<file>
391
392When decrypting a message this specifies the certificate of the recipient.
393The certificate must match one of the recipients of the message.
394
395When encrypting a message this option may be used multiple times to specify
396each recipient. This form B<must> be used if customised parameters are
397required (for example to specify RSA-OAEP).
398
399Only certificates carrying RSA, Diffie-Hellman or EC keys are supported by this
400option.
401
402=item I<recipient-cert> ...
403
404This is an alternative to using the B<-recip> option when encrypting a message.
405One or more certificate filenames may be given.
406
407=item B<-I<cipher>>
408
409The encryption algorithm to use. For example triple DES (168 bits) - B<-des3>
410or 256 bit AES - B<-aes256>. Any standard algorithm name (as used by the
411EVP_get_cipherbyname() function) can also be used preceded by a dash, for
412example B<-aes-128-cbc>. See L<openssl-enc(1)> for a list of ciphers
413supported by your version of OpenSSL.
414
415Currently the AES variants with GCM mode are the only supported AEAD
416algorithms.
417
418If not specified triple DES is used. Only used with B<-encrypt> and
419B<-EncryptedData_create> commands.
420
421=item B<-wrap> I<cipher>
422
423Cipher algorithm to use for key wrap when encrypting the message using Key
424Agreement for key transport. The algorithm specified should be suitable for key
425wrap.
426
427=item B<-aes128-wrap>, B<-aes192-wrap>, B<-aes256-wrap>, B<-des3-wrap>
428
429Use AES128, AES192, AES256, or 3DES-EDE, respectively, to wrap key.
430Depending on the OpenSSL build options used, B<-des3-wrap> may not be supported.
431
432=item B<-debug_decrypt>
433
434This option sets the B<CMS_DEBUG_DECRYPT> flag. This option should be used
435with caution: see the notes section below.
436
437=back
438
439=head2 Signing options
440
441=over 4
442
443=item B<-md> I<digest>
444
445Digest algorithm to use when signing or resigning. If not present then the
446default digest algorithm for the signing key will be used (usually SHA1).
447
448=item B<-signer> I<file>
449
450A signing certificate.  When signing or resigning a message, this option can be
451used multiple times if more than one signer is required.
452
453=item B<-certfile> I<file>
454
455Allows additional certificates to be specified. When signing these will
456be included with the message. When verifying, these will be searched for
457signer certificates and will be used for chain building.
458
459The input can be in PEM, DER, or PKCS#12 format.
460
461=item B<-cades>
462
463When used with B<-sign>,
464add an ESS signingCertificate or ESS signingCertificateV2 signed-attribute
465to the SignerInfo, in order to make the signature comply with the requirements
466for a CAdES Basic Electronic Signature (CAdES-BES).
467
468=item B<-nodetach>
469
470When signing a message use opaque signing: this form is more resistant
471to translation by mail relays but it cannot be read by mail agents that
472do not support S/MIME.  Without this option cleartext signing with
473the MIME type multipart/signed is used.
474
475=item B<-nocerts>
476
477When signing a message the signer's certificate is normally included
478with this option it is excluded. This will reduce the size of the
479signed message but the verifier must have a copy of the signers certificate
480available locally (passed using the B<-certfile> option for example).
481
482=item B<-noattr>
483
484Normally when a message is signed a set of attributes are included which
485include the signing time and supported symmetric algorithms. With this
486option they are not included.
487
488=item B<-nosmimecap>
489
490Exclude the list of supported algorithms from signed attributes, other options
491such as signing time and content type are still included.
492
493=item B<-receipt_request_all>, B<-receipt_request_first>
494
495For B<-sign> option include a signed receipt request. Indicate requests should
496be provided by all recipient or first tier recipients (those mailed directly
497and not from a mailing list). Ignored it B<-receipt_request_from> is included.
498
499=item B<-receipt_request_from> I<emailaddress>
500
501For B<-sign> option include a signed receipt request. Add an explicit email
502address where receipts should be supplied.
503
504=item B<-receipt_request_to> I<emailaddress>
505
506Add an explicit email address where signed receipts should be sent to. This
507option B<must> but supplied if a signed receipt is requested.
508
509=back
510
511=head2 Verification options
512
513=over 4
514
515=item B<-signer> I<file>
516
517If a message has been verified successfully then the signers certificate(s)
518will be written to this file if the verification was successful.
519
520=item B<-content> I<filename>
521
522This specifies a file containing the detached content for operations taking
523S/MIME input, such as the B<-verify> command. This is only usable if the CMS
524structure is using the detached signature form where the content is
525not included. This option will override any content if the input format
526is S/MIME and it uses the multipart/signed MIME content type.
527
528=item B<-no_content_verify>
529
530Do not verify signed content signatures.
531
532=item B<-no_attr_verify>
533
534Do not verify signed attribute signatures.
535
536=item B<-nosigs>
537
538Don't verify message signature.
539
540=item B<-noverify>
541
542Do not verify the signers certificate of a signed message.
543
544=item B<-nointern>
545
546When verifying a message normally certificates (if any) included in
547the message are searched for the signing certificate. With this option
548only the certificates specified in the B<-certfile> option are used.
549The supplied certificates can still be used as untrusted CAs however.
550
551=item B<-cades>
552
553When used with B<-verify>, require and check signer certificate digest.
554See the NOTES section for more details.
555
556=item B<-verify_retcode>
557
558Exit nonzero on verification failure.
559
560{- $OpenSSL::safe::opt_trust_item -}
561
562=back
563
564=head2 Output options
565
566=over 4
567
568=item B<-keyid>
569
570Use subject key identifier to identify certificates instead of issuer name and
571serial number. The supplied certificate B<must> include a subject key
572identifier extension. Supported by B<-sign> and B<-encrypt> options.
573
574=item B<-econtent_type> I<type>
575
576Set the encapsulated content type to I<type> if not supplied the B<Data> type
577is used. The I<type> argument can be any valid OID name in either text or
578numerical format.
579
580=item B<-text>
581
582This option adds plain text (text/plain) MIME headers to the supplied
583message if encrypting or signing. If decrypting or verifying it strips
584off text headers: if the decrypted or verified message is not of MIME
585type text/plain then an error occurs.
586
587=item B<-certsout> I<file>
588
589Any certificates contained in the input message are written to I<file>.
590
591=item B<-to>, B<-from>, B<-subject>
592
593The relevant email headers. These are included outside the signed
594portion of a message so they may be included manually. If signing
595then many S/MIME mail clients check the signers certificate's email
596address matches that specified in the From: address.
597
598=back
599
600=head2 Printing options
601
602=over 4
603
604=item B<-noout>
605
606For the B<-cmsout> operation do not output the parsed CMS structure.
607This is useful if the syntax of the CMS structure is being checked.
608
609=item B<-print>
610
611For the B<-cmsout> operation print out all fields of the CMS structure.
612This implies B<-noout>.
613This is mainly useful for testing purposes.
614
615=item B<-nameopt> I<option>
616
617For the B<-cmsout> operation when B<-print> option is in use, specifies
618printing options for string fields. For most cases B<utf8> is reasonable value.
619See L<openssl-namedisplay-options(1)> for details.
620
621=item B<-receipt_request_print>
622
623For the B<-verify> operation print out the contents of any signed receipt
624requests.
625
626=back
627
628=head2 Validation options
629
630=over 4
631
632{- $OpenSSL::safe::opt_v_item -}
633
634Any validation errors cause the command to exit.
635
636=back
637
638=head1 NOTES
639
640The MIME message must be sent without any blank lines between the
641headers and the output. Some mail programs will automatically add
642a blank line. Piping the mail directly to sendmail is one way to
643achieve the correct format.
644
645The supplied message to be signed or encrypted must include the
646necessary MIME headers or many S/MIME clients won't display it
647properly (if at all). You can use the B<-text> option to automatically
648add plain text headers.
649
650A "signed and encrypted" message is one where a signed message is
651then encrypted. This can be produced by encrypting an already signed
652message: see the examples section.
653
654This version of the program only allows one signer per message but it
655will verify multiple signers on received messages. Some S/MIME clients
656choke if a message contains multiple signers. It is possible to sign
657messages "in parallel" by signing an already signed message.
658
659The options B<-encrypt> and B<-decrypt> reflect common usage in S/MIME
660clients. Strictly speaking these process CMS enveloped data: CMS
661encrypted data is used for other purposes.
662
663The B<-resign> option uses an existing message digest when adding a new
664signer. This means that attributes must be present in at least one existing
665signer using the same message digest or this operation will fail.
666
667The B<-stream> and B<-indef> options enable streaming I/O support.
668As a result the encoding is BER using indefinite length constructed encoding
669and no longer DER. Streaming is supported for the B<-encrypt> operation and the
670B<-sign> operation if the content is not detached.
671
672Streaming is always used for the B<-sign> operation with detached data but
673since the content is no longer part of the CMS structure the encoding
674remains DER.
675
676If the B<-decrypt> option is used without a recipient certificate then an
677attempt is made to locate the recipient by trying each potential recipient
678in turn using the supplied private key. To thwart the MMA attack
679(Bleichenbacher's attack on PKCS #1 v1.5 RSA padding) all recipients are
680tried whether they succeed or not and if no recipients match the message
681is "decrypted" using a random key which will typically output garbage.
682The B<-debug_decrypt> option can be used to disable the MMA attack protection
683and return an error if no recipient can be found: this option should be used
684with caution. For a fuller description see L<CMS_decrypt(3)>).
685
686=head1 CADES BASIC ELECTRONIC SIGNATURE (CADES-BES)
687
688A CAdES Basic Electronic Signature (CAdES-BES),
689as defined in the European Standard ETSI EN 319 122-1 V1.1.1, contains:
690
691=over 4
692
693=item *
694
695The signed user data as defined in CMS (RFC 3852);
696
697=item *
698
699Content-type of the EncapsulatedContentInfo value being signed;
700
701=item *
702
703Message-digest of the eContent OCTET STRING within encapContentInfo being signed;
704
705=item *
706
707An ESS signingCertificate or ESS signingCertificateV2 attribute,
708as defined in Enhanced Security Services (ESS), RFC 2634 and RFC 5035.
709An ESS signingCertificate attribute only allows for SHA-1 as digest algorithm.
710An ESS signingCertificateV2 attribute allows for any digest algorithm.
711
712=item *
713
714The digital signature value computed on the user data and, when present, on the signed attributes.
715
716NOTE that the B<-cades> option applies to the B<-sign> or B<-verify> operations.
717With this option, the B<-verify> operation also requires that the
718signingCertificate attribute is present and checks that the given identifiers
719match the verification trust chain built during the verification process.
720
721=back
722
723=head1 EXIT CODES
724
725=over 4
726
727=item Z<>0
728
729The operation was completely successfully.
730
731=item Z<>1
732
733An error occurred parsing the command options.
734
735=item Z<>2
736
737One of the input files could not be read.
738
739=item Z<>3
740
741An error occurred creating the CMS file or when reading the MIME
742message.
743
744=item Z<>4
745
746An error occurred decrypting or verifying the message.
747
748=item Z<>5
749
750The message was verified correctly but an error occurred writing out
751the signers certificates.
752
753=back
754
755=head1 COMPATIBILITY WITH PKCS#7 FORMAT
756
757L<openssl-smime(1)> can only process the older B<PKCS#7> format.
758B<openssl cms> supports Cryptographic Message Syntax format.
759Use of some features will result in messages which cannot be processed by
760applications which only support the older format. These are detailed below.
761
762The use of the B<-keyid> option with B<-sign> or B<-encrypt>.
763
764The B<-outform> I<PEM> option uses different headers.
765
766The B<-compress> option.
767
768The B<-secretkey> option when used with B<-encrypt>.
769
770The use of PSS with B<-sign>.
771
772The use of OAEP or non-RSA keys with B<-encrypt>.
773
774Additionally the B<-EncryptedData_create> and B<-data_create> type cannot
775be processed by the older L<openssl-smime(1)> command.
776
777=head1 EXAMPLES
778
779Create a cleartext signed message:
780
781 openssl cms -sign -in message.txt -text -out mail.msg \
782        -signer mycert.pem
783
784Create an opaque signed message
785
786 openssl cms -sign -in message.txt -text -out mail.msg -nodetach \
787        -signer mycert.pem
788
789Create a signed message, include some additional certificates and
790read the private key from another file:
791
792 openssl cms -sign -in in.txt -text -out mail.msg \
793        -signer mycert.pem -inkey mykey.pem -certfile mycerts.pem
794
795Create a signed message with two signers, use key identifier:
796
797 openssl cms -sign -in message.txt -text -out mail.msg \
798        -signer mycert.pem -signer othercert.pem -keyid
799
800Send a signed message under Unix directly to sendmail, including headers:
801
802 openssl cms -sign -in in.txt -text -signer mycert.pem \
803        -from steve@openssl.org -to someone@somewhere \
804        -subject "Signed message" | sendmail someone@somewhere
805
806Verify a message and extract the signer's certificate if successful:
807
808 openssl cms -verify -in mail.msg -signer user.pem -out signedtext.txt
809
810Send encrypted mail using triple DES:
811
812 openssl cms -encrypt -in in.txt -from steve@openssl.org \
813        -to someone@somewhere -subject "Encrypted message" \
814        -des3 user.pem -out mail.msg
815
816Sign and encrypt mail:
817
818 openssl cms -sign -in ml.txt -signer my.pem -text \
819        | openssl cms -encrypt -out mail.msg \
820        -from steve@openssl.org -to someone@somewhere \
821        -subject "Signed and Encrypted message" -des3 user.pem
822
823Note: the encryption command does not include the B<-text> option because the
824message being encrypted already has MIME headers.
825
826Decrypt a message:
827
828 openssl cms -decrypt -in mail.msg -recip mycert.pem -inkey key.pem
829
830The output from Netscape form signing is a PKCS#7 structure with the
831detached signature format. You can use this program to verify the
832signature by line wrapping the base64 encoded structure and surrounding
833it with:
834
835 -----BEGIN PKCS7-----
836 -----END PKCS7-----
837
838and using the command,
839
840 openssl cms -verify -inform PEM -in signature.pem -content content.txt
841
842alternatively you can base64 decode the signature and use
843
844 openssl cms -verify -inform DER -in signature.der -content content.txt
845
846Create an encrypted message using 128 bit Camellia:
847
848 openssl cms -encrypt -in plain.txt -camellia128 -out mail.msg cert.pem
849
850Add a signer to an existing message:
851
852 openssl cms -resign -in mail.msg -signer newsign.pem -out mail2.msg
853
854Sign a message using RSA-PSS:
855
856 openssl cms -sign -in message.txt -text -out mail.msg \
857        -signer mycert.pem -keyopt rsa_padding_mode:pss
858
859Create an encrypted message using RSA-OAEP:
860
861 openssl cms -encrypt -in plain.txt -out mail.msg \
862        -recip cert.pem -keyopt rsa_padding_mode:oaep
863
864Use SHA256 KDF with an ECDH certificate:
865
866 openssl cms -encrypt -in plain.txt -out mail.msg \
867        -recip ecdhcert.pem -keyopt ecdh_kdf_md:sha256
868
869Print CMS signed binary data in human-readable form:
870
871openssl cms -in signed.cms -binary -inform DER -cmsout -print
872
873=head1 BUGS
874
875The MIME parser isn't very clever: it seems to handle most messages that I've
876thrown at it but it may choke on others.
877
878The code currently will only write out the signer's certificate to a file: if
879the signer has a separate encryption certificate this must be manually
880extracted. There should be some heuristic that determines the correct
881encryption certificate.
882
883Ideally a database should be maintained of a certificates for each email
884address.
885
886The code doesn't currently take note of the permitted symmetric encryption
887algorithms as supplied in the SMIMECapabilities signed attribute. this means the
888user has to manually include the correct encryption algorithm. It should store
889the list of permitted ciphers in a database and only use those.
890
891No revocation checking is done on the signer's certificate.
892
893=head1 SEE ALSO
894
895L<ossl_store-file(7)>
896
897=head1 HISTORY
898
899The use of multiple B<-signer> options and the B<-resign> command were first
900added in OpenSSL 1.0.0.
901
902The B<-keyopt> option was added in OpenSSL 1.0.2.
903
904Support for RSA-OAEP and RSA-PSS was added in OpenSSL 1.0.2.
905
906The use of non-RSA keys with B<-encrypt> and B<-decrypt>
907was added in OpenSSL 1.0.2.
908
909The -no_alt_chains option was added in OpenSSL 1.0.2b.
910
911The B<-nameopt> option was added in OpenSSL 3.0.0.
912
913The B<-engine> option was deprecated in OpenSSL 3.0.
914
915The B<-digest> option was added in OpenSSL 3.2.
916
917=head1 COPYRIGHT
918
919Copyright 2008-2024 The OpenSSL Project Authors. All Rights Reserved.
920
921Licensed under the Apache License 2.0 (the "License").  You may not use
922this file except in compliance with the License.  You can obtain a copy
923in the file LICENSE in the source distribution or at
924L<https://www.openssl.org/source/license.html>.
925
926=cut
927