1=pod 2{- OpenSSL::safe::output_do_not_edit_headers(); -} 3 4=head1 NAME 5 6openssl-pkcs8 - PKCS#8 format private key conversion command 7 8=head1 SYNOPSIS 9 10B<openssl> B<pkcs8> 11[B<-help>] 12[B<-topk8>] 13[B<-inform> B<DER>|B<PEM>] 14[B<-outform> B<DER>|B<PEM>] 15[B<-in> I<filename>] 16[B<-passin> I<arg>] 17[B<-out> I<filename>] 18[B<-passout> I<arg>] 19[B<-iter> I<count>] 20[B<-noiter>] 21[B<-nocrypt>] 22[B<-traditional>] 23[B<-v2> I<alg>] 24[B<-v2prf> I<alg>] 25[B<-v1> I<alg>] 26[B<-scrypt>] 27[B<-scrypt_N> I<N>] 28[B<-scrypt_r> I<r>] 29[B<-scrypt_p> I<p>] 30[B<-saltlen> I<size>] 31{- $OpenSSL::safe::opt_r_synopsis -} 32{- $OpenSSL::safe::opt_engine_synopsis -}{- $OpenSSL::safe::opt_provider_synopsis -} 33 34=head1 DESCRIPTION 35 36This command processes private keys in PKCS#8 format. It can handle 37both unencrypted PKCS#8 PrivateKeyInfo format and EncryptedPrivateKeyInfo 38format with a variety of PKCS#5 (v1.5 and v2.0) and PKCS#12 algorithms. 39 40=head1 OPTIONS 41 42=over 4 43 44=item B<-help> 45 46Print out a usage message. 47 48=item B<-topk8> 49 50Normally a PKCS#8 private key is expected on input and a private key will be 51written to the output file. With the B<-topk8> option the situation is 52reversed: it reads a private key and writes a PKCS#8 format key. 53 54=item B<-inform> B<DER>|B<PEM>, B<-outform> B<DER>|B<PEM> 55 56The input and formats; the default is B<PEM>. 57See L<openssl-format-options(1)> for details. 58 59If a key is being converted from PKCS#8 form (i.e. the B<-topk8> option is 60not used) then the input file must be in PKCS#8 format. An encrypted 61key is expected unless B<-nocrypt> is included. 62 63If B<-topk8> is not used and B<PEM> mode is set the output file will be an 64unencrypted private key in PKCS#8 format. If the B<-traditional> option is 65used then a traditional format private key is written instead. 66 67If B<-topk8> is not used and B<DER> mode is set the output file will be an 68unencrypted private key in traditional DER format. 69 70If B<-topk8> is used then any supported private key can be used for the input 71file in a format specified by B<-inform>. The output file will be encrypted 72PKCS#8 format using the specified encryption parameters unless B<-nocrypt> 73is included. 74 75=item B<-traditional> 76 77When this option is present and B<-topk8> is not a traditional format private 78key is written. 79 80=item B<-in> I<filename> 81 82This specifies the input file to read a key from or standard input if this 83option is not specified. If the key is encrypted a pass phrase will be 84prompted for unless B<-passin> is given. 85 86=item B<-passin> I<arg>, B<-passout> I<arg> 87 88The password source for the input and output file. 89For more information about the format of B<arg> 90see L<openssl-passphrase-options(1)>. 91 92=item B<-out> I<filename> 93 94This specifies the output file to write a key to or standard output by default. 95The output filename can be the same as the input filename, 96which leads to replacing the file contents. 97Note that file I/O is not atomic. The output file is truncated and then written. 98 99If any encryption options are set and B<-passout> is not given 100then a pass phrase will be prompted for. 101When password input is interrupted, the output file is not touched. 102 103=item B<-iter> I<count> 104 105When creating new PKCS#8 containers, use a given number of iterations on 106the password in deriving the encryption key for the PKCS#8 output. 107High values increase the time required to brute-force a PKCS#8 container. 108 109=item B<-noiter> 110 111When creating new PKCS#8 containers, use 1 as iteration count. 112 113=item B<-nocrypt> 114 115PKCS#8 keys generated or input are normally PKCS#8 EncryptedPrivateKeyInfo 116structures using an appropriate password based encryption algorithm. With 117this option an unencrypted PrivateKeyInfo structure is expected or output. 118This option does not encrypt private keys at all and should only be used 119when absolutely necessary. Certain software such as some versions of Java 120code signing software used unencrypted private keys. 121 122=item B<-v2> I<alg> 123 124This option sets the PKCS#5 v2.0 algorithm. 125 126The I<alg> argument is the encryption algorithm to use, valid values include 127B<aes128>, B<aes256> and B<des3>. If this option isn't specified then B<aes256> 128is used. 129 130=item B<-v2prf> I<alg> 131 132This option sets the PRF algorithm to use with PKCS#5 v2.0. A typical value 133value would be B<hmacWithSHA256>. If this option isn't set then the default 134for the cipher is used or B<hmacWithSHA256> if there is no default. 135 136Some implementations may not support custom PRF algorithms and may require 137the B<hmacWithSHA1> option to work. 138 139=item B<-v1> I<alg> 140 141This option indicates a PKCS#5 v1.5 or PKCS#12 algorithm should be used. Some 142older implementations may not support PKCS#5 v2.0 and may require this option. 143If not specified PKCS#5 v2.0 form is used. 144 145=item B<-scrypt> 146 147Uses the B<scrypt> algorithm for private key encryption using default 148parameters: currently N=16384, r=8 and p=1 and AES in CBC mode with a 256 bit 149key. These parameters can be modified using the B<-scrypt_N>, B<-scrypt_r>, 150B<-scrypt_p> and B<-v2> options. 151 152=item B<-scrypt_N> I<N>, B<-scrypt_r> I<r>, B<-scrypt_p> I<p> 153 154Sets the scrypt I<N>, I<r> or I<p> parameters. 155 156=item B<-saltlen> 157 158Sets the length (in bytes) of the salt to use for the PBE algorithm. 159If this value is not specified, the default for PBES2 is 16 (128 bits) 160and 8 (64 bits) for PBES1. 161 162{- $OpenSSL::safe::opt_r_item -} 163 164{- $OpenSSL::safe::opt_engine_item -} 165 166{- $OpenSSL::safe::opt_provider_item -} 167 168=back 169 170=head1 NOTES 171 172By default, when converting a key to PKCS#8 format, PKCS#5 v2.0 using 256 bit 173AES with HMAC and SHA256 is used. 174 175Some older implementations do not support PKCS#5 v2.0 format and require 176the older PKCS#5 v1.5 form instead, possibly also requiring insecure weak 177encryption algorithms such as 56 bit DES. 178 179Private keys encrypted using PKCS#5 v2.0 algorithms and high iteration 180counts are more secure that those encrypted using the traditional 181SSLeay compatible formats. So if additional security is considered 182important the keys should be converted. 183 184It is possible to write out DER encoded encrypted private keys in 185PKCS#8 format because the encryption details are included at an ASN1 186level whereas the traditional format includes them at a PEM level. 187 188=head1 PKCS#5 V1.5 AND PKCS#12 ALGORITHMS 189 190Various algorithms can be used with the B<-v1> command line option, 191including PKCS#5 v1.5 and PKCS#12. These are described in more detail 192below. 193 194=over 4 195 196=item B<PBE-MD2-DES PBE-MD5-DES> 197 198These algorithms were included in the original PKCS#5 v1.5 specification. 199They only offer 56 bits of protection since they both use DES. 200 201=item B<PBE-SHA1-RC2-64>, B<PBE-MD2-RC2-64>, B<PBE-MD5-RC2-64>, B<PBE-SHA1-DES> 202 203These algorithms are not mentioned in the original PKCS#5 v1.5 specification 204but they use the same key derivation algorithm and are supported by some 205software. They are mentioned in PKCS#5 v2.0. They use either 64 bit RC2 or 20656 bit DES. 207 208=item B<PBE-SHA1-RC4-128>, B<PBE-SHA1-RC4-40>, B<PBE-SHA1-3DES>, B<PBE-SHA1-2DES>, B<PBE-SHA1-RC2-128>, B<PBE-SHA1-RC2-40> 209 210These algorithms use the PKCS#12 password based encryption algorithm and 211allow strong encryption algorithms like triple DES or 128 bit RC2 to be used. 212 213=back 214 215=head1 EXAMPLES 216 217Convert a private key to PKCS#8 format using default parameters (AES with 218256 bit key and B<hmacWithSHA256>): 219 220 openssl pkcs8 -in key.pem -topk8 -out enckey.pem 221 222Convert a private key to PKCS#8 unencrypted format: 223 224 openssl pkcs8 -in key.pem -topk8 -nocrypt -out enckey.pem 225 226Convert a private key to PKCS#5 v2.0 format using triple DES: 227 228 openssl pkcs8 -in key.pem -topk8 -v2 des3 -out enckey.pem 229 230Convert a private key to PKCS#5 v2.0 format using AES with 256 bits in CBC 231mode and B<hmacWithSHA512> PRF: 232 233 openssl pkcs8 -in key.pem -topk8 -v2 aes-256-cbc -v2prf hmacWithSHA512 -out enckey.pem 234 235Convert a private key to PKCS#8 using a PKCS#5 1.5 compatible algorithm 236(DES): 237 238 openssl pkcs8 -in key.pem -topk8 -v1 PBE-MD5-DES -out enckey.pem 239 240Convert a private key to PKCS#8 using a PKCS#12 compatible algorithm 241(3DES): 242 243 openssl pkcs8 -in key.pem -topk8 -out enckey.pem -v1 PBE-SHA1-3DES 244 245Read a DER unencrypted PKCS#8 format private key: 246 247 openssl pkcs8 -inform DER -nocrypt -in key.der -out key.pem 248 249Convert a private key from any PKCS#8 encrypted format to traditional format: 250 251 openssl pkcs8 -in pk8.pem -traditional -out key.pem 252 253Convert a private key to PKCS#8 format, encrypting with AES-256 and with 254one million iterations of the password: 255 256 openssl pkcs8 -in key.pem -topk8 -v2 aes-256-cbc -iter 1000000 -out pk8.pem 257 258=head1 STANDARDS 259 260Test vectors from this PKCS#5 v2.0 implementation were posted to the 261pkcs-tng mailing list using triple DES, DES and RC2 with high iteration 262counts, several people confirmed that they could decrypt the private 263keys produced and therefore, it can be assumed that the PKCS#5 v2.0 264implementation is reasonably accurate at least as far as these 265algorithms are concerned. 266 267The format of PKCS#8 DSA (and other) private keys is not well documented: 268it is hidden away in PKCS#11 v2.01, section 11.9. OpenSSL's default DSA 269PKCS#8 private key format complies with this standard. 270 271=head1 BUGS 272 273There should be an option that prints out the encryption algorithm 274in use and other details such as the iteration count. 275 276=head1 SEE ALSO 277 278L<openssl(1)>, 279L<openssl-dsa(1)>, 280L<openssl-rsa(1)>, 281L<openssl-genrsa(1)>, 282L<openssl-gendsa(1)> 283 284=head1 HISTORY 285 286The B<-iter> option was added in OpenSSL 1.1.0. 287 288The B<-engine> option was deprecated in OpenSSL 3.0. 289 290=head1 COPYRIGHT 291 292Copyright 2000-2023 The OpenSSL Project Authors. All Rights Reserved. 293 294Licensed under the Apache License 2.0 (the "License"). You may not use 295this file except in compliance with the License. You can obtain a copy 296in the file LICENSE in the source distribution or at 297L<https://www.openssl.org/source/license.html>. 298 299=cut 300