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 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 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.