| --- | |
| # Copyright (c) 1998, 2025, Oracle and/or its affiliates. All rights reserved. | |
| # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| # | |
| # This code is free software; you can redistribute it and/or modify it | |
| # under the terms of the GNU General Public License version 2 only, as | |
| # published by the Free Software Foundation. | |
| # | |
| # This code is distributed in the hope that it will be useful, but WITHOUT | |
| # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| # version 2 for more details (a copy is included in the LICENSE file that | |
| # accompanied this code). | |
| # | |
| # You should have received a copy of the GNU General Public License version | |
| # 2 along with this work; if not, write to the Free Software Foundation, | |
| # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| # | |
| # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| # or visit www.oracle.com if you need additional information or have any | |
| # questions. | |
| # | |
| title: 'KEYTOOL(1) JDK @@VERSION_SHORT@@ | JDK Commands' | |
| date: @@COPYRIGHT_YEAR@@ | |
| lang: en | |
| --- | |
| ## Name | |
| keytool - a key and certificate management utility | |
| ## Synopsis | |
| `keytool` \[*commands*\] | |
| *commands* | |
| : Commands for `keytool` include the following: | |
| - `-certreq`: Generates a certificate request | |
| - `-changealias`: Changes an entry's alias | |
| - `-delete`: Deletes an entry | |
| - `-exportcert`: Exports certificate | |
| - `-genkeypair`: Generates a key pair | |
| - `-genseckey`: Generates a secret key | |
| - `-gencert`: Generates a certificate from a certificate request | |
| - `-importcert`: Imports a certificate or a certificate chain | |
| - `-importpass`: Imports a password | |
| - `-importkeystore`: Imports one or all entries from another keystore | |
| - `-keypasswd`: Changes the key password of an entry | |
| - `-list`: Lists entries in a keystore | |
| - `-printcert`: Prints the content of a certificate | |
| - `-printcertreq`: Prints the content of a certificate request | |
| - `-printcrl`: Prints the content of a Certificate Revocation List (CRL) | |
| file | |
| - `-storepasswd`: Changes the store password of a keystore | |
| - `-showinfo`: Displays security-related information | |
| - `-version`: Prints the program version | |
| See [Commands and Options] for a description of these commands with their | |
| options. | |
| ## Description | |
| The `keytool` command is a key and certificate management utility. It enables | |
| users to administer their own public/private key pairs and associated | |
| certificates for use in self-authentication (where a user authenticates | |
| themselves to other users and services) or data integrity and authentication | |
| services, by using digital signatures. The `keytool` command also enables users | |
| to cache the public keys (in the form of certificates) of their communicating | |
| peers. | |
| A certificate is a digitally signed statement from one entity (person, company, | |
| and so on), which says that the public key (and some other information) of some | |
| other entity has a particular value. When data is digitally signed, the | |
| signature can be verified to check the data integrity and authenticity. | |
| Integrity means that the data hasn't been modified or tampered with, and | |
| authenticity means that the data comes from the individual who claims to have | |
| created and signed it. | |
| The `keytool` command also enables users to administer secret keys and | |
| passphrases used in symmetric encryption and decryption (Data Encryption | |
| Standard). It can also display other security-related information. | |
| The `keytool` command stores the keys and certificates in a keystore. | |
| The `keytool` command uses the `jdk.certpath.disabledAlgorithms` and | |
| `jdk.security.legacyAlgorithms` security properties to determine which | |
| algorithms are considered a security risk. It emits warnings when | |
| disabled or legacy algorithms are being used. | |
| The `jdk.certpath.disabledAlgorithms` and `jdk.security.legacyAlgorithms` | |
| security properties are defined in the `java.security` file (located in | |
| the JDK's `$JAVA_HOME/conf/security` directory). | |
| ## Command and Option Notes | |
| The following notes apply to the descriptions in [Commands and Options]\: | |
| - All command and option names are preceded by a hyphen sign (`-`). | |
| - Only one command can be provided. | |
| - Options for each command can be provided in any order. | |
| - There are two kinds of options, one is single-valued which should be | |
| only provided once. If a single-valued option is provided multiple times, | |
| the value of the last one is used. The other type is multi-valued, | |
| which can be provided multiple times and all values are used. | |
| The only multi-valued option currently supported is the `-ext` option used | |
| to generate X.509v3 certificate extensions. | |
| - All items not italicized or in braces ({ }) or brackets (\[ \]) are | |
| required to appear as is. | |
| - Braces surrounding an option signify that a default value is used when the | |
| option isn't specified on the command line. Braces are also used around the | |
| `-v`, `-rfc`, and `-J` options, which have meaning only when they appear on | |
| the command line. They don't have any default values. | |
| - Brackets surrounding an option signify that the user is prompted for the | |
| values when the option isn't specified on the command line. For the | |
| `-keypass` option, if you don't specify the option on the command line, | |
| then the `keytool` command first attempts to use the keystore password to | |
| recover the private/secret key. If this attempt fails, then the `keytool` | |
| command prompts you for the private/secret key password. | |
| - Items in italics (option values) represent the actual values that must be | |
| supplied. For example, here is the format of the `-printcert` command: | |
| > `keytool -printcert` {`-file` *cert\_file*} {`-v`} | |
| When you specify a `-printcert` command, replace *cert\_file* with the | |
| actual file name, as follows: `keytool -printcert -file VScert.cer` | |
| - Option values must be enclosed in quotation marks when they contain a blank | |
| (space). | |
| ## Commands and Options | |
| The keytool commands and their options can be grouped by the tasks that they | |
| perform. | |
| [Commands for Creating or Adding Data to the Keystore]\: | |
| - `-gencert` | |
| - `-genkeypair` | |
| - `-genseckey` | |
| - `-importcert` | |
| - `-importpass` | |
| [Commands for Importing Contents from Another Keystore]\: | |
| - `-importkeystore` | |
| [Commands for Generating a Certificate Request]\: | |
| - `-certreq` | |
| [Commands for Exporting Data]\: | |
| - `-exportcert` | |
| [Commands for Displaying Data]\: | |
| - `-list` | |
| - `-printcert` | |
| - `-printcertreq` | |
| - `-printcrl` | |
| [Commands for Managing the Keystore]\: | |
| - `-storepasswd` | |
| - `-keypasswd` | |
| - `-delete` | |
| - `-changealias` | |
| [Commands for Displaying Security-related Information]\: | |
| - `-showinfo` | |
| [Commands for Displaying Program Version]\: | |
| - `-version` | |
| ## Commands for Creating or Adding Data to the Keystore | |
| `-gencert` | |
| : The following are the available options for the `-gencert` command: | |
| - {`-rfc`}: Output in RFC (Request For Comment) style | |
| - {`-infile` *infile*}: Input file name | |
| - {`-outfile` *outfile*}: Output file name | |
| - {`-alias` *alias*}: Alias name of the entry to process | |
| - {`-sigalg` *sigalg*}: Signature algorithm name | |
| - {`-dname` *dname*}: Distinguished name | |
| - {`-startdate` *startdate*}: Certificate validity start date and time | |
| - {`-ext` *ext*}\*: X.509 extension | |
| - {`-validity` *days*}: Validity number of days | |
| - \[`-keypass` *arg*\]: Key password | |
| - {`-keystore` *keystore*}: Keystore name | |
| - \[`-storepass` *arg*\]: Keystore password | |
| - {`-storetype` *type*}: Keystore type | |
| - {`-providername` *name*}: Provider name | |
| - {`-addprovider` *name* \[`-providerarg` *arg*\]}: Adds a security | |
| provider by name (such as SunPKCS11) with an optional configure | |
| argument. The value of the security provider is the name of a security | |
| provider that is defined in a module. | |
| For example, | |
| > `keytool -addprovider SunPKCS11 -providerarg some.cfg ...` | |
| **Note:** | |
| For compatibility reasons, the SunPKCS11 provider can still be loaded | |
| with `-providerclass sun.security.pkcs11.SunPKCS11` even if it is now | |
| defined in a module. This is the only module included in the JDK that | |
| needs a configuration, and therefore the most widely used with the | |
| `-providerclass` option. For legacy security providers located on | |
| classpath and loaded by reflection, `-providerclass` should still be | |
| used. | |
| - {`-providerclass` *class* \[`-providerarg` *arg*\]}: Add security | |
| provider by fully qualified class name with an optional configure | |
| argument. | |
| For example, if `MyProvider` is a legacy provider loaded via | |
| reflection, | |
| > `keytool -providerclass com.example.MyProvider ...` | |
| - {`-providerpath` *list*}: Provider classpath | |
| - {`-v`}: Verbose output | |
| - {`-protected`}: Password provided through a protected mechanism | |
| Use the `-gencert` command to generate a certificate as a response to a | |
| certificate request file (which can be created by the `keytool -certreq` | |
| command). The command reads the request either from *infile* or, if | |
| omitted, from the standard input, signs it by using the alias's private | |
| key, and outputs the X.509 certificate into either *outfile* or, if | |
| omitted, to the standard output. When `-rfc` is specified, the output | |
| format is Base64-encoded PEM; otherwise, a binary DER is created. | |
| The `-sigalg` value specifies the algorithm that should be used to sign the | |
| certificate. The *startdate* argument is the start time and date that the | |
| certificate is valid. The *days* argument tells the number of days for | |
| which the certificate should be considered valid. | |
| When *dname* is provided, it is used as the subject of the generated | |
| certificate. Otherwise, the one from the certificate request is used. | |
| The `-ext` value shows what X.509 extensions will be embedded in the | |
| certificate. Read [Common Command Options] for the grammar of `-ext`. | |
| The `-gencert` option enables you to create certificate chains. The | |
| following example creates a certificate, `e1`, that contains three | |
| certificates in its certificate chain. | |
| The following commands creates four key pairs named `ca`, `ca1`, `ca2`, and | |
| `e1`: | |
| ``` | |
| keytool -alias ca -dname CN=CA -genkeypair -keyalg rsa | |
| keytool -alias ca1 -dname CN=CA -genkeypair -keyalg rsa | |
| keytool -alias ca2 -dname CN=CA -genkeypair -keyalg rsa | |
| keytool -alias e1 -dname CN=E1 -genkeypair -keyalg rsa | |
| ``` | |
| The following two commands create a chain of signed certificates; `ca` | |
| signs `ca1` and `ca1` signs `ca2`, all of which are self-issued: | |
| ``` | |
| keytool -alias ca1 -certreq | | |
| keytool -alias ca -gencert -ext san=dns:ca1 | | |
| keytool -alias ca1 -importcert | |
| keytool -alias ca2 -certreq | | |
| keytool -alias ca1 -gencert -ext san=dns:ca2 | | |
| keytool -alias ca2 -importcert | |
| ``` | |
| The following command creates the certificate `e1` and stores it in the | |
| `e1.cert` file, which is signed by `ca2`. As a result, `e1` should contain | |
| `ca`, `ca1`, and `ca2` in its certificate chain: | |
| > `keytool -alias e1 -certreq | keytool -alias ca2 -gencert > e1.cert` | |
| `-genkeypair` | |
| : The following are the available options for the `-genkeypair` command: | |
| - {`-alias` *alias*}: Alias name of the entry to process | |
| - `-keyalg` *alg*: Key algorithm name | |
| - {`-keysize` *size*}: Key bit size | |
| - {`-groupname` *name*}: Group name. For example, an Elliptic Curve name. | |
| - {`-sigalg` *alg*}: Signature algorithm name | |
| - {`-signer` *alias*}: Signer alias | |
| - \[`-signerkeypass` *arg*\]: Signer key password | |
| - \[`-dname` *name*\]: Distinguished name | |
| - {`-startdate` *date*}: Certificate validity start date and time | |
| - {`-ext` *value*}\*: X.509 extension | |
| - {`-validity` *days*}: Validity number of days | |
| - \[`-keypass` *arg*\]: Key password | |
| - {`-keystore` *keystore*}: Keystore name | |
| - \[`-storepass` *arg*\]: Keystore password | |
| - {`-storetype` *type*}: Keystore type | |
| - {`-providername` *name*}: Provider name | |
| - {`-addprovider` *name* \[`-providerarg` *arg*\]}: Add security provider | |
| by name (such as SunPKCS11) with an optional configure argument. | |
| - {`-providerclass` *class* \[`-providerarg` *arg*\] }: Add security | |
| provider by fully qualified class name with an optional configure | |
| argument. | |
| - {`-providerpath` *list*}: Provider classpath | |
| - {`-v`}: Verbose output | |
| - {`-protected`}: Password provided through a protected mechanism | |
| Use the `-genkeypair` command to generate a key pair (a public key and | |
| associated private key). When the `-signer` option is not specified, | |
| the public key is wrapped in an X.509 v3 self-signed certificate and | |
| stored as a single-element certificate chain. When the `-signer` | |
| option is specified, a new certificate is generated and signed by | |
| the designated signer and stored as a multiple-element certificate | |
| chain (containing the generated certificate itself, and the signer's | |
| certificate chain). The certificate chain and private key are stored | |
| in a new keystore entry that is identified by its alias. | |
| The `-keyalg` value specifies the algorithm to be used to generate the key | |
| pair. The `-keysize` value specifies the size of each key to be generated. | |
| The `-groupname` value specifies the named group (for example, the standard | |
| or predefined name of an Elliptic Curve) of the key to be generated. | |
| When a `-keysize` value is provided, it will be used to initialize a | |
| `KeyPairGenerator` object using the `initialize(int keysize)` | |
| method. When a `-groupname` value is provided, it will be used to | |
| initialize a `KeyPairGenerator` object using the | |
| `initialize(AlgorithmParameterSpec params)` method where `params` | |
| is `new NamedParameterSpec(groupname)`. | |
| Only one of `-groupname` and `-keysize` can be specified. If an algorithm | |
| has multiple named groups that have the same key size, the `-groupname` | |
| option should usually be used. In this case, if `-keysize` is specified, | |
| it's up to the security provider to determine which named group is chosen | |
| when generating a key pair. | |
| The `-sigalg` value specifies the algorithm that should be used | |
| to sign the certificate. This algorithm must be compatible with | |
| the `-keyalg` value. | |
| The `-signer` value specifies the alias of a `PrivateKeyEntry` for the | |
| signer that already exists in the keystore. This option is used to | |
| sign the certificate with the signer's private key. This is especially | |
| useful for key agreement algorithms (i.e. the `-keyalg` value is `XDH`, | |
| `X25519`, `X448`, or `DH`) as these keys cannot be used for digital | |
| signatures, and therefore a self-signed certificate cannot be created. | |
| The `-signerkeypass` value specifies the password of the signer's private | |
| key. It can be specified if the private key of the signer entry is | |
| protected by a password different from the store password. | |
| The `-dname` value specifies the X.500 Distinguished Name to be associated | |
| with the value of `-alias`. If the `-signer` option is not specified, the | |
| issuer and subject fields of the self-signed certificate are populated | |
| with the specified distinguished name. If the `-signer` option is | |
| specified, the subject field of the certificate is populated with the | |
| specified distinguished name and the issuer field is populated with the | |
| subject field of the signer's certificate. If a distinguished name is not | |
| provided at the command line, then the user is prompted for one. | |
| The value of `-keypass` is a password used to protect the private key of | |
| the generated key pair. If a password is not provided, then the user is | |
| prompted for it. If you press the **Return** key at the prompt, then the | |
| key password is set to the same password as the keystore password. The | |
| `-keypass` value must have at least six characters. | |
| The value of `-startdate` specifies the issue time of the certificate, also | |
| known as the "Not Before" value of the X.509 certificate's Validity field. | |
| The option value can be set in one of these two forms: | |
| (\[`+-`\]*nnn*\[`ymdHMS`\])+ | |
| \[*yyyy*`/`*mm*`/`*dd*\] \[*HH*`:`*MM*`:`*SS*\] | |
| With the first form, the issue time is shifted by the specified value from | |
| the current time. The value is a concatenation of a sequence of subvalues. | |
| Inside each subvalue, the plus sign (+) means shift forward, and the minus | |
| sign (-) means shift backward. The time to be shifted is *nnn* units of | |
| years, months, days, hours, minutes, or seconds (denoted by a single | |
| character of `y`, `m`, `d`, `H`, `M`, or `S` respectively). The exact value | |
| of the issue time is calculated by using the | |
| `java.util.GregorianCalendar.add(int field, int amount)` method on each | |
| subvalue, from left to right. For example, the issue time can be specified | |
| by: | |
| ``` | |
| Calendar c = new GregorianCalendar(); | |
| c.add(Calendar.YEAR, -1); | |
| c.add(Calendar.MONTH, 1); | |
| c.add(Calendar.DATE, -1); | |
| return c.getTime() | |
| ``` | |
| With the second form, the user sets the exact issue time in two parts, | |
| year/month/day and hour:minute:second (using the local time zone). The user | |
| can provide only one part, which means the other part is the same as the | |
| current date (or time). The user must provide the exact number of digits | |
| shown in the format definition (padding with 0 when shorter). When both | |
| date and time are provided, there is one (and only one) space character | |
| between the two parts. The hour should always be provided in 24-hour | |
| format. | |
| When the option isn't provided, the start date is the current time. The | |
| option can only be provided one time. | |
| The value of *date* specifies the number of days (starting at the date | |
| specified by `-startdate`, or the current date when `-startdate` isn't | |
| specified) for which the certificate should be considered valid. | |
| `-genseckey` | |
| : The following are the available options for the `-genseckey` command: | |
| - {`-alias` *alias*}: Alias name of the entry to process | |
| - \[`-keypass` *arg*\]: Key password | |
| - `-keyalg` *alg*: Key algorithm name | |
| - {`-keysize` *size*}: Key bit size | |
| - {`-keystore` *keystore*}: Keystore name | |
| - \[`-storepass` *arg*\]: Keystore password | |
| - {`-storetype` *type*}: Keystore type | |
| - {`-providername` *name*}: Provider name | |
| - {`-addprovider` *name* \[`-providerarg` *arg*\]}: Add security provider | |
| by name (such as SunPKCS11) with an optional configure argument. | |
| - {`-providerclass` *class* \[`-providerarg` *arg*\]}: Add security | |
| provider by fully qualified class name with an optional configure | |
| argument. | |
| - {`-providerpath` *list*}: Provider classpath | |
| - {`-v`}: Verbose output | |
| - {`-protected`}: Password provided through a protected mechanism | |
| Use the `-genseckey` command to generate a secret key and store it in a new | |
| `KeyStore.SecretKeyEntry` identified by `alias`. | |
| The value of `-keyalg` specifies the algorithm to be used to generate the | |
| secret key, and the value of `-keysize` specifies the size of the key that | |
| is generated. The `-keypass` value is a password that protects the secret | |
| key. If a password is not provided, then the user is prompted for it. If | |
| you press the **Return** key at the prompt, then the key password is set to | |
| the same password that is used for the `-keystore`. The `-keypass` value | |
| must contain at least six characters. | |
| `-importcert` | |
| : The following are the available options for the `-importcert` command: | |
| - {`-noprompt`}: Do not prompt | |
| - {`-trustcacerts`}: Trust certificates from cacerts | |
| - {`-protected`}: Password is provided through protected mechanism | |
| - {`-alias` *alias*}: Alias name of the entry to process | |
| - {`-file` *file*}: Input file name | |
| - \[`-keypass` *arg*\]: Key password | |
| - {`-keystore` *keystore*}: Keystore name | |
| - {`-cacerts`}: Access the cacerts keystore | |
| - \[`-storepass` *arg*\]: Keystore password | |
| - {`-storetype` *type*}: Keystore type | |
| - {`-providername` *name*}: Provider name | |
| - {`-addprovider` *name* \[`-providerarg` *arg*\]}: Add security provider | |
| by name (such as SunPKCS11) with an optional configure argument. | |
| - {`-providerclass` *class* \[`-providerarg` *arg*\]}: Add security | |
| provider by fully qualified class name with an optional configure | |
| argument. | |
| - {`-providerpath` *list*}: Provider classpath | |
| - {`-v`}: Verbose output | |
| Use the `-importcert` command to read the certificate or certificate chain | |
| (where the latter is supplied in a PKCS\#7 formatted reply or in a sequence | |
| of X.509 certificates) from `-file` *file*, and store it in the `keystore` | |
| entry identified by `-alias`. If `-file` *file* is not specified, then the | |
| certificate or certificate chain is read from `stdin`. | |
| The `keytool` command can import X.509 v1, v2, and v3 certificates, and | |
| PKCS\#7 formatted certificate chains consisting of certificates of that | |
| type. The data to be imported must be provided either in binary encoding | |
| format or in printable encoding format (also known as Base64 encoding) as | |
| defined by the Internet RFC 1421 standard. In the latter case, the encoding | |
| must be bounded at the beginning by a string that starts with `-----BEGIN`, | |
| and bounded at the end by a string that starts with `-----END`. | |
| You import a certificate for two reasons: To add it to the list of trusted | |
| certificates, and to import a certificate reply received from a certificate | |
| authority (CA) as the result of submitting a Certificate Signing Request | |
| (CSR) to that CA. See the `-certreq` command in [Commands for Generating a | |
| Certificate Request]. | |
| The type of import is indicated by the value of the `-alias` option. If the | |
| alias doesn't point to a key entry, then the `keytool` command assumes you | |
| are adding a trusted certificate entry. In this case, the alias shouldn't | |
| already exist in the keystore. If the alias does exist, then the `keytool` | |
| command outputs an error because a trusted certificate already exists for | |
| that alias, and doesn't import the certificate. If `-alias` points to a key | |
| entry, then the `keytool` command assumes that you're importing a | |
| certificate reply. | |
| `-importpass` | |
| : The following are the available options for the `-importpass` command: | |
| - {`-alias` *alias*}: Alias name of the entry to process | |
| - \[`-keypass` *arg*\]: Key password | |
| - {`-keyalg` *alg*}: Key algorithm name | |
| - {`-keysize` *size*}: Key bit size | |
| - {`-keystore` *keystore*}: Keystore name | |
| - \[`-storepass` *arg*\]: Keystore password | |
| - {`-storetype` *type*}: Keystore type | |
| - {`-providername` *name*}: Provider name | |
| - {`-addprovider` *name* \[`-providerarg` *arg*\]}: Add security provider | |
| by name (such as SunPKCS11) with an optional configure argument. | |
| - {`-providerclass` *class* \[`-providerarg` *arg*\]}: Add security | |
| provider by fully qualified class name with an optional configure | |
| argument. | |
| - {`-providerpath` *list*}: Provider classpath | |
| - {`-v`}: Verbose output | |
| - {`-protected`}: Password provided through a protected mechanism | |
| Use the `-importpass` command to imports a passphrase and store it in a new | |
| `KeyStore.SecretKeyEntry` identified by `-alias`. The passphrase may be | |
| supplied via the standard input stream; otherwise the user is prompted for | |
| it. The `-keypass` option provides a password to protect the imported | |
| passphrase. If a password is not provided, then the user is prompted for | |
| it. If you press the **Return** key at the prompt, then the key password is | |
| set to the same password as that used for the `keystore`. The `-keypass` | |
| value must contain at least six characters. | |
| ## Commands for Importing Contents from Another Keystore | |
| `-importkeystore` | |
| : The following are the available options for the `-importkeystore` command: | |
| - `-srckeystore` *keystore*: Source keystore name | |
| - {`-destkeystore` *keystore*}: Destination keystore name | |
| - {`-srcstoretype` *type*}: Source keystore type | |
| - {`-deststoretype` *type*}: Destination keystore type | |
| - \[`-srcstorepass` *arg*\]: Source keystore password | |
| - \[`-deststorepass` *arg*\]: Destination keystore password | |
| - {`-srcprotected`}: Source keystore password protected | |
| - {`-destprotected`}: Destination keystore password protected | |
| - {`-srcprovidername` *name*}: Source keystore provider name | |
| - {`-destprovidername` *name*}: Destination keystore provider name | |
| - {`-srcalias` *alias*}: Source alias | |
| - {`-destalias` *alias*}: Destination alias | |
| - \[`-srckeypass` *arg*\]: Source key password | |
| - \[`-destkeypass` *arg*\]: Destination key password | |
| - {`-noprompt`}: Do not prompt | |
| - {`-addprovider` *name* \[`-providerarg` *arg*\]}: Add security provider | |
| by name (such as SunPKCS11) with an optional configure argument. | |
| - {`-providerclass` *class* \[`-providerarg` *arg*\]}: Add security | |
| provider by fully qualified class name with an optional configure | |
| argument | |
| - {`-providerpath` *list*}: Provider classpath | |
| - {`-v`}: Verbose output | |
| **Note:** | |
| This is the first line of all options: | |
| > `-srckeystore` *keystore* `-destkeystore` *keystore* | |
| Use the `-importkeystore` command to import a single entry or all entries | |
| from a source keystore to a destination keystore. | |
| **Note:** | |
| If you do not specify `-destkeystore` when using the | |
| `keytool -importkeystore` command, then the default keystore used is | |
| `$HOME/.keystore`. | |
| When the `-srcalias` option is provided, the command imports the single | |
| entry identified by the alias to the destination keystore. If a destination | |
| alias isn't provided with `-destalias`, then `-srcalias` is used as the | |
| destination alias. If the source entry is protected by a password, then | |
| `-srckeypass` is used to recover the entry. If `-srckeypass` isn't | |
| provided, then the `keytool` command attempts to use `-srcstorepass` to | |
| recover the entry. If `-srcstorepass` is not provided or is incorrect, then | |
| the user is prompted for a password. The destination entry is protected | |
| with `-destkeypass`. If `-destkeypass` isn't provided, then the destination | |
| entry is protected with the source entry password. For example, most | |
| third-party tools require `storepass` and `keypass` in a PKCS \#12 keystore | |
| to be the same. To create a PKCS\#12 keystore for these tools, always | |
| specify a `-destkeypass` that is the same as `-deststorepass`. | |
| If the `-srcalias` option isn't provided, then all entries in the source | |
| keystore are imported into the destination keystore. Each destination entry | |
| is stored under the alias from the source entry. If the source entry is | |
| protected by a password, then `-srcstorepass` is used to recover the entry. | |
| If `-srcstorepass` is not provided or is incorrect, then the user is | |
| prompted for a password. If a source keystore entry type isn't supported in | |
| the destination keystore, or if an error occurs while storing an entry into | |
| the destination keystore, then the user is prompted either to skip the | |
| entry and continue or to quit. The destination entry is protected with the | |
| source entry password. | |
| If the destination alias already exists in the destination keystore, then | |
| the user is prompted either to overwrite the entry or to create a new entry | |
| under a different alias name. | |
| If the `-noprompt` option is provided, then the user isn't prompted for a | |
| new destination alias. Existing entries are overwritten with the | |
| destination alias name. Entries that can't be imported are skipped and a | |
| warning is displayed. | |
| ## Commands for Generating a Certificate Request | |
| `-certreq` | |
| : The following are the available options for the `-certreq` command: | |
| - {`-alias` *alias*}: Alias name of the entry to process | |
| - {`-sigalg` *alg*}: Signature algorithm name | |
| - {`-file` *file*}: Output file name | |
| - \[ `-keypass` *arg*\]: Key password | |
| - {`-keystore` *keystore*}: Keystore name | |
| - {`-dname` *name*}: Distinguished name | |
| - {`-ext` *value*}: X.509 extension | |
| - \[`-storepass` *arg*\]: Keystore password | |
| - {`-storetype` *type*}: Keystore type | |
| - {`-providername` *name*}: Provider name | |
| - {`-addprovider` *name* \[`-providerarg` *arg*\]}: Add security provider | |
| by name (such as SunPKCS11) with an optional configure argument. | |
| - {`-providerclass` *class* \[`-providerarg` *arg*\]}: Add security | |
| provider by fully qualified class name with an optional configure | |
| argument. | |
| - {`-providerpath` *list*}: Provider classpath | |
| - {`-v`}: Verbose output | |
| - {`-protected`}: Password provided through a protected mechanism | |
| Use the `-certreq` command to generate a Certificate Signing Request (CSR) | |
| using the PKCS \#10 format. | |
| A CSR is intended to be sent to a CA. The CA authenticates the certificate | |
| requestor (usually offline) and returns a certificate or certificate chain | |
| to replace the existing certificate chain (initially a self-signed | |
| certificate) in the keystore. | |
| The private key associated with *alias* is used to create the PKCS \#10 | |
| certificate request. To access the private key, the correct password must | |
| be provided. If `-keypass` isn't provided at the command line and is | |
| different from the password used to protect the integrity of the keystore, | |
| then the user is prompted for it. If `-dname` is provided, then it is used | |
| as the subject in the CSR. Otherwise, the X.500 Distinguished Name | |
| associated with alias is used. | |
| The `-sigalg` value specifies the algorithm that should be used to sign the | |
| CSR. | |
| The CSR is stored in the `-file` *file*. If a file is not specified, then | |
| the CSR is output to `-stdout`. | |
| Use the `-importcert` command to import the response from the CA. | |
| ## Commands for Exporting Data | |
| `-exportcert` | |
| : The following are the available options for the `-exportcert` command: | |
| - {`-rfc`}: Output in RFC style | |
| - {`-alias` *alias*}: Alias name of the entry to process | |
| - {`-file` *file*}: Output file name | |
| - {`-keystore` *keystore*}: Keystore name | |
| - {`-cacerts`}: Access the cacerts keystore | |
| - \[`-storepass` *arg*\]: Keystore password | |
| - {`-storetype` *type*}: Keystore type | |
| - {`-providername` *name*}: Provider name | |
| - {`-addprovider` *name* \[`-providerarg` *arg*\]}: Add security provider | |
| by name (such as SunPKCS11) with an optional configure argument. | |
| - {`-providerclass` *class* \[`-providerarg` *arg*\] }: Add security | |
| provider by fully qualified class name with an optional configure | |
| argument. | |
| - {`-providerpath` *list*}: Provider classpath | |
| - {`-v`}: Verbose output | |
| - {`-protected`}: Password provided through a protected mechanism | |
| Use the `-exportcert` command to read a certificate from the keystore that | |
| is associated with `-alias` *alias* and store it in the `-file` *file*. | |
| When a file is not specified, the certificate is output to `stdout`. | |
| By default, the certificate is output in binary encoding. If the `-rfc` | |
| option is specified, then the output in the printable encoding format | |
| defined by the Internet RFC 1421 Certificate Encoding Standard. | |
| If `-alias` refers to a trusted certificate, then that certificate is | |
| output. Otherwise, `-alias` refers to a key entry with an associated | |
| certificate chain. In that case, the first certificate in the chain is | |
| returned. This certificate authenticates the public key of the entity | |
| addressed by `-alias`. | |
| ## Commands for Displaying Data | |
| `-list` | |
| : The following are the available options for the `-list` command: | |
| - {`-rfc`}: Output in RFC style | |
| - {`-alias` *alias*}: Alias name of the entry to process | |
| - {`-keystore` *keystore*}: Keystore name | |
| - {`-cacerts`}: Access the cacerts keystore | |
| - \[`-storepass` *arg*\]: Keystore password | |
| - {`-storetype` *type*}: Keystore type | |
| - {`-providername` *name*}: Provider name | |
| - {`-addprovider` *name* \[`-providerarg` *arg*\]}: Add security provider | |
| by name (such as SunPKCS11) with an optional configure argument. | |
| - {`-providerclass` *class* \[`-providerarg` *arg*\] }: Add security | |
| provider by fully qualified class name with an optional configure | |
| argument. | |
| - {`-providerpath` *list*}: Provider classpath | |
| - {`-v`}: Verbose output | |
| - {`-protected`}: Password provided through a protected mechanism | |
| Use the `-list` command to print the contents of the keystore entry | |
| identified by `-alias` to `stdout`. If `-alias` *alias* is not specified, | |
| then the contents of the entire keystore are printed. | |
| By default, this command prints the SHA-256 fingerprint of a certificate. | |
| If the `-v` option is specified, then the certificate is printed in | |
| human-readable format, with additional information such as the owner, | |
| issuer, serial number, and any extensions. If the `-rfc` option is | |
| specified, then the certificate contents are printed by using the printable | |
| encoding format, as defined by the Internet RFC 1421 Certificate Encoding | |
| Standard. | |
| **Note:** | |
| You can't specify both `-v` and `-rfc` in the same command. Otherwise, an | |
| error is reported. | |
| `-printcert` | |
| : The following are the available options for the `-printcert` command: | |
| - {`-rfc`}: Output in RFC style | |
| - {`-file` *cert\_file*}: Input file name | |
| - {`-sslserver` *server*\[`:`*port*\]}:: Secure Sockets Layer (SSL) | |
| server host and port | |
| - {`-jarfile` *JAR\_file*}: Signed `.jar` file | |
| - {`-keystore` *keystore*}: Keystore name | |
| - {`-trustcacerts`}: Trust certificates from cacerts | |
| - \[`-storepass` *arg*\]: Keystore password | |
| - {`-storetype` *type*}: Keystore type | |
| - {`-providername` *name*}: Provider name | |
| - {`-addprovider` *name* \[`-providerarg` *arg*\]}: Add security provider | |
| by name (such as SunPKCS11) with an optional configure argument. | |
| - {`-providerclass` *class* \[`-providerarg` *arg*\]}: Add security | |
| provider by fully qualified class name with an optional configure | |
| argument. | |
| - {`-providerpath` *list*}: Provider classpath | |
| - {`-protected`}: Password is provided through protected mechanism | |
| - {`-v`}: Verbose output | |
| Use the `-printcert` command to read and print the certificate from `-file` | |
| *cert\_file*, the SSL server located at `-sslserver` *server*\[`:`*port*\], | |
| or the signed JAR file specified by `-jarfile` *JAR\_file*. It prints its | |
| contents in a human-readable format. When a port is not specified, the | |
| standard HTTPS port 443 is assumed. | |
| **Note:** | |
| The `-sslserver` and `-file` options can't be provided in the same command. | |
| Otherwise, an error is reported. If you don't specify either option, then | |
| the certificate is read from `stdin`. | |
| When`-rfc` is specified, the `keytool` command prints the certificate in | |
| PEM mode as defined by the Internet RFC 1421 Certificate Encoding standard. | |
| If the certificate is read from a file or `stdin`, then it might be either | |
| binary encoded or in printable encoding format, as defined by the RFC 1421 | |
| Certificate Encoding standard. | |
| If the SSL server is behind a firewall, then the | |
| `-J-Dhttps.proxyHost=proxyhost` and `-J-Dhttps.proxyPort=proxyport` options | |
| can be specified on the command line for proxy tunneling. | |
| **Note:** | |
| This command can be used independently of a keystore. This command does not | |
| check for the weakness of a certificate's signature algorithm if it is a | |
| trusted certificate in the user keystore (specified by `-keystore`) or in | |
| the `cacerts` keystore (if `-trustcacerts` is specified). | |
| `-printcertreq` | |
| : The following are the available options for the `-printcertreq` command: | |
| - {`-file` *file*}: Input file name | |
| - {`-v`}: Verbose output | |
| Use the `-printcertreq` command to print the contents of a PKCS \#10 format | |
| certificate request, which can be generated by the `keytool -certreq` | |
| command. The command reads the request from file. If there is no file, then | |
| the request is read from the standard input. | |
| `-printcrl` | |
| : The following are the available options for the `-printcrl` command: | |
| - {`-file crl`}: Input file name | |
| - {`-keystore` *keystore*}: Keystore name | |
| - {`-trustcacerts`}: Trust certificates from cacerts | |
| - \[`-storepass` *arg*\]: Keystore password | |
| - {`-storetype` *type*}: Keystore type | |
| - {`-providername` *name*}: Provider name | |
| - {`-addprovider` *name* \[`-providerarg` *arg*\]}: Add security provider | |
| by name (such as SunPKCS11) with an optional configure argument. | |
| - {`-providerclass` *class* \[`-providerarg` *arg*\]}: Add security | |
| provider by fully qualified class name with an optional configure | |
| argument. | |
| - {`-providerpath` *list*}: Provider classpath | |
| - {`-protected`}: Password is provided through protected mechanism | |
| - {`-v`}: Verbose output | |
| Use the `-printcrl` command to read the Certificate Revocation List (CRL) | |
| from `-file crl` . A CRL is a list of the digital certificates that were | |
| revoked by the CA that issued them. The CA generates the `crl` file. | |
| **Note:** | |
| This command can be used independently of a keystore. This command attempts | |
| to verify the CRL using a certificate from the user keystore (specified by | |
| `-keystore`) or the `cacerts` keystore (if `-trustcacerts` is specified), and | |
| will print out a warning if it cannot be verified. | |
| ## Commands for Managing the Keystore | |
| `-storepasswd` | |
| : The following are the available options for the `-storepasswd` command: | |
| - \[`-new` *arg*\]: New password | |
| - {`-keystore` *keystore*}: Keystore name | |
| - {`-cacerts`}: Access the cacerts keystore | |
| - \[`-storepass` *arg*\]: Keystore password | |
| - {`-storetype` *type*}: Keystore type | |
| - {`-providername` *name*}: Provider name | |
| - {`-addprovider` *name* \[`-providerarg` *arg*\]}: Add security provider | |
| by name (such as SunPKCS11) with an optional configure argument. | |
| - {`-providerclass` *class* \[`-providerarg` *arg*\]}: Add security | |
| provider by fully qualified class name with an optional configure | |
| argument. | |
| - {`-providerpath` *list*}: Provider classpath | |
| - {`-v`}: Verbose output | |
| Use the `-storepasswd` command to change the password used to protect the | |
| integrity of the keystore contents. The new password is set by `-new` *arg* | |
| and must contain at least six characters. | |
| `-keypasswd` | |
| : The following are the available options for the `-keypasswd` command: | |
| - {`-alias` *alias*}: Alias name of the entry to process | |
| - \[`-keypass` *old\_keypass*\]: Key password | |
| - \[`-new` *new\_keypass*\]: New password | |
| - {`-keystore` *keystore*}: Keystore name | |
| - {`-storepass` *arg*}: Keystore password | |
| - {`-storetype` *type*}: Keystore type | |
| - {`-providername` *name*}: Provider name | |
| - {`-addprovider` *name* \[`-providerarg` *arg*\]}: Add security provider | |
| by name (such as SunPKCS11) with an optional configure argument. | |
| - {`-providerclass` *class* \[`-providerarg` *arg*\]}: Add security | |
| provider by fully qualified class name with an optional configure | |
| argument. | |
| - {`-providerpath` *list*}: Provider classpath | |
| - {`-v`}: Verbose output | |
| Use the `-keypasswd` command to change the password (under which | |
| private/secret keys identified by `-alias` are protected) from `-keypass` | |
| *old\_keypass* to `-new` *new\_keypass*. The password value must contain at | |
| least six characters. | |
| If the `-keypass` option isn't provided at the command line and the | |
| `-keypass` password is different from the keystore password (`-storepass` | |
| *arg*), then the user is prompted for it. | |
| If the `-new` option isn't provided at the command line, then the user is | |
| prompted for it. | |
| `-delete` | |
| : The following are the available options for the `-delete` command: | |
| - \[`-alias` *alias*\]: Alias name of the entry to process | |
| - {`-keystore` *keystore*}: Keystore name | |
| - {`-cacerts`}: Access the cacerts keystore | |
| - \[`-storepass` *arg*\]: Keystore password | |
| - {`-storetype` *type*}: Keystore type | |
| - {`-providername` *name*}: Provider name | |
| - {`-addprovider` *name* \[`-providerarg` *arg*\]}: Add security provider | |
| by name (such as SunPKCS11) with an optional configure argument. | |
| - {`-providerclass` *class* \[`-providerarg` *arg*\]}: Add security | |
| provider by fully qualified class name with an optional configure | |
| argument. | |
| - {`-providerpath` *list*}: Provider classpath | |
| - {`-v`}: Verbose output | |
| - {`-protected`}: Password provided through a protected mechanism | |
| Use the `-delete` command to delete the `-alias` *alias* entry from the | |
| keystore. When not provided at the command line, the user is prompted for | |
| the `alias`. | |
| `-changealias` | |
| : The following are the available options for the `-changealias` command: | |
| - {`-alias` *alias*}: Alias name of the entry to process | |
| - \[`-destalias` *alias*\]: Destination alias | |
| - \[`-keypass` *arg*\]: Key password | |
| - {`-keystore` *keystore*}: Keystore name | |
| - {`-cacerts`}: Access the cacerts keystore | |
| - \[`-storepass` *arg*\]: Keystore password | |
| - {`-storetype` *type*}: Keystore type | |
| - {`-providername` *name*}: Provider name | |
| - {`-addprovider` *name* \[`-providerarg` *arg*\]}: Add security provider | |
| by name (such as SunPKCS11) with an optional configure argument. | |
| - {`-providerclass` *class* \[`-providerarg` *arg*\]}: Add security | |
| provider by fully qualified class name with an optional configure | |
| argument. | |
| - {`-providerpath` *list*}: Provider classpath | |
| - {`-v`}: Verbose output | |
| - {`-protected`}: Password provided through a protected mechanism | |
| Use the `-changealias` command to move an existing keystore entry from | |
| `-alias` *alias* to a new `-destalias` *alias*. If a destination alias is | |
| not provided, then the command prompts you for one. If the original entry | |
| is protected with an entry password, then the password can be supplied with | |
| the `-keypass` option. If a key password is not provided, then the | |
| `-storepass` (if provided) is attempted first. If the attempt fails, then | |
| the user is prompted for a password. | |
| ## Commands for Displaying Security-related Information | |
| `-showinfo` | |
| : The following are the available options for the `-showinfo` command: | |
| - {`-tls`}: Displays TLS configuration information | |
| - {`-v`}: Verbose output | |
| Use the `-showinfo` command to display various security-related | |
| information. The `-tls` option displays TLS configurations, such as | |
| the list of enabled protocols and cipher suites. | |
| ## Commands for Displaying Program Version | |
| You can use `-version` to print the program version of `keytool`. | |
| ## Commands for Displaying Help Information | |
| You can use `--help` to display a list of `keytool` commands or to display help | |
| information about a specific `keytool` command. | |
| - To display a list of `keytool` commands, enter: | |
| > `keytool --help` | |
| - To display help information about a specific `keytool` command, enter: | |
| > `keytool -<command> --help` | |
| ## Common Command Options | |
| The `-v` option can appear for all commands except `--help`. When the `-v` | |
| option appears, it signifies verbose mode, which means that more information is | |
| provided in the output. | |
| The `-J`*option* argument can appear for any command. When the `-J`*option* is | |
| used, the specified *option* string is passed directly to the Java interpreter. | |
| This option doesn't contain any spaces. It's useful for adjusting the execution | |
| environment or memory usage. For a list of possible interpreter options, enter | |
| `java -h` or `java -X` at the command line. | |
| These options can appear for all commands operating on a keystore: | |
| `-storetype` *storetype* | |
| : This qualifier specifies the type of keystore to be instantiated. | |
| `-keystore` *keystore* | |
| : The keystore location. | |
| If the JKS `storetype` is used and a keystore file doesn't yet exist, then | |
| certain `keytool` commands can result in a new keystore file being created. | |
| For example, if `keytool -genkeypair` is called and the `-keystore` option | |
| isn't specified, the default keystore file named `.keystore` is created in | |
| the user's home directory if it doesn't already exist. Similarly, if the | |
| `-keystore ks_file` option is specified but `ks_file` doesn't exist, then | |
| it is created. For more information on the JKS `storetype`, see the | |
| **KeyStore Implementation** section in **KeyStore aliases**. | |
| Note that the input stream from the `-keystore` option is passed to the | |
| `KeyStore.load` method. If `NONE` is specified as the URL, then a null | |
| stream is passed to the `KeyStore.load` method. `NONE` should be specified | |
| if the keystore isn't file-based. For example, when the keystore resides on | |
| a hardware token device. | |
| `-cacerts` *cacerts* | |
| : Operates on the *cacerts* keystore . This option is equivalent to | |
| `-keystore` *path\_to\_cacerts* `-storetype` *type\_of\_cacerts*. An error | |
| is reported if the `-keystore` or `-storetype` option is used with the | |
| `-cacerts` option. | |
| `-storepass` \[`:env` \| `:file` \] *argument* | |
| : The password that is used to protect the integrity of the keystore. | |
| If the modifier `env` or `file` isn't specified, then the password has the | |
| value *argument*, which must contain at least six characters. Otherwise, | |
| the password is retrieved as follows: | |
| - `env`: Retrieve the password from the environment variable named | |
| *argument*. | |
| - `file`: Retrieve the password from the file named *argument*. | |
| **Note:** All other options that require passwords, such as `-keypass`, | |
| `-srckeypass`, `-destkeypass`, `-srcstorepass`, and `-deststorepass`, | |
| accept the `env` and `file` modifiers. Remember to separate the password | |
| option and the modifier with a colon (:). | |
| The password must be provided to all commands that access the keystore | |
| contents. For such commands, when the `-storepass` option isn't provided at | |
| the command line, the user is prompted for it. | |
| When retrieving information from the keystore, the password is optional. If | |
| a password is not specified, then the integrity of the retrieved | |
| information can't be verified and a warning is displayed. | |
| `-providername` *name* | |
| : Used to identify a cryptographic service provider's name when listed in the | |
| security properties file. | |
| `-addprovider` *name* | |
| : Used to add a security provider by name (such as SunPKCS11) . | |
| `-providerclass` *class* | |
| : Used to specify the name of a cryptographic service provider's master class | |
| file when the service provider isn't listed in the security properties | |
| file. | |
| `-providerpath` *list* | |
| : Used to specify the provider classpath. | |
| `-providerarg` *arg* | |
| : Used with the `-addprovider` or `-providerclass` option to represent an | |
| optional string input argument for the constructor of *class* name. | |
| `-protected=true`\|`false` | |
| : Specify this value as `true` when a password must be specified by way of a | |
| protected authentication path, such as a dedicated PIN reader. Because | |
| there are two keystores involved in the `-importkeystore` command, the | |
| following two options, `-srcprotected` and `-destprotected`, are provided | |
| for the source keystore and the destination keystore respectively. | |
| `-ext` {*name*{`:critical`} {`=`*value*}} | |
| : Denotes an X.509 certificate extension. The option can be used in | |
| `-genkeypair` and `-gencert` to embed extensions into the generated | |
| certificate, or in `-certreq` to show what extensions are requested in the | |
| certificate request. The option can appear multiple times. The *name* | |
| argument can be a supported extension name (see [Supported Named | |
| Extensions]) or an arbitrary OID number. The *value* argument, when | |
| provided, denotes the argument for the extension. When *value* is omitted, | |
| the default value of the extension or the extension itself requires no | |
| argument. The `:critical` modifier, when provided, means the extension's | |
| `isCritical` attribute is `true`; otherwise, it is `false`. You can use | |
| `:c` in place of `:critical`. | |
| `-conf` *file* | |
| : Specifies a pre-configured options file. | |
| ## Pre-configured options file | |
| A pre-configured options file is a Java properties file that can be specified | |
| with the `-conf` option. Each property represents the default option(s) for | |
| a keytool command using "keytool.*command_name*" as the property name. A | |
| special property named "keytool.all" represents the default option(s) applied | |
| to all commands. A property value can include `${prop}` which will be expanded | |
| to the system property associated with it. If an option value includes white | |
| spaces inside, it should be surrounded by quotation marks (" or '). All | |
| property names must be in lower case. | |
| When `keytool` is launched with a pre-configured options file, the value for | |
| "keytool.all" (if it exists) is prepended to the `keytool` command line first, | |
| with the value for the command name (if it exists) comes next, and the existing | |
| options on the command line at last. For a single-valued option, this allows | |
| the property for a specific command to override the "keytool.all" value, | |
| and the value specified on the command line to override both. For | |
| multiple-valued options, all of them will be used by `keytool`. | |
| For example, given the following file named `preconfig`: | |
| ``` | |
| # A tiny pre-configured options file | |
| keytool.all = -keystore ${user.home}/ks | |
| keytool.list = -v | |
| keytool.genkeypair = -keyalg rsa | |
| ``` | |
| `keytool -conf preconfig -list` is identical to | |
| > `keytool -keystore ~/ks -v -list` | |
| `keytool -conf preconfig -genkeypair -alias me` is identical to | |
| > `keytool -keystore ~/ks -keyalg rsa -genkeypair -alias me` | |
| `keytool -conf preconfig -genkeypair -alias you -keyalg ec` is identical to | |
| > `keytool -keystore ~/ks -keyalg rsa -genkeypair -alias you -keyalg ec` | |
| which is equivalent to | |
| > `keytool -keystore ~/ks -genkeypair -alias you -keyalg ec` | |
| because `-keyalg` is a single-valued option and the `ec` value specified | |
| on the command line overrides the preconfigured options file. | |
| ## Examples of Option Values | |
| The following examples show the defaults for various option values: | |
| ``` | |
| -alias "mykey" | |
| -keysize | |
| 2048 (when using -genkeypair and -keyalg is "DSA") | |
| 3072 (when using -genkeypair and -keyalg is "RSA", "RSASSA-PSS", or "DH") | |
| 384 (when using -genkeypair and -keyalg is "EC") | |
| 56 (when using -genseckey and -keyalg is "DES") | |
| 168 (when using -genseckey and -keyalg is "DESede") | |
| -groupname | |
| ed25519 (when using -genkeypair and -keyalg is "EdDSA", key size is 255) | |
| x25519 (when using -genkeypair and -keyalg is "XDH", key size is 255) | |
| -validity 90 | |
| -keystore <the file named .keystore in the user's home directory> | |
| -destkeystore <the file named .keystore in the user's home directory> | |
| -storetype <the value of the "keystore.type" property in the | |
| security properties file, which is returned by the static | |
| getDefaultType method in java.security.KeyStore> | |
| -file | |
| stdin (if reading) | |
| stdout (if writing) | |
| -protected false | |
| ``` | |
| When generating a certificate or a certificate request, the default signature | |
| algorithm (`-sigalg` option) is derived from the algorithm of the underlying | |
| private key to provide an appropriate level of security strength as follows: | |
| Table: Default Signature Algorithms | |
| keyalg key size default sigalg | |
| ------- -------- -------------- | |
| DSA any size SHA256withDSA | |
| RSA \< 624 SHA256withRSA (key size is too small for using SHA-384) | |
| \<= 7680 SHA384withRSA | |
| \> 7680 SHA512withRSA | |
| EC \< 512 SHA384withECDSA | |
| \>= 512 SHA512withECDSA | |
| RSASSA-PSS \< 624 RSASSA-PSS (with SHA-256, key size is too small for | |
| using SHA-384) | |
| \<= 7680 RSASSA-PSS (with SHA-384) | |
| \> 7680 RSASSA-PSS (with SHA-512) | |
| EdDSA 255 Ed25519 | |
| 448 Ed448 | |
| Ed25519 255 Ed25519 | |
| Ed448 448 Ed448 | |
| ------- -------- -------------- | |
| * The key size, measured in bits, corresponds to the size of the private key. | |
| This size is determined by the value of the `-keysize` or `-groupname` options | |
| or the value derived from a default setting. | |
| * An RSASSA-PSS signature algorithm uses a `MessageDigest` | |
| algorithm as its hash and MGF1 algorithms. | |
| * If neither a default `-keysize` or `-groupname` is defined for an algorithm, | |
| the security provider will choose a default setting. | |
| **Note:** | |
| To improve out of the box security, default keysize, groupname, and signature | |
| algorithm names are periodically updated to stronger values with each release | |
| of the JDK. If interoperability with older releases of the JDK is important, | |
| make sure that the defaults are supported by those releases. Alternatively, | |
| you can use the `-keysize`, `-groupname`, or `-sigalg` options to override | |
| the default values at your own risk. | |
| ## Supported Named Extensions | |
| The `keytool` command supports these named extensions. The names aren't | |
| case-sensitive. | |
| `BC` or `BasicConstraints` | |
| : Values: | |
| The full form is `ca:`{`true`\|`false`}\[`,pathlen:`*len*\] or *len*, which | |
| is short for `ca:true,pathlen:`*len*. | |
| When *len* is omitted, the resulting value is `ca:true`. | |
| `KU` or `KeyUsage` | |
| : Values: | |
| *usage*(`,` *usage*)\* | |
| *usage* can be one of the following: | |
| - `digitalSignature` | |
| - `nonRepudiation` (`contentCommitment`) | |
| - `keyEncipherment` | |
| - `dataEncipherment` | |
| - `keyAgreement` | |
| - `keyCertSign` | |
| - `cRLSign` | |
| - `encipherOnly` | |
| - `decipherOnly` | |
| Provided there is no ambiguity, the *usage* argument can be abbreviated | |
| with the first few letters (such as `dig` for `digitalSignature`) or in | |
| camel-case style (such as `dS` for `digitalSignature` or `cRLS` for | |
| `cRLSign`). The *usage* values are case-sensitive. | |
| `EKU` or `ExtendedKeyUsage` | |
| : Values: | |
| *usage*(`,` *usage*)\* | |
| *usage* can be one of the following: | |
| - `anyExtendedKeyUsage` | |
| - `serverAuth` | |
| - `clientAuth` | |
| - `codeSigning` | |
| - `emailProtection` | |
| - `timeStamping` | |
| - `OCSPSigning` | |
| - Any OID string | |
| Provided there is no ambiguity, the *usage* argument can be abbreviated | |
| with the first few letters or in camel-case style. The *usage* values are | |
| case-sensitive. | |
| `SAN` or `SubjectAlternativeName` | |
| : Values: | |
| *type*`:`*value*(`,` *type*`:`*value*)\* | |
| *type* can be one of the following: | |
| - `EMAIL` | |
| - `URI` | |
| - `DNS` | |
| - `IP` | |
| - `OID` | |
| The *value* argument is the string format value for the *type*. | |
| `IAN` or `IssuerAlternativeName` | |
| : Values: | |
| Same as `SAN` or `SubjectAlternativeName`. | |
| `SIA` or `SubjectInfoAccess` | |
| : Values: | |
| *method*`:`*location-type*`:`*location-value*(`,` | |
| *method*`:`*location-type*`:`*location-value*)\* | |
| *method* can be one of the following: | |
| - `timeStamping` | |
| - `caRepository` | |
| - Any OID | |
| The *location-type* and *location-value* arguments can be any | |
| *type*`:`*value* supported by the `SubjectAlternativeName` extension. | |
| `AIA` or `AuthorityInfoAccess` | |
| : Values: | |
| Same as `SIA` or `SubjectInfoAccess`. | |
| The *method* argument can be one of the following: | |
| - `ocsp` | |
| - `caIssuers` | |
| - Any OID | |
| When *name* is OID, the value is the hexadecimal dumped Definite Encoding Rules | |
| (DER) encoding of the `extnValue` for the extension excluding the OCTET STRING | |
| type and length bytes. Other than standard hexadecimal numbers (0-9, a-f, A-F), | |
| any extra characters are ignored in the HEX string. Therefore, both 01:02:03:04 | |
| and 01020304 are accepted as identical values. When there is no value, the | |
| extension has an empty value field. | |
| A special name `honored`, used only in `-gencert`, denotes how the extensions | |
| included in the certificate request should be honored. The value for this name | |
| is a comma-separated list of `all` (all requested extensions are honored), | |
| *name*{`:`\[`critical`\|`non-critical`\]} (the named extension is honored, but | |
| it uses a different `isCritical` attribute), and `-name` (used with `all`, | |
| denotes an exception). Requested extensions aren't honored by default. | |
| If, besides the`-ext honored` option, another named or OID `-ext` option is | |
| provided, this extension is added to those already honored. However, if this | |
| name (or OID) also appears in the honored value, then its value and criticality | |
| override that in the request. If an extension of the same type is provided | |
| multiple times through either a name or an OID, only the last extension is | |
| used. | |
| The `subjectKeyIdentifier` extension is always created. For non-self-signed | |
| certificates, the `authorityKeyIdentifier` is created. | |
| **CAUTION:** | |
| Users should be aware that some combinations of extensions (and other | |
| certificate fields) may not conform to the Internet standard. See [Certificate | |
| Conformance Warning]. | |
| ## Examples of Tasks in Creating a keystore | |
| The following examples describe the sequence actions in creating a keystore for | |
| managing public/private key pairs and certificates from trusted entities. | |
| - [Generating the Key Pair] | |
| - [Requesting a Signed Certificate from a CA] | |
| - [Importing a Certificate for the CA] | |
| - [Importing the Certificate Reply from the CA] | |
| - [Exporting a Certificate That Authenticates the Public Key] | |
| - [Importing the Keystore] | |
| - [Generating Certificates for an SSL Server] | |
| ## Generating the Key Pair | |
| Create a keystore and then generate the key pair. | |
| You can enter the command as a single line such as the following: | |
| > `keytool -genkeypair -dname "cn=myname, ou=mygroup, o=mycompany, | |
| c=mycountry" -alias business -keyalg rsa -keypass` *password* `-keystore | |
| /working/mykeystore -storepass password -validity 180` | |
| The command creates the keystore named `mykeystore` in the working directory | |
| (provided it doesn't already exist), and assigns it the password specified by | |
| `-keypass`. It generates a public/private key pair for the entity whose | |
| distinguished name is `myname`, `mygroup`, `mycompany`, and a two-letter | |
| country code of `mycountry`. It uses the RSA key generation algorithm | |
| to create the keys; both are 3072 bits. | |
| The command uses the default SHA384withRSA signature algorithm to create a | |
| self-signed certificate that includes the public key and the distinguished name | |
| information. The certificate is valid for 180 days, and is associated with the | |
| private key in a keystore entry referred to by `-alias business`. The private | |
| key is assigned the password specified by `-keypass`. | |
| The command is significantly shorter when the option defaults are accepted. In | |
| this case, only `-keyalg` is required, and the defaults are used for unspecified | |
| options that have default values. You are prompted for any required values. You | |
| could have the following: | |
| > `keytool -genkeypair -keyalg rsa` | |
| In this case, a keystore entry with the alias `mykey` is created, with a newly | |
| generated key pair and a certificate that is valid for 90 days. This entry is | |
| placed in your home directory in a keystore named `.keystore` . `.keystore` is | |
| created if it doesn't already exist. You are prompted for the distinguished | |
| name information, the keystore password, and the private key password. | |
| **Note:** | |
| The rest of the examples assume that you responded to the prompts with values | |
| equal to those specified in the first `-genkeypair` command. For example, a | |
| distinguished name of | |
| `cn=`*myname*`, ou=`*mygroup*`, o=`*mycompany*`, c=`*mycountry*. | |
| ## Requesting a Signed Certificate from a CA | |
| **Note:** | |
| Generating the key pair created a self-signed certificate; however, a | |
| certificate is more likely to be trusted by others when it is signed by a CA. | |
| To get a CA signature, complete the following process: | |
| 1. Generate a CSR: | |
| > `keytool -certreq -file myname.csr` | |
| This creates a CSR for the entity identified by the default alias `mykey` | |
| and puts the request in the file named `myname.csr`. | |
| 2. Submit `myname.csr` to a CA, such as DigiCert. | |
| The CA authenticates you, the requestor (usually offline), and returns a | |
| certificate, signed by them, authenticating your public key. In some cases, the | |
| CA returns a chain of certificates, each one authenticating the public key of | |
| the signer of the previous certificate in the chain. | |
| ## Importing a Certificate for the CA | |
| To import a certificate for the CA, complete the following process: | |
| 1. Before you import the certificate reply from a CA, you need one or more | |
| trusted certificates either in your keystore or in the `cacerts` keystore | |
| file. See `-importcert` in **Commands**. | |
| - If the certificate reply is a certificate chain, then you need the top | |
| certificate of the chain. The root CA certificate that authenticates | |
| the public key of the CA. | |
| - If the certificate reply is a single certificate, then you need a | |
| certificate for the issuing CA (the one that signed it). If that | |
| certificate isn't self-signed, then you need a certificate for its | |
| signer, and so on, up to a self-signed root CA certificate. | |
| The `cacerts` keystore ships with a set of root certificates issued by the | |
| CAs of [the Oracle Java Root Certificate program]( | |
| https://www.oracle.com/java/technologies/javase/carootcertsprogram.html). | |
| If you request a signed certificate from a CA, and a certificate | |
| authenticating that CA's public key hasn't been added to `cacerts`, then | |
| you must import a certificate from that CA as a trusted certificate. | |
| A certificate from a CA is usually self-signed or signed by another CA. If | |
| it is signed by another CA, you need a certificate that authenticates that | |
| CA's public key. | |
| For example, you have obtained a *X*`.cer` file from a company that is a CA | |
| and the file is supposed to be a self-signed certificate that authenticates | |
| that CA's public key. Before you import it as a trusted certificate, you | |
| should ensure that the certificate is valid by: | |
| 1. Viewing it with the `keytool -printcert` command or the | |
| `keytool -importcert` command without using the `-noprompt` option. | |
| Make sure that the displayed certificate fingerprints match the | |
| expected fingerprints. | |
| 2. Calling the person who sent the certificate, and comparing the | |
| fingerprints that you see with the ones that they show or that a secure | |
| public key repository shows. | |
| Only when the fingerprints are equal is it assured that the certificate | |
| wasn't replaced in transit with somebody else's certificate (such as an | |
| attacker's certificate). If such an attack takes place, and you didn't | |
| check the certificate before you imported it, then you would be trusting | |
| anything that the attacker signed. | |
| 2. Replace the self-signed certificate with a certificate chain, where each | |
| certificate in the chain authenticates the public key of the signer of the | |
| previous certificate in the chain, up to a root CA. | |
| If you trust that the certificate is valid, then you can add it to your | |
| keystore by entering the following command: | |
| > `keytool -importcert -alias` *alias* `-file *X*`.cer` | |
| This command creates a trusted certificate entry in the keystore from the | |
| data in the CA certificate file and assigns the values of the *alias* to | |
| the entry. | |
| ## Importing the Certificate Reply from the CA | |
| After you import a certificate that authenticates the public key of the CA that | |
| you submitted your certificate signing request to (or there is already such a | |
| certificate in the `cacerts` file), you can import the certificate reply and | |
| replace your self-signed certificate with a certificate chain. | |
| The certificate chain is one of the following: | |
| - Returned by the CA when the CA reply is a chain. | |
| - Constructed when the CA reply is a single certificate. This certificate | |
| chain is constructed by using the certificate reply and trusted | |
| certificates available either in the keystore where you import the reply or | |
| in the `cacerts` keystore file. | |
| For example, if you sent your certificate signing request to DigiCert, then you | |
| can import their reply by entering the following command: | |
| **Note:** | |
| In this example, the returned certificate is named `DCmyname.cer`. | |
| > `keytool -importcert -trustcacerts -file DCmyname.cer` | |
| ## Exporting a Certificate That Authenticates the Public Key | |
| **Note:** | |
| If you used the `jarsigner` command to sign a Java Archive (JAR) file, then | |
| clients that use the file will want to authenticate your signature. | |
| One way that clients can authenticate you is by importing your public key | |
| certificate into their keystore as a trusted entry. You can then export the | |
| certificate and supply it to your clients. | |
| For example: | |
| 1. Copy your certificate to a file named `myname.cer` by entering the | |
| following command: | |
| **Note:** | |
| In this example, the entry has an alias of `mykey`. | |
| > `keytool -exportcert -alias mykey -file myname.cer` | |
| 2. With the certificate and the signed JAR file, a client can use the | |
| `jarsigner` command to authenticate your signature. | |
| ## Importing the Keystore | |
| Use the `importkeystore` command to import an entire keystore into another | |
| keystore. This imports all entries from the source keystore, including keys and | |
| certificates, to the destination keystore with a single command. You can use | |
| this command to import entries from a different type of keystore. During the | |
| import, all new entries in the destination keystore will have the same alias | |
| names and protection passwords (for secret keys and private keys). If the | |
| `keytool` command can't recover the private keys or secret keys from the source | |
| keystore, then it prompts you for a password. If it detects alias duplication, | |
| then it asks you for a new alias, and you can specify a new alias or simply | |
| allow the `keytool` command to overwrite the existing one. | |
| For example, import entries from a typical JKS type keystore `key.jks` into a | |
| PKCS \#11 type hardware-based keystore, by entering the following command: | |
| > `keytool -importkeystore -srckeystore key.jks -destkeystore NONE | |
| -srcstoretype JKS -deststoretype PKCS11 -srcstorepass` *password* | |
| `-deststorepass` *password* | |
| The `importkeystore` command can also be used to import a single entry from a | |
| source keystore to a destination keystore. In this case, besides the options | |
| you used in the previous example, you need to specify the alias you want to | |
| import. With the `-srcalias` option specified, you can also specify the | |
| destination alias name, protection password for a secret or private key, and | |
| the destination protection password you want as follows: | |
| > `keytool -importkeystore -srckeystore key.jks -destkeystore NONE | |
| -srcstoretype JKS -deststoretype PKCS11 -srcstorepass` *password* | |
| `-deststorepass` *password* `-srcalias myprivatekey -destalias | |
| myoldprivatekey -srckeypass` *password* `-destkeypass` *password* | |
| `-noprompt` | |
| ## Generating Certificates for an SSL Server | |
| The following are `keytool` commands used to generate key pairs and | |
| certificates for three entities: | |
| - Root CA (`root`) | |
| - Intermediate CA (`ca`) | |
| - SSL server (`server`) | |
| Ensure that you store all the certificates in the same keystore. | |
| ``` | |
| keytool -genkeypair -keystore root.jks -alias root -ext bc:c -keyalg rsa | |
| keytool -genkeypair -keystore ca.jks -alias ca -ext bc:c -keyalg rsa | |
| keytool -genkeypair -keystore server.jks -alias server -keyalg rsa | |
| keytool -keystore root.jks -alias root -exportcert -rfc > root.pem | |
| keytool -storepass password -keystore ca.jks -certreq -alias ca | | |
| keytool -storepass password -keystore root.jks | |
| -gencert -alias root -ext BC=0 -rfc > ca.pem | |
| keytool -keystore ca.jks -importcert -alias ca -file ca.pem | |
| keytool -storepass password -keystore server.jks -certreq -alias server | | |
| keytool -storepass password -keystore ca.jks -gencert -alias ca | |
| -ext ku:c=dig,kE -rfc > server.pem | |
| cat root.pem ca.pem server.pem | | |
| keytool -keystore server.jks -importcert -alias server | |
| ``` | |
| ## Terms | |
| Keystore | |
| : A keystore is a storage facility for cryptographic keys and certificates. | |
| Keystore entries | |
| : Keystores can have different types of entries. The two most applicable | |
| entry types for the `keytool` command include the following: | |
| Key entries: Each entry holds very sensitive cryptographic key information, | |
| which is stored in a protected format to prevent unauthorized access. | |
| Typically, a key stored in this type of entry is a secret key, or a private | |
| key accompanied by the certificate chain for the corresponding public key. | |
| See **Certificate Chains**. The `keytool` command can handle both types of | |
| entries, while the `jarsigner` tool only handles the latter type of entry, | |
| that is private keys and their associated certificate chains. | |
| Trusted certificate entries: Each entry contains a single public key | |
| certificate that belongs to another party. The entry is called a trusted | |
| certificate because the keystore owner trusts that the public key in the | |
| certificate belongs to the identity identified by the subject (owner) of | |
| the certificate. The issuer of the certificate vouches for this, by signing | |
| the certificate. | |
| Keystore aliases | |
| : All keystore entries (key and trusted certificate entries) are accessed by | |
| way of unique aliases. | |
| An alias is specified when you add an entity to the keystore with the | |
| `-genseckey` command to generate a secret key, the `-genkeypair` command to | |
| generate a key pair (public and private key), or the `-importcert` command | |
| to add a certificate or certificate chain to the list of trusted | |
| certificates. Subsequent `keytool` commands must use this same alias to | |
| refer to the entity. | |
| For example, you can use the alias `duke` to generate a new public/private | |
| key pair and wrap the public key into a self-signed certificate with the | |
| following command. See **Certificate Chains**. | |
| > `keytool -genkeypair -alias duke -keyalg rsa -keypass` *passwd* | |
| This example specifies an initial *passwd* required by subsequent commands | |
| to access the private key associated with the alias `duke`. If you later | |
| want to change Duke's private key password, use a command such as the | |
| following: | |
| > `keytool -keypasswd -alias duke -keypass` *passwd* `-new` *newpasswd* | |
| This changes the initial *passwd* to *newpasswd*. A password shouldn't be | |
| specified on a command line or in a script unless it is for testing | |
| purposes, or you are on a secure system. If you don't specify a required | |
| password option on a command line, then you are prompted for it. | |
| Keystore implementation | |
| : The `KeyStore` class provided in the `java.security` package supplies | |
| well-defined interfaces to access and modify the information in a keystore. | |
| It is possible for there to be multiple different concrete implementations, | |
| where each implementation is that for a particular type of keystore. | |
| Currently, two command-line tools (`keytool` and `jarsigner`) make use of | |
| keystore implementations. Because the `KeyStore` class is `public`, users | |
| can write additional security applications that use it. | |
| In JDK 9 and later, the default keystore implementation is `PKCS12`. This | |
| is a cross platform keystore based on the RSA PKCS12 Personal Information | |
| Exchange Syntax Standard. This standard is primarily meant for storing or | |
| transporting a user's private keys, certificates, and miscellaneous | |
| secrets. There is another built-in implementation, provided by Oracle. It | |
| implements the keystore as a file with a proprietary keystore type (format) | |
| named `JKS`. It protects each private key with its individual password, and | |
| also protects the integrity of the entire keystore with a (possibly | |
| different) password. | |
| Keystore implementations are provider-based. More specifically, the | |
| application interfaces supplied by `KeyStore` are implemented in terms of a | |
| Service Provider Interface (SPI). That is, there is a corresponding | |
| abstract `KeystoreSpi` class, also in the `java.security package`, which | |
| defines the Service Provider Interface methods that providers must | |
| implement. The term *provider* refers to a package or a set of packages | |
| that supply a concrete implementation of a subset of services that can be | |
| accessed by the Java Security API. To provide a keystore implementation, | |
| clients must implement a provider and supply a `KeystoreSpi` subclass | |
| implementation, as described in Steps to Implement and Integrate a | |
| Provider. | |
| Applications can choose different types of keystore implementations from | |
| different providers, using the `getInstance` factory method supplied in the | |
| `KeyStore` class. A keystore type defines the storage and data format of | |
| the keystore information, and the algorithms used to protect private/secret | |
| keys in the keystore and the integrity of the keystore. Keystore | |
| implementations of different types aren't compatible. | |
| The `keytool` command works on any file-based keystore implementation. It | |
| treats the keystore location that is passed to it at the command line as a | |
| file name and converts it to a `FileInputStream`, from which it loads the | |
| keystore information. The `jarsigner` commands can read a keystore from any | |
| location that can be specified with a URL. | |
| For `keytool` and `jarsigner`, you can specify a keystore type at the | |
| command line, with the `-storetype` option. | |
| If you don't explicitly specify a keystore type, then the tools choose a | |
| keystore implementation based on the value of the `keystore.type` property | |
| specified in the security properties file. The security properties file is | |
| called `java.security`, and resides in the security properties directory: | |
| - **Linux and macOS:** `java.home/lib/security` | |
| - **Windows:** `java.home\lib\security` | |
| Each tool gets the `keystore.type` value and then examines all the | |
| currently installed providers until it finds one that implements a | |
| keystores of that type. It then uses the keystore implementation from that | |
| provider.The `KeyStore` class defines a static method named | |
| `getDefaultType` that lets applications retrieve the value of the | |
| `keystore.type` property. The following line of code creates an instance of | |
| the default keystore type as specified in the `keystore.type` property: | |
| > `KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());` | |
| The default keystore type is `pkcs12`, which is a cross-platform keystore | |
| based on the RSA PKCS12 Personal Information Exchange Syntax Standard. This | |
| is specified by the following line in the security properties file: | |
| > `keystore.type=pkcs12` | |
| To have the tools utilize a keystore implementation other than the default, | |
| you can change that line to specify a different keystore type. For example, | |
| if you want to use the Oracle's `jks` keystore implementation, then change | |
| the line to the following: | |
| > `keystore.type=jks` | |
| **Note:** | |
| Case doesn't matter in keystore type designations. For example, `JKS` would | |
| be considered the same as `jks`. | |
| Certificate | |
| : A certificate (or public-key certificate) is a digitally signed statement | |
| from one entity (the issuer), saying that the public key and some other | |
| information of another entity (the subject) has some specific value. The | |
| following terms are related to certificates: | |
| - Public Keys: These are numbers associated with a particular entity, and | |
| are intended to be known to everyone who needs to have trusted | |
| interactions with that entity. Public keys are used to verify | |
| signatures. | |
| - Digitally Signed: If some data is digitally signed, then it is stored | |
| with the identity of an entity and a signature that proves that entity | |
| knows about the data. The data is rendered unforgeable by signing with | |
| the entity's private key. | |
| - Identity: A known way of addressing an entity. In some systems, the | |
| identity is the public key, and in others it can be anything from an | |
| Oracle Solaris UID to an email address to an X.509 distinguished name. | |
| - Signature: A signature is computed over some data using the private key | |
| of an entity. The signer, which in the case of a certificate is also | |
| known as the issuer. | |
| - Private Keys: These are numbers, each of which is supposed to be known | |
| only to the particular entity whose private key it is (that is, it is | |
| supposed to be kept secret). Private and public keys exist in pairs in | |
| all public key cryptography systems (also referred to as public key | |
| crypto systems). In a typical public key crypto system, such as DSA, a | |
| private key corresponds to exactly one public key. Private keys are | |
| used to compute signatures. | |
| - Entity: An entity is a person, organization, program, computer, | |
| business, bank, or something else you are trusting to some degree. | |
| Public key cryptography requires access to users' public keys. In a | |
| large-scale networked environment, it is impossible to guarantee that prior | |
| relationships between communicating entities were established or that a | |
| trusted repository exists with all used public keys. Certificates were | |
| invented as a solution to this public key distribution problem. Now a | |
| Certification Authority (CA) can act as a trusted third party. CAs are | |
| entities such as businesses that are trusted to sign (issue) certificates | |
| for other entities. It is assumed that CAs only create valid and reliable | |
| certificates because they are bound by legal agreements. There are many | |
| public Certification Authorities, such as DigiCert, Comodo, Entrust, and so | |
| on. | |
| You can also run your own Certification Authority using products such as | |
| Microsoft Certificate Server or the Entrust CA product for your | |
| organization. With the `keytool` command, it is possible to display, | |
| import, and export certificates. It is also possible to generate | |
| self-signed certificates. | |
| The `keytool` command currently handles X.509 certificates. | |
| X.509 Certificates | |
| : The X.509 standard defines what information can go into a certificate and | |
| describes how to write it down (the data format). All the data in a | |
| certificate is encoded with two related standards called ASN.1/DER. | |
| Abstract Syntax Notation 1 describes data. The Definite Encoding Rules | |
| describe a single way to store and transfer that data. | |
| All X.509 certificates have the following data, in addition to the | |
| signature: | |
| - Version: This identifies which version of the X.509 standard applies to | |
| this certificate, which affects what information can be specified in | |
| it. Thus far, three versions are defined. The `keytool` command can | |
| import and export v1, v2, and v3 certificates. It generates v3 | |
| certificates. | |
| - X.509 Version 1 has been available since 1988, is widely deployed, | |
| and is the most generic. | |
| - X.509 Version 2 introduced the concept of subject and issuer unique | |
| identifiers to handle the possibility of reuse of subject or issuer | |
| names over time. Most certificate profile documents strongly | |
| recommend that names not be reused and that certificates shouldn't | |
| make use of unique identifiers. Version 2 certificates aren't | |
| widely used. | |
| - X.509 Version 3 is the most recent (1996) and supports the notion | |
| of extensions where anyone can define an extension and include it | |
| in the certificate. Some common extensions are: KeyUsage (limits | |
| the use of the keys to particular purposes such as `signing-only`) | |
| and AlternativeNames (allows other identities to also be associated | |
| with this public key, for example. DNS names, email addresses, IP | |
| addresses). Extensions can be marked critical to indicate that the | |
| extension should be checked and enforced or used. For example, if a | |
| certificate has the KeyUsage extension marked critical and set to | |
| `keyCertSign`, then when this certificate is presented during SSL | |
| communication, it should be rejected because the certificate | |
| extension indicates that the associated private key should only be | |
| used for signing certificates and not for SSL use. | |
| - Serial number: The entity that created the certificate is responsible | |
| for assigning it a serial number to distinguish it from other | |
| certificates it issues. This information is used in numerous ways. For | |
| example, when a certificate is revoked its serial number is placed in a | |
| Certificate Revocation List (CRL). | |
| - Signature algorithm identifier: This identifies the algorithm used by | |
| the CA to sign the certificate. | |
| - Issuer name: The X.500 Distinguished Name of the entity that signed the | |
| certificate. This is typically a CA. Using this certificate implies | |
| trusting the entity that signed this certificate. In some cases, such | |
| as root or top-level CA certificates, the issuer signs its own | |
| certificate. | |
| - Validity period: Each certificate is valid only for a limited amount of | |
| time. This period is described by a start date and time and an end date | |
| and time, and can be as short as a few seconds or almost as long as a | |
| century. The validity period chosen depends on a number of factors, | |
| such as the strength of the private key used to sign the certificate, | |
| or the amount one is willing to pay for a certificate. This is the | |
| expected period that entities can rely on the public value, when the | |
| associated private key has not been compromised. | |
| - Subject name: The name of the entity whose public key the certificate | |
| identifies. This name uses the X.500 standard, so it is intended to be | |
| unique across the Internet. This is the X.500 Distinguished Name (DN) | |
| of the entity. For example, | |
| > `CN=Java Duke, OU=Java Software Division, O=Oracle Corporation, | |
| C=US` | |
| These refer to the subject's common name (CN), organizational unit | |
| (OU), organization (O), and country (C). | |
| - Subject public key information: This is the public key of the entity | |
| being named with an algorithm identifier that specifies which public | |
| key crypto system this key belongs to and any associated key | |
| parameters. | |
| Certificate Chains | |
| : The `keytool` command can create and manage keystore key entries that each | |
| contain a private key and an associated certificate chain. The first | |
| certificate in the chain contains the public key that corresponds to the | |
| private key. | |
| When keys are first generated, the chain usually starts off containing a single | |
| element, a self-signed certificate. See -genkeypair in **Commands**. A | |
| self-signed certificate is one for which the issuer (signer) is the same as | |
| the subject. The subject is the entity whose public key is being | |
| authenticated by the certificate. When the `-genkeypair` command is called | |
| to generate a new public/private key pair, it also wraps the public key | |
| into a self-signed certificate (unless the `-signer` option is specified). | |
| Later, after a Certificate Signing Request (CSR) was generated with the | |
| `-certreq` command and sent to a Certification Authority (CA), the response | |
| from the CA is imported with `-importcert`, and the self-signed certificate | |
| is replaced by a chain of certificates. At the bottom of the chain is the | |
| certificate (reply) issued by the CA authenticating the subject's public | |
| key. The next certificate in the chain is one that authenticates the CA's | |
| public key. | |
| In many cases, this is a self-signed certificate, which is a certificate | |
| from the CA authenticating its own public key, and the last certificate in | |
| the chain. In other cases, the CA might return a chain of certificates. In | |
| this case, the bottom certificate in the chain is the same (a certificate | |
| signed by the CA, authenticating the public key of the key entry), but the | |
| second certificate in the chain is a certificate signed by a different CA | |
| that authenticates the public key of the CA you sent the CSR to. The next | |
| certificate in the chain is a certificate that authenticates the second | |
| CA's key, and so on, until a self-signed root certificate is reached. Each | |
| certificate in the chain (after the first) authenticates the public key of | |
| the signer of the previous certificate in the chain. | |
| Many CAs only return the issued certificate, with no supporting chain, | |
| especially when there is a flat hierarchy (no intermediates CAs). In this | |
| case, the certificate chain must be established from trusted certificate | |
| information already stored in the keystore. | |
| A different reply format (defined by the PKCS \#7 standard) includes the | |
| supporting certificate chain in addition to the issued certificate. Both | |
| reply formats can be handled by the `keytool` command. | |
| The top-level (root) CA certificate is self-signed. However, the trust into | |
| the root's public key doesn't come from the root certificate itself, but | |
| from other sources such as a newspaper. This is because anybody could | |
| generate a self-signed certificate with the distinguished name of, for | |
| example, the DigiCert root CA. The root CA public key is widely known. The | |
| only reason it is stored in a certificate is because this is the format | |
| understood by most tools, so the certificate in this case is only used as a | |
| vehicle to transport the root CA's public key. Before you add the root CA | |
| certificate to your keystore, you should view it with the `-printcert` | |
| option and compare the displayed fingerprint with the well-known | |
| fingerprint obtained from a newspaper, the root CA's Web page, and so on. | |
| cacerts Certificates File | |
| : A certificates file named `cacerts` resides in the security properties | |
| directory: | |
| - **Linux and macOS:** *JAVA\_HOME*`/lib/security` | |
| - **Windows:** *JAVA\_HOME*`\lib\security` | |
| The `cacerts` file represents a system-wide keystore with CA certificates. | |
| System administrators can configure and manage that file with the `keytool` | |
| command by specifying `jks` as the keystore type. The `cacerts` keystore | |
| file ships with a default set of root CA certificates. For Linux, macOS, and | |
| Windows, you can list the default certificates with the following command: | |
| > `keytool -list -cacerts` | |
| The initial password of the `cacerts` keystore file is `changeit`. System | |
| administrators should change that password and the default access | |
| permission of that file upon installing the SDK. | |
| **Note:** | |
| It is important to verify your `cacerts` file. Because you trust the CAs in | |
| the `cacerts` file as entities for signing and issuing certificates to | |
| other entities, you must manage the `cacerts` file carefully. The `cacerts` | |
| file should contain only certificates of the CAs you trust. It is your | |
| responsibility to verify the trusted root CA certificates bundled in the | |
| `cacerts` file and make your own trust decisions. | |
| To remove an untrusted CA certificate from the `cacerts` file, use the | |
| `-delete` option of the `keytool` command. You can find the `cacerts` file | |
| in the JDK's `$JAVA_HOME/lib/security` directory. Contact your system | |
| administrator if you don't have permission to edit this file. | |
| Internet RFC 1421 Certificate Encoding Standard | |
| : Certificates are often stored using the printable encoding format defined | |
| by the Internet RFC 1421 standard, instead of their binary encoding. This | |
| certificate format, also known as Base64 encoding, makes it easy to export | |
| certificates to other applications by email or through some other | |
| mechanism. | |
| Certificates read by the `-importcert` and `-printcert` commands can be in | |
| either this format or binary encoded. The `-exportcert` command by default | |
| outputs a certificate in binary encoding, but will instead output a | |
| certificate in the printable encoding format, when the `-rfc` option is | |
| specified. | |
| The `-list` command by default prints the SHA-256 fingerprint of a | |
| certificate. If the `-v` option is specified, then the certificate is | |
| printed in human-readable format. If the `-rfc` option is specified, then | |
| the certificate is output in the printable encoding format. | |
| In its printable encoding format, the encoded certificate is bounded at the | |
| beginning and end by the following text: | |
| ``` | |
| -----BEGIN CERTIFICATE----- | |
| encoded certificate goes here. | |
| -----END CERTIFICATE----- | |
| ``` | |
| X.500 Distinguished Names | |
| : X.500 Distinguished Names are used to identify entities, such as those that | |
| are named by the `subject` and `issuer` (signer) fields of X.509 | |
| certificates. The `keytool` command supports the following subparts: | |
| - commonName: The common name of a person such as Susan Jones. | |
| - organizationUnit: The small organization (such as department or | |
| division) name. For example, Purchasing. | |
| - localityName: The locality (city) name, for example, Palo Alto. | |
| - stateName: State or province name, for example, California. | |
| - country: Two-letter country code, for example, CH. | |
| When you supply a distinguished name string as the value of a `-dname` | |
| option, such as for the `-genkeypair` command, the string must be in the | |
| following format: | |
| > `CN=cName, OU=orgUnit, O=org, L=city, S=state, C=countryCode` | |
| All the following items represent actual values and the previous keywords | |
| are abbreviations for the following: | |
| ``` | |
| CN=commonName | |
| OU=organizationUnit | |
| O=organizationName | |
| L=localityName | |
| S=stateName | |
| C=country | |
| ``` | |
| A sample distinguished name string is: | |
| > `CN=Mark Smith, OU=Java, O=Oracle, L=Cupertino, S=California, C=US` | |
| A sample command using such a string is: | |
| > `keytool -genkeypair -dname "CN=Mark Smith, OU=Java, O=Oracle, | |
| L=Cupertino, S=California, C=US" -alias mark -keyalg rsa` | |
| Case doesn't matter for the keyword abbreviations. For example, CN, cn, and | |
| Cn are all treated the same. | |
| Order matters; each subcomponent must appear in the designated order. | |
| However, it isn't necessary to have all the subcomponents. You can use a | |
| subset, for example: | |
| > `CN=Smith, OU=Java, O=Oracle, C=US` | |
| If a distinguished name string value contains a comma, then the comma must | |
| be escaped by a backslash (\\) character when you specify the string on a | |
| command line, as in: | |
| > `cn=Jack, ou=Java\, Product Development, o=Oracle, c=US` | |
| It is never necessary to specify a distinguished name string on a command | |
| line. When the distinguished name is needed for a command, but not supplied | |
| on the command line, the user is prompted for each of the subcomponents. In | |
| this case, a comma doesn't need to be escaped by a backslash (\\). | |
| ## Warnings | |
| ## Importing Trusted Certificates Warning | |
| **Important**: Be sure to check a certificate very carefully before importing | |
| it as a trusted certificate. | |
| **Windows Example:** | |
| View the certificate first with the `-printcert` command or the `-importcert` | |
| command without the `-noprompt` option. Ensure that the displayed certificate | |
| fingerprints match the expected ones. For example, suppose someone sends or | |
| emails you a certificate that you put it in a file named `\tmp\cert`. Before | |
| you consider adding the certificate to your list of trusted certificates, you | |
| can execute a `-printcert` command to view its fingerprints, as follows: | |
| ``` | |
| keytool -printcert -file \tmp\cert | |
| Owner: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll | |
| Issuer: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll | |
| Serial Number: 59092b34 | |
| Valid from: Thu Jun 24 18:01:13 PDT 2016 until: Wed Jun 23 17:01:13 PST 2016 | |
| Certificate Fingerprints: | |
| SHA-1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE | |
| SHA-256: 90:7B:70:0A:EA:DC:16:79:92:99:41:FF:8A:FE:EB:90: | |
| 17:75:E0:90:B2:24:4D:3A:2A:16:A6:E4:11:0F:67:A4 | |
| ``` | |
| **Linux Example:** | |
| View the certificate first with the `-printcert` command or the `-importcert` | |
| command without the `-noprompt` option. Ensure that the displayed certificate | |
| fingerprints match the expected ones. For example, suppose someone sends or | |
| emails you a certificate that you put it in a file named `/tmp/cert`. Before | |
| you consider adding the certificate to your list of trusted certificates, you | |
| can execute a `-printcert` command to view its fingerprints, as follows: | |
| ``` | |
| keytool -printcert -file /tmp/cert | |
| Owner: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll | |
| Issuer: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll | |
| Serial Number: 59092b34 | |
| Valid from: Thu Jun 24 18:01:13 PDT 2016 until: Wed Jun 23 17:01:13 PST 2016 | |
| Certificate Fingerprints: | |
| SHA-1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE | |
| SHA-256: 90:7B:70:0A:EA:DC:16:79:92:99:41:FF:8A:FE:EB:90: | |
| 17:75:E0:90:B2:24:4D:3A:2A:16:A6:E4:11:0F:67:A4 | |
| ``` | |
| Then call or otherwise contact the person who sent the certificate and compare | |
| the fingerprints that you see with the ones that they show. Only when the | |
| fingerprints are equal is it guaranteed that the certificate wasn't replaced in | |
| transit with somebody else's certificate such as an attacker's certificate. If | |
| such an attack took place, and you didn't check the certificate before you | |
| imported it, then you would be trusting anything the attacker signed, for | |
| example, a JAR file with malicious class files inside. | |
| **Note:** | |
| It isn't required that you execute a `-printcert` command before importing a | |
| certificate. This is because before you add a certificate to the list of | |
| trusted certificates in the keystore, the `-importcert` command prints out the | |
| certificate information and prompts you to verify it. You can then stop the | |
| import operation. However, you can do this only when you call the `-importcert` | |
| command without the `-noprompt` option. If the `-noprompt` option is specified, | |
| then there is no interaction with the user. | |
| ## Passwords Warning | |
| Most commands that operate on a keystore require the store password. Some | |
| commands require a private/secret key password. Passwords can be specified on | |
| the command line in the `-storepass` and `-keypass` options. However, a | |
| password shouldn't be specified on a command line or in a script unless it is | |
| for testing, or you are on a secure system. When you don't specify a required | |
| password option on a command line, you are prompted for it. | |
| ## Certificate Conformance Warning | |
| [Internet X.509 Public Key Infrastructure Certificate and Certificate | |
| Revocation List (CRL) Profile](https://tools.ietf.org/rfc/rfc5280.txt) defined | |
| a profile on conforming X.509 certificates, which includes what values and | |
| value combinations are valid for certificate fields and extensions. | |
| The `keytool` command doesn't enforce all of these rules so it can generate | |
| certificates that don't conform to the standard, such as self-signed | |
| certificates that would be used for internal testing purposes. Certificates | |
| that don't conform to the standard might be rejected by the JDK or other | |
| applications. Users should ensure that they provide the correct options for | |
| `-dname`, `-ext`, and so on. | |
| ## Import a New Trusted Certificate | |
| Before you add the certificate to the keystore, the `keytool` command verifies | |
| it by attempting to construct a chain of trust from that certificate to a | |
| self-signed certificate (belonging to a root CA), using trusted certificates | |
| that are already available in the keystore. | |
| If the `-trustcacerts` option was specified, then additional certificates are | |
| considered for the chain of trust, namely the certificates in a file named | |
| `cacerts`. | |
| If the `keytool` command fails to establish a trust path from the certificate | |
| to be imported up to a self-signed certificate (either from the keystore or the | |
| `cacerts` file), then the certificate information is printed, and the user is | |
| prompted to verify it by comparing the displayed certificate fingerprints with | |
| the fingerprints obtained from some other (trusted) source of information, | |
| which might be the certificate owner. Be very careful to ensure the certificate | |
| is valid before importing it as a trusted certificate. The user then has the | |
| option of stopping the import operation. If the `-noprompt` option is | |
| specified, then there is no interaction with the user. | |
| ## Import a Certificate Reply | |
| When you import a certificate reply, the certificate reply is validated with | |
| trusted certificates from the keystore, and optionally, the certificates | |
| configured in the `cacerts` keystore file when the `-trustcacerts` option is | |
| specified. | |
| The methods of determining whether the certificate reply is trusted are as | |
| follows: | |
| - If the reply is a single X.509 certificate, then the `keytool` command | |
| attempts to establish a trust chain, starting at the certificate reply and | |
| ending at a self-signed certificate (belonging to a root CA). The | |
| certificate reply and the hierarchy of certificates is used to authenticate | |
| the certificate reply from the new certificate chain of aliases. If a trust | |
| chain can't be established, then the certificate reply isn't imported. In | |
| this case, the `keytool` command doesn't print the certificate and prompt | |
| the user to verify it, because it is very difficult for a user to determine | |
| the authenticity of the certificate reply. | |
| - If the reply is a PKCS \#7 formatted certificate chain or a sequence of | |
| X.509 certificates, then the chain is ordered with the user certificate | |
| first followed by zero or more CA certificates. If the chain ends with a | |
| self-signed root CA certificate and the`-trustcacerts` option was | |
| specified, the `keytool` command attempts to match it with any of the | |
| trusted certificates in the keystore or the `cacerts` keystore file. If the | |
| chain doesn't end with a self-signed root CA certificate and the | |
| `-trustcacerts` option was specified, the `keytool` command tries to find | |
| one from the trusted certificates in the keystore or the `cacerts` keystore | |
| file and add it to the end of the chain. If the certificate isn't found and | |
| the `-noprompt` option isn't specified, the information of the last | |
| certificate in the chain is printed, and the user is prompted to verify it. | |
| If the public key in the certificate reply matches the user's public key | |
| already stored with `alias`, then the old certificate chain is replaced with | |
| the new certificate chain in the reply. The old chain can only be replaced with | |
| a valid `keypass`, and so the password used to protect the private key of the | |
| entry is supplied. If no password is provided, and the private key password is | |
| different from the keystore password, the user is prompted for it. | |
| This command was named `-import` in earlier releases. This old name is still | |
| supported in this release. The new name, `-importcert`, is preferred. |