The openssl
command is available for use by all users.
The intended audience for this page is system administrators
who can submit requests which IST will recognize._
The openssl command is part of the openssl software package,
and allows the user to manipulate components in various ways.
It has a bewildering array of sub-commands and options, but if you learn a certain
subset it will help you to become comfortable with the various components of SSL
as used at the University of Waterloo.
openssl
examples You should be able to go to an empty directory and literally cut-and-paste the following Unix commands to get an idea of SSL key structure.
mkdir private chmod 700 private openssl genrsa -out private/new2048.key 2048
openssl rsa < private/new2048.key -text
openssl rsa -in private/new2048.key -pubout
openssl rsa -in private/new2048.key -pubout -textActually, it seems
-text
applies to the input private key, and you need...
openssl rsa -in private/new2048.key -pubout | openssl rsa -pubin -text
openssl req -new -key private/new2048.key -out new.csr(requires answering questions on standard input)
Or:
openssl req -new -key private/new2048.key -out new.csr \<br> -subj '/C=CA/ST=Ontario/L=Waterloo/O=University of Waterloo/CN=test.cs.uwaterloo.ca/emailAddress=username@domainname'
For username@domainname
you will often use
No permission to view CFPrivate.EMailAddressCscfCerts
openssl req -new -newkey rsa:2048 -nodes -keyout private/new2048.key -out new.csr \<br> -subj '/C=CA/ST=Ontario/L=Waterloo/O=University of Waterloo/CN=test.cs.uwaterloo.ca/emailAddress=username@domainname'Note: noDES does not (now?) seem to work in place of -nodes
openssl req < new.csr -text(You will see the public key in there in a different format).
openssl req -new -out cs-uwaterloo-ca.csr -nodes -key cs-uwaterloo-ca.key -config cs-uwaterloo-ca.cnf
This is easier to correctly extend than the commandline -subj
syntax.
openssl req < new.csr -pubkey -noout
-x509
.
openssl req -new -key private/new2048.key -x509 -out new.pem \<br> -subj '/C=CA/ST=Ontario/L=Waterloo/O=University of Waterloo/CN=test.cs.uwaterloo.ca/emailAddress=username@domainname'
Other options:
-days number
- change lifetime from default of 395 days
cert.pem
for
use in the next examples. (Or quite likely you could find another
x509 certificate to use as an example; the self-signed Certificate
from above works for most demonstrations, although it is a
special case in some respects).
-----BEGIN CERTIFICATE----- MIIDIDCCAggCAglVMA0GCSqGSIb3DQEBBAUAMEsxCzAJBgNVBAYTAkNBMRAwDgYD VQQKDAdXYXRzaWduMRAwDgYDVQQLDAdSb290IENBMRgwFgYDVQQDDA9XYXRzaWdu IFJvb3QgQ0EwHhcNMTEwMjI4MjAzOTQxWhcNMTIwMjI4MjAzOTQxWjBgMQswCQYD VQQGEwJDQTEQMA4GA1UECAwHT250YXJpbzEfMB0GA1UECgwWVW5pdmVyc2l0eSBv ZiBXYXRlcmxvbzEeMBwGA1UEAwwVdGVzdGEuY3MudXdhdGVybG9vLmNhMIIBIjAN BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArbnhpiXVI5AdC2BOQBugODKdl9Oq EJLF7go3IERZa19F5ULhOu5JSJMnQaGm/IJR902DZTMEOeXCgkPalO1S7wwmvOEv WgMFSi3FlcuEYMcAme4kBZLkxIUZzIWLeoRpaxqwvV46mQ6srwV09/txmEazbROr xFfBPzOCntoMhruycbUMKWEc6lSvymun45pLZKphTnrR9BqshqocB8eLDnmzQEwi RUgtsIcSPrCWGLtwOfEDaB6eXSp4FHKeuEqMZq6Wi7YLffNLCUj4p1Qmvp6v2ao4 Ku/PAjIOiiDuy4ByiHTh8+oRTBKMOeo+4X/Vt4XXrPdOzdU6ZNJk2f/CiwIDAQAB MA0GCSqGSIb3DQEBBAUAA4IBAQBz325XpfHxtKV6xEduDkc3fchPx0QLEhryj8tc phTk8qT8eTy6X/RAupifWJCTrHmyaYSYQmZFlepFqV9h38iMwjvgHBtiz3JgmyuV emGjLsGk3ZzhimwX4R46M2cJ7RWba9X/Jbg3eo/YoATpakkYW/S8V0vB6Nes6QNh mxOxa89caoFTsCRbVo3NEb4Mabd8ul4m67OKh9k0Dk73iRbVlx92F/P54JGW8GB0 yrmCdYMHaEUnexGSa6d+n997WJx7t2MnDqH76sIxfljff4QrzL0fXgIMQOkYij0d Lu5lIrMTL6AcItvgx1goGlc0kLnGdj36kO44v8U+vIEUQKIk -----END CERTIFICATE-----
openssl x509 < cert.pem -textThat is the easiest way to check the expiry date, for example.
openssl x509 < cert.pem -pubkey -noout
I have shameless stolen the following from
https://serverfault.com/questions/590870/how-to-view-all-ssl-certificates-in-a-bundle
openssl crl2pkcs7 -nocrl -certfile BUNDLE.pem | openssl pkcs7 -print_certs -text -noout
E.g. to get a characterization of the certificates actually in a multi-certifica te pem file...
root@vpn:/etc/apache2/ssl# openssl crl2pkcs7 -nocrl -certfile vpn.cs.uwaterloo.ca.pem | openssl pkcs7 -print_certs -text -noout | egrep 'Subject:|Issuer:|After' Issuer: C=BE, O=GlobalSign nv-sa, CN=GlobalSign Organization Validation CA - SHA256 - G2 Not After : Feb 17 14:41:02 2020 GMT Subject: C=CA, ST=Ontario, L=Waterloo, O=University of Waterloo, CN=vpn.cs.uwaterloo.ca Issuer: C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA Not After : Feb 20 10:00:00 2024 GMT Subject: C=BE, O=GlobalSign nv-sa, CN=GlobalSign Organization Validation CA - SHA256 - G2 root@vpn:/etc/apache2/ssl#
openssl
will recognize it.
Unfortunately the indicated .der URL no longer works.
bash@ubuntu% lynx -source http://ist.uwaterloo.ca/security/IST-CA/cacert.der | \<br/> base64 | perl -e 'print "-----BEGIN CERTIFICATE-----\n"; while (<>) {print;}<br /> print "-----END CERTIFICATE-----\n" '| \<br /> openssl x509 -text
Using lynx like that is a bad habit of mine. I should really get used to using wget instead.
Furthermore, openssl can work with different formats. As in...
lynx -source http://ist.uwaterloo.ca/security/IST-CA/cacert.der | \<br /> openssl x509 -inform der -text
A note.
lynx -source http://ist.uwaterloo.ca/security/IST-CA/cacert.der | \<br /> base64defaults to 76 character column wrap. But it seems to work in the manner we use it, and gets reformatted by openssl to the standard 64 characters on output.
So arguably we should give base64 the option --wrap=64. If we ever really need to convert a .der certificate that way.
Anyway, I think I have thoroughly demonstrated that PEM is the base64 encoding of the DER encoding with header and footer lines added.
IncludeCertTestOpenssl |
openssl
command has an s_client
sub-command which can
be a simple client for SSL smtp, imap, pop or ftp.
arpepper@cscfpc20:~$ echo quit | openssl s_client -crlf -connect mail.cs.uwaterloo.ca:465
arpepper@cscfpc20:~$ echo quit | openssl s_client -starttls smtp -crlf -connect mail.cs.uwaterloo.ca:25
arpepper@cscfpc20:~$ echo 0 logout | openssl s_client -starttls imap -crlf -connect mail.cs.uwaterloo.ca:imap
arpepper@cscfpc20:~$ echo 0 logout | openssl s_client -crlf -connect mail.cs.uwaterloo.ca:imaps
arpepper@cscfpc20:~$ echo quit | openssl s_client -starttls pop3 -crlf -connect plg2.cs.uwaterloo.ca:110
arpepper@cscfpc20:~$ echo quit | openssl s_client -crlf -connect plg2.cs.uwaterloo.ca:995
I had to hunt around for a pop3
example, because that is being shut down.
The output from the above is lengthy, and includes the main server
certificate.
You can use the openssl command to view its details.
Other options can be given to the above. Most useful might be -showcerts
which will show the entire certificate chain. Also -CAfile <file>
or -CApath <dir>
.
arpepper@cscfpc20:~$ echo 0 logout | openssl s_client -showcerts -CApath /etc/ssl/certs -starttls imap -crlf -connect mail.cs.uwaterloo.ca:imap
-starttls http
is not supported, since there is no such concept. But since https
is a standard SSL
protocol port, the following does work to view the certificate used by https:
arpepper@cscfpc20:~$ cat /dev/null | openssl s_client -crlf -connect cs.uwaterloo.ca:443
Since openssl x509 -text
does ignore information outside the recognized
CERTIFICATE area, the above commands can all be piped directly into it.
arpepper@cscfpc20:~$ echo 0 logout | openssl s_client -starttls imap -crlf -connect mail.cs.uwaterloo.ca:imap | openssl x509 -text
There might be a little untidy stderr
output at the beginning, so...
arpepper@cscfpc20:~$ echo 0 logout | 2>/dev/null openssl s_client -starttls imap -crlf -connect mail.cs.uwaterloo.ca:imap | openssl x509 -text
In general, openssl
is not used for manipulating ssh keys. But openssl
is useful because it will show you in readable form things like the number
of bits in the key.
Therefore (even though arguably the following doesn't belong in a page
about the openssl
command), we give the following which demonstrates
how to take ssh
keys and convert them to something useable by openssl
.
ssh-keygen -f ~/.ssh/id_rsa.pub -e -m pkcs8 ssh-keygen -f ~/.ssh/id_rsa.pub -e -m pkcs8 | openssl rsa -pubin -pubout -text ssh-keygen -f ~/.ssh/id_rsa.pub -e -m pkcs8 | openssl pkey -pubin -pubout -text
Similarly for the deprecated id_dsa
algorithm.
ssh-keygen -f ~/.ssh/id_dsa.pub -e -m pkcs8 ssh-keygen -f ~/.ssh/id_dsa.pub -e -m pkcs8 | openssl dsa -pubin -pubout -text ssh-keygen -f ~/.ssh/id_dsa.pub -e -m pkcs8 | openssl pkey -pubin -pubout -text
Note how pkey
can be used to avoid needing to specify whether you have dsa
or rsa
.
Note that the trending ed25519
keys are not implemented by the openssl
command. Nor are they implemented by the pkcs8
converter.
And, the format recognized by openssl
is called pkcs8/pkcs#8
.
The following will convert a pkcs#8
(in key.pem
) to authorized_keys
format.
ssh-keygen -i -m pkcs8 -f key.pem
And therefore...
ssh-keygen -f ~/.ssh/id_rsa.pub -e -m pkcs8 | ssh-keygen -i -m pkcs8 -f /dev/stdin > /tmp/pub
Produces /tmp/pub
which is more-or-less a copy of ~/.ssh/id_rsa.pub
. (Actually, any trailing comment will get lost).
Similarly, although deprecated...
ssh-keygen -f ~/.ssh/id_dsa.pub -e -m pkcs8 | ssh-keygen -i -m pkcs8 -f /dev/stdin > /tmp/pub
IncludeCertGetFromFirefox |
[Tools]
. => [Page Info]
... => [Security]
..... => [View Certificate]
........ => [Details]
........... => [Export]
You can choose to save the certificate and/or chain as PEM, DER, or PKCS#7. The files you save can then be manipulated using the appropriate openssl commands.
This was the case with the FireFox version I had available at the time of writing. YMMV.
-- AdrianPepper - 2013-07-08