====== Ubuntu - Certificates - Convert keys between openssl and openssh ======
===== OpenSSL =====
The following command
openssl req -x509 -days 365 -newkey rsa:2048 -keyout private.pem -out public.pem -nodes
generates a self-signed certificate, and produces private.pem and public.pem.
----
To extract an OpenSSH compatible public key from it, you can just run:
ssh-keygen -f private.pem -y > private.pub
**NOTE**: Newer versions of OpenSSL (>= 1.0.1 at least) use PKCS8 format for keys.
So, to extract the public key from the certificate issue
openssl x509 -in certificate.pem -noout -pubkey > pubkey.pem
You need to use following command to convert it to authorized_keys entry
ssh-keygen -i -m PKCS8 -f pubkey.pem
* **-out** option of the req command of OpenSSL produces certificate request rather than public key.
To extract public key in the PKCS#8 format, understandable by import function of ssh-keygen use following command.
openssl req -in public.pem -noout -pubkey
----
===== OpenSSH =====
The command
ssh-keygen -t rsa -f rsa
produces rsa and rsa.pub
**ssh-keygen** can be used to convert public keys from SSH formats in to PEM formats suitable for OpenSSL. Private keys are normally already stored in a PEM format suitable for both.
The following command will convert the .pub file into the pem format for you.
ssh-keygen -f rsa.pub -e -m pem
Found that -m pem did not give an openssl compatible key but -m PKCS8 did.
Newer versions of OpenSSL (>= 1.0.1 at least) use PKCS#8 format for keys.
The ssh-keygen also supports conversion into various other formats, for more information, see the [[http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-keygen&sektion=1|man page]].
----
===== Convert from OpenSSH to OpenSSL =====
Is it possible to convert from the format of rsa to private.pem and vice-a-versa?
ssh-keygen -f test-user
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in test-user.
Your public key has been saved in test-user.pub.
The key fingerprint is:
ff:36:f1:74:c7:0d:4e:da:79:5c:96:27:2c:2c:4e:b6 john@sharewiz.net
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| . . .|
| + o =.+|
| S+ o * B+|
| .E o = B|
| . + o.|
| .o . |
| ... |
+-----------------+
$ openssl req -x509 -days 365 -new -key test-user -out test-user-cert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
$ ls -l test-user*
-rw------- 1 john john 1675 Mar 18 21:52 test-user
-rw-r--r-- 1 john john 1229 Mar 18 21:53 test-user-cert.pem
-rw-r--r-- 1 john john 392 Mar 18 21:52 test-user.pub
From these, both **test-user** and **test-user-cert.pem** files are critical to preserve, where as **test-user.pub** can always be recreated from **test-user** as needed.