mirror of
https://github.com/openssl/openssl.git
synced 2026-01-25 02:56:43 +00:00
Updated with new information since des3 and dsa are not recommended algorithms. Reviewed-by: Paul Dale <ppzgs1@gmail.com> Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Matt Caswell <matt@openssl.org> (Merged from https://github.com/openssl/openssl/pull/27343)
107 lines
3.6 KiB
Plaintext
107 lines
3.6 KiB
Plaintext
<DRAFT!>
|
|
HOWTO keys
|
|
|
|
1. Introduction
|
|
|
|
Keys are the basis of public key algorithms and PKI. Keys usually
|
|
come in pairs, with one half being the public key and the other half
|
|
being the private key. With OpenSSL, the private key contains the
|
|
public key information as well, so a public key doesn't need to be
|
|
generated separately.
|
|
|
|
Public keys come in several flavors, using different cryptographic
|
|
algorithms. The most popular ones associated with certificates are
|
|
RSA and ECDSA, and this HOWTO will show how to generate each of them.
|
|
|
|
2. To generate an RSA key
|
|
|
|
An RSA key can be used both for encryption and for signing.
|
|
|
|
Generating a key for the RSA algorithm is quite easy, all you have to
|
|
do is the following:
|
|
|
|
openssl genrsa -aes256 -out privkey.pem 2048
|
|
|
|
With this variant, you will be prompted for a protecting password. If
|
|
you don't want your key to be protected by a password, remove the flag
|
|
'-aes256' from the command line above.
|
|
|
|
The number 2048 is the size of the key, in bits. Today, 2048 or
|
|
higher is recommended for RSA keys, as fewer amount of bits is
|
|
considered to be insecure.
|
|
|
|
3. To generate an EC key
|
|
|
|
An EC key can be used for either key agreement (ECDH), signing (ECDSA) or
|
|
key encapsulation (KEM) purposes.
|
|
(A key should only be used for one of these purposes)
|
|
|
|
An EC key can be generated by specifying a curve name such as P-256 using:
|
|
|
|
openssl genpkey -algorithm EC -pkeyopt group:P-256 -aes256 -out private.key
|
|
|
|
With this variant, you will be prompted for a password to protect your key.
|
|
If you don't want your key to be protected by a password, remove the flag
|
|
'-aes256' from the command line above.
|
|
|
|
Each curve name is associated with a group of fixed parameters.
|
|
Curve names containing numbers lower than 256 are no longer considered
|
|
secure.
|
|
|
|
The NIST P-256 curve name (which is an alias for prime256v1), stands for
|
|
'X9.62/SECG curve over a 256-bit prime field'.
|
|
|
|
4. To generate a X25519 or X448 Key for Key Agreement
|
|
|
|
X25519, X448, Ed25519 and Ed448 are treated as distinct algorithms and not as
|
|
one of the EC curves listed with 'ecparam -list_curves' option.
|
|
Unlike other algorithms there are separate key types for signing and
|
|
key agreement.
|
|
|
|
You can use the following command to generate an X25519 key:
|
|
|
|
openssl genpkey -algorithm X25519 -out xkey.pem
|
|
|
|
5. To generate a Ed25519 or Ed448 Key
|
|
|
|
An Ed25519 or Ed448 key can be used for signing and verification purposes.
|
|
|
|
You can use the following command to generate an Ed25519 key:
|
|
openssl genpkey -algorithm Ed25519 -out xkey.pem
|
|
|
|
6. To generate an ML-DSA key
|
|
|
|
An ML-DSA key can be used for signing (and verification via the public key)
|
|
only.
|
|
|
|
Generating a key for the ML-DSA algorithm is a one-step process.
|
|
|
|
openssl genpkey -algorithm ML-DSA-44 -out key.pem
|
|
openssl genpkey -algorithm ML-DSA-65 -out key.pem
|
|
openssl genpkey -algorithm ML-DSA-87 -out key.pem
|
|
|
|
See L<EVP_PKEY-ML-DSA(7)> for more detail.
|
|
|
|
7. To generate an ML-KEM key
|
|
|
|
An ML-KEM key can be used for decapsulation (and encapsulation via the public
|
|
key) only.
|
|
|
|
Generating a key for the ML-KEM algorithm is a one-step process.
|
|
|
|
openssl genpkey -algorithm ML-KEM-512 -out key.pem
|
|
openssl genpkey -algorithm ML-KEM-768 -out key.pem
|
|
openssl genpkey -algorithm ML-KEM-1024 -out key.pem
|
|
|
|
See L<EVP_PKEY-ML-KEM(7)> for more detail.
|
|
|
|
8. NOTE
|
|
|
|
If you intend to use the key together with a server certificate,
|
|
it may be reasonable to avoid protecting it with a password, since
|
|
otherwise someone would have to type in the password every time the
|
|
server needs to access the key.
|
|
|
|
To generate keys using C code refer to the demos located in
|
|
https://github.com/openssl/openssl/blob/master/demos/pkey.
|