1=pod 2 3=head1 NAME 4 5openssl-ca, 6ca - sample minimal CA application 7 8=head1 SYNOPSIS 9 10B<openssl> B<ca> 11[B<-help>] 12[B<-verbose>] 13[B<-config filename>] 14[B<-name section>] 15[B<-gencrl>] 16[B<-revoke file>] 17[B<-valid file>] 18[B<-status serial>] 19[B<-updatedb>] 20[B<-crl_reason reason>] 21[B<-crl_hold instruction>] 22[B<-crl_compromise time>] 23[B<-crl_CA_compromise time>] 24[B<-crldays days>] 25[B<-crlhours hours>] 26[B<-crlexts section>] 27[B<-startdate date>] 28[B<-enddate date>] 29[B<-days arg>] 30[B<-md arg>] 31[B<-policy arg>] 32[B<-keyfile arg>] 33[B<-keyform PEM|DER>] 34[B<-key arg>] 35[B<-passin arg>] 36[B<-cert file>] 37[B<-selfsign>] 38[B<-in file>] 39[B<-out file>] 40[B<-notext>] 41[B<-outdir dir>] 42[B<-infiles>] 43[B<-spkac file>] 44[B<-ss_cert file>] 45[B<-preserveDN>] 46[B<-noemailDN>] 47[B<-batch>] 48[B<-msie_hack>] 49[B<-extensions section>] 50[B<-extfile section>] 51[B<-engine id>] 52[B<-subj arg>] 53[B<-utf8>] 54[B<-sigopt nm:v>] 55[B<-create_serial>] 56[B<-rand_serial>] 57[B<-multivalue-rdn>] 58[B<-rand file...>] 59[B<-writerand file>] 60 61=head1 DESCRIPTION 62 63The B<ca> command is a minimal CA application. It can be used 64to sign certificate requests in a variety of forms and generate 65CRLs it also maintains a text database of issued certificates 66and their status. 67 68The options descriptions will be divided into each purpose. 69 70=head1 OPTIONS 71 72=over 4 73 74=item B<-help> 75 76Print out a usage message. 77 78=item B<-verbose> 79 80This prints extra details about the operations being performed. 81 82=item B<-config filename> 83 84Specifies the configuration file to use. 85Optional; for a description of the default value, 86see L<openssl(1)/COMMAND SUMMARY>. 87 88=item B<-name section> 89 90Specifies the configuration file section to use (overrides 91B<default_ca> in the B<ca> section). 92 93=item B<-in filename> 94 95An input filename containing a single certificate request to be 96signed by the CA. 97 98=item B<-ss_cert filename> 99 100A single self-signed certificate to be signed by the CA. 101 102=item B<-spkac filename> 103 104A file containing a single Netscape signed public key and challenge 105and additional field values to be signed by the CA. See the B<SPKAC FORMAT> 106section for information on the required input and output format. 107 108=item B<-infiles> 109 110If present this should be the last option, all subsequent arguments 111are taken as the names of files containing certificate requests. 112 113=item B<-out filename> 114 115The output file to output certificates to. The default is standard 116output. The certificate details will also be printed out to this 117file in PEM format (except that B<-spkac> outputs DER format). 118 119=item B<-outdir directory> 120 121The directory to output certificates to. The certificate will be 122written to a filename consisting of the serial number in hex with 123".pem" appended. 124 125=item B<-cert> 126 127The CA certificate file. 128 129=item B<-keyfile filename> 130 131The private key to sign requests with. 132 133=item B<-keyform PEM|DER> 134 135The format of the data in the private key file. 136The default is PEM. 137 138=item B<-sigopt nm:v> 139 140Pass options to the signature algorithm during sign or verify operations. 141Names and values of these options are algorithm-specific. 142 143=item B<-key password> 144 145The password used to encrypt the private key. Since on some 146systems the command line arguments are visible (e.g. Unix with 147the 'ps' utility) this option should be used with caution. 148 149=item B<-selfsign> 150 151Indicates the issued certificates are to be signed with the key 152the certificate requests were signed with (given with B<-keyfile>). 153Certificate requests signed with a different key are ignored. If 154B<-spkac>, B<-ss_cert> or B<-gencrl> are given, B<-selfsign> is 155ignored. 156 157A consequence of using B<-selfsign> is that the self-signed 158certificate appears among the entries in the certificate database 159(see the configuration option B<database>), and uses the same 160serial number counter as all other certificates sign with the 161self-signed certificate. 162 163=item B<-passin arg> 164 165The key password source. For more information about the format of B<arg> 166see L<openssl(1)/Pass Phrase Options>. 167 168=item B<-notext> 169 170Don't output the text form of a certificate to the output file. 171 172=item B<-startdate date> 173 174This allows the start date to be explicitly set. The format of the 175date is YYMMDDHHMMSSZ (the same as an ASN1 UTCTime structure), or 176YYYYMMDDHHMMSSZ (the same as an ASN1 GeneralizedTime structure). In 177both formats, seconds SS and timezone Z must be present. 178 179=item B<-enddate date> 180 181This allows the expiry date to be explicitly set. The format of the 182date is YYMMDDHHMMSSZ (the same as an ASN1 UTCTime structure), or 183YYYYMMDDHHMMSSZ (the same as an ASN1 GeneralizedTime structure). In 184both formats, seconds SS and timezone Z must be present. 185 186=item B<-days arg> 187 188The number of days to certify the certificate for. 189 190=item B<-md alg> 191 192The message digest to use. 193Any digest supported by the OpenSSL B<dgst> command can be used. For signing 194algorithms that do not support a digest (i.e. Ed25519 and Ed448) any message 195digest that is set is ignored. This option also applies to CRLs. 196 197=item B<-policy arg> 198 199This option defines the CA "policy" to use. This is a section in 200the configuration file which decides which fields should be mandatory 201or match the CA certificate. Check out the B<POLICY FORMAT> section 202for more information. 203 204=item B<-msie_hack> 205 206This is a deprecated option to make B<ca> work with very old versions of 207the IE certificate enrollment control "certenr3". It used UniversalStrings 208for almost everything. Since the old control has various security bugs 209its use is strongly discouraged. 210 211=item B<-preserveDN> 212 213Normally the DN order of a certificate is the same as the order of the 214fields in the relevant policy section. When this option is set the order 215is the same as the request. This is largely for compatibility with the 216older IE enrollment control which would only accept certificates if their 217DNs match the order of the request. This is not needed for Xenroll. 218 219=item B<-noemailDN> 220 221The DN of a certificate can contain the EMAIL field if present in the 222request DN, however, it is good policy just having the e-mail set into 223the altName extension of the certificate. When this option is set the 224EMAIL field is removed from the certificate' subject and set only in 225the, eventually present, extensions. The B<email_in_dn> keyword can be 226used in the configuration file to enable this behaviour. 227 228=item B<-batch> 229 230This sets the batch mode. In this mode no questions will be asked 231and all certificates will be certified automatically. 232 233=item B<-extensions section> 234 235The section of the configuration file containing certificate extensions 236to be added when a certificate is issued (defaults to B<x509_extensions> 237unless the B<-extfile> option is used). If no extension section is 238present then, a V1 certificate is created. If the extension section 239is present (even if it is empty), then a V3 certificate is created. See the 240L<x509v3_config(5)> manual page for details of the 241extension section format. 242 243=item B<-extfile file> 244 245An additional configuration file to read certificate extensions from 246(using the default section unless the B<-extensions> option is also 247used). 248 249=item B<-engine id> 250 251Specifying an engine (by its unique B<id> string) will cause B<ca> 252to attempt to obtain a functional reference to the specified engine, 253thus initialising it if needed. The engine will then be set as the default 254for all available algorithms. 255 256=item B<-subj arg> 257 258Supersedes subject name given in the request. 259The arg must be formatted as I</type0=value0/type1=value1/type2=...>. 260Keyword characters may be escaped by \ (backslash), and whitespace is retained. 261Empty values are permitted, but the corresponding type will not be included 262in the resulting certificate. 263 264=item B<-utf8> 265 266This option causes field values to be interpreted as UTF8 strings, by 267default they are interpreted as ASCII. This means that the field 268values, whether prompted from a terminal or obtained from a 269configuration file, must be valid UTF8 strings. 270 271=item B<-create_serial> 272 273If reading serial from the text file as specified in the configuration 274fails, specifying this option creates a new random serial to be used as next 275serial number. 276To get random serial numbers, use the B<-rand_serial> flag instead; this 277should only be used for simple error-recovery. 278 279=item B<-rand_serial> 280 281Generate a large random number to use as the serial number. 282This overrides any option or configuration to use a serial number file. 283 284=item B<-multivalue-rdn> 285 286This option causes the -subj argument to be interpreted with full 287support for multivalued RDNs. Example: 288 289I</DC=org/DC=OpenSSL/DC=users/UID=123456+CN=John Doe> 290 291If -multi-rdn is not used then the UID value is I<123456+CN=John Doe>. 292 293=item B<-rand file...> 294 295A file or files containing random data used to seed the random number 296generator. 297Multiple files can be specified separated by an OS-dependent character. 298The separator is B<;> for MS-Windows, B<,> for OpenVMS, and B<:> for 299all others. 300 301=item [B<-writerand file>] 302 303Writes random data to the specified I<file> upon exit. 304This can be used with a subsequent B<-rand> flag. 305 306=back 307 308=head1 CRL OPTIONS 309 310=over 4 311 312=item B<-gencrl> 313 314This option generates a CRL based on information in the index file. 315 316=item B<-crldays num> 317 318The number of days before the next CRL is due. That is the days from 319now to place in the CRL nextUpdate field. 320 321=item B<-crlhours num> 322 323The number of hours before the next CRL is due. 324 325=item B<-revoke filename> 326 327A filename containing a certificate to revoke. 328 329=item B<-valid filename> 330 331A filename containing a certificate to add a Valid certificate entry. 332 333=item B<-status serial> 334 335Displays the revocation status of the certificate with the specified 336serial number and exits. 337 338=item B<-updatedb> 339 340Updates the database index to purge expired certificates. 341 342=item B<-crl_reason reason> 343 344Revocation reason, where B<reason> is one of: B<unspecified>, B<keyCompromise>, 345B<CACompromise>, B<affiliationChanged>, B<superseded>, B<cessationOfOperation>, 346B<certificateHold> or B<removeFromCRL>. The matching of B<reason> is case 347insensitive. Setting any revocation reason will make the CRL v2. 348 349In practice B<removeFromCRL> is not particularly useful because it is only used 350in delta CRLs which are not currently implemented. 351 352=item B<-crl_hold instruction> 353 354This sets the CRL revocation reason code to B<certificateHold> and the hold 355instruction to B<instruction> which must be an OID. Although any OID can be 356used only B<holdInstructionNone> (the use of which is discouraged by RFC2459) 357B<holdInstructionCallIssuer> or B<holdInstructionReject> will normally be used. 358 359=item B<-crl_compromise time> 360 361This sets the revocation reason to B<keyCompromise> and the compromise time to 362B<time>. B<time> should be in GeneralizedTime format that is B<YYYYMMDDHHMMSSZ>. 363 364=item B<-crl_CA_compromise time> 365 366This is the same as B<crl_compromise> except the revocation reason is set to 367B<CACompromise>. 368 369=item B<-crlexts section> 370 371The section of the configuration file containing CRL extensions to 372include. If no CRL extension section is present then a V1 CRL is 373created, if the CRL extension section is present (even if it is 374empty) then a V2 CRL is created. The CRL extensions specified are 375CRL extensions and B<not> CRL entry extensions. It should be noted 376that some software (for example Netscape) can't handle V2 CRLs. See 377L<x509v3_config(5)> manual page for details of the 378extension section format. 379 380=back 381 382=head1 CONFIGURATION FILE OPTIONS 383 384The section of the configuration file containing options for B<ca> 385is found as follows: If the B<-name> command line option is used, 386then it names the section to be used. Otherwise the section to 387be used must be named in the B<default_ca> option of the B<ca> section 388of the configuration file (or in the default section of the 389configuration file). Besides B<default_ca>, the following options are 390read directly from the B<ca> section: 391 RANDFILE 392 preserve 393 msie_hack 394With the exception of B<RANDFILE>, this is probably a bug and may 395change in future releases. 396 397Many of the configuration file options are identical to command line 398options. Where the option is present in the configuration file 399and the command line the command line value is used. Where an 400option is described as mandatory then it must be present in 401the configuration file or the command line equivalent (if 402any) used. 403 404=over 4 405 406=item B<oid_file> 407 408This specifies a file containing additional B<OBJECT IDENTIFIERS>. 409Each line of the file should consist of the numerical form of the 410object identifier followed by white space then the short name followed 411by white space and finally the long name. 412 413=item B<oid_section> 414 415This specifies a section in the configuration file containing extra 416object identifiers. Each line should consist of the short name of the 417object identifier followed by B<=> and the numerical form. The short 418and long names are the same when this option is used. 419 420=item B<new_certs_dir> 421 422The same as the B<-outdir> command line option. It specifies 423the directory where new certificates will be placed. Mandatory. 424 425=item B<certificate> 426 427The same as B<-cert>. It gives the file containing the CA 428certificate. Mandatory. 429 430=item B<private_key> 431 432Same as the B<-keyfile> option. The file containing the 433CA private key. Mandatory. 434 435=item B<RANDFILE> 436 437At startup the specified file is loaded into the random number generator, 438and at exit 256 bytes will be written to it. 439 440=item B<default_days> 441 442The same as the B<-days> option. The number of days to certify 443a certificate for. 444 445=item B<default_startdate> 446 447The same as the B<-startdate> option. The start date to certify 448a certificate for. If not set the current time is used. 449 450=item B<default_enddate> 451 452The same as the B<-enddate> option. Either this option or 453B<default_days> (or the command line equivalents) must be 454present. 455 456=item B<default_crl_hours default_crl_days> 457 458The same as the B<-crlhours> and the B<-crldays> options. These 459will only be used if neither command line option is present. At 460least one of these must be present to generate a CRL. 461 462=item B<default_md> 463 464The same as the B<-md> option. Mandatory except where the signing algorithm does 465not require a digest (i.e. Ed25519 and Ed448). 466 467=item B<database> 468 469The text database file to use. Mandatory. This file must be present 470though initially it will be empty. 471 472=item B<unique_subject> 473 474If the value B<yes> is given, the valid certificate entries in the 475database must have unique subjects. if the value B<no> is given, 476several valid certificate entries may have the exact same subject. 477The default value is B<yes>, to be compatible with older (pre 0.9.8) 478versions of OpenSSL. However, to make CA certificate roll-over easier, 479it's recommended to use the value B<no>, especially if combined with 480the B<-selfsign> command line option. 481 482Note that it is valid in some circumstances for certificates to be created 483without any subject. In the case where there are multiple certificates without 484subjects this does not count as a duplicate. 485 486=item B<serial> 487 488A text file containing the next serial number to use in hex. Mandatory. 489This file must be present and contain a valid serial number. 490 491=item B<crlnumber> 492 493A text file containing the next CRL number to use in hex. The crl number 494will be inserted in the CRLs only if this file exists. If this file is 495present, it must contain a valid CRL number. 496 497=item B<x509_extensions> 498 499The same as B<-extensions>. 500 501=item B<crl_extensions> 502 503The same as B<-crlexts>. 504 505=item B<preserve> 506 507The same as B<-preserveDN> 508 509=item B<email_in_dn> 510 511The same as B<-noemailDN>. If you want the EMAIL field to be removed 512from the DN of the certificate simply set this to 'no'. If not present 513the default is to allow for the EMAIL filed in the certificate's DN. 514 515=item B<msie_hack> 516 517The same as B<-msie_hack> 518 519=item B<policy> 520 521The same as B<-policy>. Mandatory. See the B<POLICY FORMAT> section 522for more information. 523 524=item B<name_opt>, B<cert_opt> 525 526These options allow the format used to display the certificate details 527when asking the user to confirm signing. All the options supported by 528the B<x509> utilities B<-nameopt> and B<-certopt> switches can be used 529here, except the B<no_signame> and B<no_sigdump> are permanently set 530and cannot be disabled (this is because the certificate signature cannot 531be displayed because the certificate has not been signed at this point). 532 533For convenience the values B<ca_default> are accepted by both to produce 534a reasonable output. 535 536If neither option is present the format used in earlier versions of 537OpenSSL is used. Use of the old format is B<strongly> discouraged because 538it only displays fields mentioned in the B<policy> section, mishandles 539multicharacter string types and does not display extensions. 540 541=item B<copy_extensions> 542 543Determines how extensions in certificate requests should be handled. 544If set to B<none> or this option is not present then extensions are 545ignored and not copied to the certificate. If set to B<copy> then any 546extensions present in the request that are not already present are copied 547to the certificate. If set to B<copyall> then all extensions in the 548request are copied to the certificate: if the extension is already present 549in the certificate it is deleted first. See the B<WARNINGS> section before 550using this option. 551 552The main use of this option is to allow a certificate request to supply 553values for certain extensions such as subjectAltName. 554 555=back 556 557=head1 POLICY FORMAT 558 559The policy section consists of a set of variables corresponding to 560certificate DN fields. If the value is "match" then the field value 561must match the same field in the CA certificate. If the value is 562"supplied" then it must be present. If the value is "optional" then 563it may be present. Any fields not mentioned in the policy section 564are silently deleted, unless the B<-preserveDN> option is set but 565this can be regarded more of a quirk than intended behaviour. 566 567=head1 SPKAC FORMAT 568 569The input to the B<-spkac> command line option is a Netscape 570signed public key and challenge. This will usually come from 571the B<KEYGEN> tag in an HTML form to create a new private key. 572It is however possible to create SPKACs using the B<spkac> utility. 573 574The file should contain the variable SPKAC set to the value of 575the SPKAC and also the required DN components as name value pairs. 576If you need to include the same component twice then it can be 577preceded by a number and a '.'. 578 579When processing SPKAC format, the output is DER if the B<-out> 580flag is used, but PEM format if sending to stdout or the B<-outdir> 581flag is used. 582 583=head1 EXAMPLES 584 585Note: these examples assume that the B<ca> directory structure is 586already set up and the relevant files already exist. This usually 587involves creating a CA certificate and private key with B<req>, a 588serial number file and an empty index file and placing them in 589the relevant directories. 590 591To use the sample configuration file below the directories demoCA, 592demoCA/private and demoCA/newcerts would be created. The CA 593certificate would be copied to demoCA/cacert.pem and its private 594key to demoCA/private/cakey.pem. A file demoCA/serial would be 595created containing for example "01" and the empty index file 596demoCA/index.txt. 597 598 599Sign a certificate request: 600 601 openssl ca -in req.pem -out newcert.pem 602 603Sign a certificate request, using CA extensions: 604 605 openssl ca -in req.pem -extensions v3_ca -out newcert.pem 606 607Generate a CRL 608 609 openssl ca -gencrl -out crl.pem 610 611Sign several requests: 612 613 openssl ca -infiles req1.pem req2.pem req3.pem 614 615Certify a Netscape SPKAC: 616 617 openssl ca -spkac spkac.txt 618 619A sample SPKAC file (the SPKAC line has been truncated for clarity): 620 621 SPKAC=MIG0MGAwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAn7PDhCeV/xIxUg8V70YRxK2A5 622 CN=Steve Test 623 emailAddress=steve@openssl.org 624 0.OU=OpenSSL Group 625 1.OU=Another Group 626 627A sample configuration file with the relevant sections for B<ca>: 628 629 [ ca ] 630 default_ca = CA_default # The default ca section 631 632 [ CA_default ] 633 634 dir = ./demoCA # top dir 635 database = $dir/index.txt # index file. 636 new_certs_dir = $dir/newcerts # new certs dir 637 638 certificate = $dir/cacert.pem # The CA cert 639 serial = $dir/serial # serial no file 640 #rand_serial = yes # for random serial#'s 641 private_key = $dir/private/cakey.pem# CA private key 642 RANDFILE = $dir/private/.rand # random number file 643 644 default_days = 365 # how long to certify for 645 default_crl_days= 30 # how long before next CRL 646 default_md = md5 # md to use 647 648 policy = policy_any # default policy 649 email_in_dn = no # Don't add the email into cert DN 650 651 name_opt = ca_default # Subject name display option 652 cert_opt = ca_default # Certificate display option 653 copy_extensions = none # Don't copy extensions from request 654 655 [ policy_any ] 656 countryName = supplied 657 stateOrProvinceName = optional 658 organizationName = optional 659 organizationalUnitName = optional 660 commonName = supplied 661 emailAddress = optional 662 663=head1 FILES 664 665Note: the location of all files can change either by compile time options, 666configuration file entries, environment variables or command line options. 667The values below reflect the default values. 668 669 /usr/local/ssl/lib/openssl.cnf - master configuration file 670 ./demoCA - main CA directory 671 ./demoCA/cacert.pem - CA certificate 672 ./demoCA/private/cakey.pem - CA private key 673 ./demoCA/serial - CA serial number file 674 ./demoCA/serial.old - CA serial number backup file 675 ./demoCA/index.txt - CA text database file 676 ./demoCA/index.txt.old - CA text database backup file 677 ./demoCA/certs - certificate output file 678 ./demoCA/.rnd - CA random seed information 679 680=head1 RESTRICTIONS 681 682The text database index file is a critical part of the process and 683if corrupted it can be difficult to fix. It is theoretically possible 684to rebuild the index file from all the issued certificates and a current 685CRL: however there is no option to do this. 686 687V2 CRL features like delta CRLs are not currently supported. 688 689Although several requests can be input and handled at once it is only 690possible to include one SPKAC or self-signed certificate. 691 692=head1 BUGS 693 694The use of an in-memory text database can cause problems when large 695numbers of certificates are present because, as the name implies 696the database has to be kept in memory. 697 698The B<ca> command really needs rewriting or the required functionality 699exposed at either a command or interface level so a more friendly utility 700(perl script or GUI) can handle things properly. The script 701B<CA.pl> helps a little but not very much. 702 703Any fields in a request that are not present in a policy are silently 704deleted. This does not happen if the B<-preserveDN> option is used. To 705enforce the absence of the EMAIL field within the DN, as suggested by 706RFCs, regardless the contents of the request' subject the B<-noemailDN> 707option can be used. The behaviour should be more friendly and 708configurable. 709 710Canceling some commands by refusing to certify a certificate can 711create an empty file. 712 713=head1 WARNINGS 714 715The B<ca> command is quirky and at times downright unfriendly. 716 717The B<ca> utility was originally meant as an example of how to do things 718in a CA. It was not supposed to be used as a full blown CA itself: 719nevertheless some people are using it for this purpose. 720 721The B<ca> command is effectively a single user command: no locking is 722done on the various files and attempts to run more than one B<ca> command 723on the same database can have unpredictable results. 724 725The B<copy_extensions> option should be used with caution. If care is 726not taken then it can be a security risk. For example if a certificate 727request contains a basicConstraints extension with CA:TRUE and the 728B<copy_extensions> value is set to B<copyall> and the user does not spot 729this when the certificate is displayed then this will hand the requester 730a valid CA certificate. 731 732This situation can be avoided by setting B<copy_extensions> to B<copy> 733and including basicConstraints with CA:FALSE in the configuration file. 734Then if the request contains a basicConstraints extension it will be 735ignored. 736 737It is advisable to also include values for other extensions such 738as B<keyUsage> to prevent a request supplying its own values. 739 740Additional restrictions can be placed on the CA certificate itself. 741For example if the CA certificate has: 742 743 basicConstraints = CA:TRUE, pathlen:0 744 745then even if a certificate is issued with CA:TRUE it will not be valid. 746 747=head1 HISTORY 748 749Since OpenSSL 1.1.1, the program follows RFC5280. Specifically, 750certificate validity period (specified by any of B<-startdate>, 751B<-enddate> and B<-days>) will be encoded as UTCTime if the dates are 752earlier than year 2049 (included), and as GeneralizedTime if the dates 753are in year 2050 or later. 754 755=head1 SEE ALSO 756 757L<req(1)>, L<spkac(1)>, L<x509(1)>, L<CA.pl(1)>, 758L<config(5)>, L<x509v3_config(5)> 759 760=head1 COPYRIGHT 761 762Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved. 763 764Licensed under the OpenSSL license (the "License"). You may not use 765this file except in compliance with the License. You can obtain a copy 766in the file LICENSE in the source distribution or at 767L<https://www.openssl.org/source/license.html>. 768 769=cut 770