Table of Contents
SSL
This documentation covers OpenSSL only, as it is the standard implementation for Linux.
Commands
OpenSSL commands are specified as first argument to the openssl
binary. Normally each command has it's own manpage.
req
req covers things done with Certificate Requests.
creating a Certificate Request
Use this for an unencrypted key:
openssl req -new -nodes -keyout bincimap.key -out bincimapreq.pem
creating the RootCA
For building a RootCA, you need a self-signed certificate:
openssl req -x509 -newkey rsa:1024 -keyout key.pem -out req.pem
ca
ca is used for doing Certificate Authority stuff.
signing
To sign a Certificate Request (generating a certificate) use:
openssl ca -in filename.csr -out filename.crt
revoking
To revoke a certain certificate:
openssl ca -revoke filename.crt
x509
With x509 you can watch into certificates and other files.
watching a certificate
openssl x509 -in filename.crt -text
Howto: CA + Certificates
This is what I did to setup a RootCA and sign some certificates with it.
Preparations
Directory-Structure below /etc/ssl/
# ls -l /etc/ssl/nwl/ total 0 drwxr-xr-x 2 root root 6 Nov 1 20:45 certs drwxr-xr-x 2 root root 6 Nov 1 20:45 crl drwxr-xr-x 2 root root 6 Dec 3 04:01 newcerts drwx------ 2 root root 6 Dec 3 04:01 private
customizing /etc/ssl/openssl.cnf
- Fix pathnames to meet the directoy-structure mentioned above.
- Check Signing Policy.
- Set useful samples and defaults in the req - part of the file.
- The CommonName should be the FQDN of the host, at least for Apache.
Rocking with OpenSSL
Creating Diffie-Hellman parameters
# openssl dhparam -outform PEM -out /etc/ssl/nwl/dh1024.pem -2 1024
This takes quite long. There is also a faster variant of generating the params, but then you should recreate them before each use, which is likely to be forgotten. The created file should contain the folowing lines:
-----BEGIN DH PARAMETERS----- [...] -----END DH PARAMETERS-----
Creating an initial serial
Peace of Cake:
# echo 00 > /etc/ssl/nwl/serial
The serial will be incremented with every certificate signed. It is also used for naming the new certificates in /etc/ssl/newcerts.
Creating the Certificate Database
Again Peace of Cake:
# touch /etc/ssl/nwl/index.txt
Creating The RootCA Itself
To actually create the RootCA just create a self-signed certificate:
# openssl req -x509 -newkey rsa:1024 -days 365 -keyout private/cakey.pem -out cacert.pem
BEWARE: This does not make sense without a password!
Use this to check the output:
# openssl x509 -in cacert.pem -text
Setting nsCertType to server
In openssl.conf goto [ usr_cert ], and then change nsCertType:
nsCertType = server
After that you should generate all server-certificates at once, to prevent creating one with a wrong nsCertType later.
Setting nsCertType to client again
Just as above, change the variable back to client:
nsCertType = client, email
Then the file should match for later creating client-certificates when requested.
Always rocking with OpenSSL
Creating a Certificate Signing Request
To create a request with matching key:
# openssl req -new -nodes -keyout wiki.nwl.key -out wiki.nwl.csr
wiki.nwl.key should contain then:
-----BEGIN RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----
wiki.nwl.csr should contain:
-----BEGIN CERTIFICATE REQUEST----- -----END CERTIFICATE REQUEST-----
Signing a Certificate Signing Request
# openssl ca -in wiki.nwl.csr -out wiki.nwl.crt
Then you can savely delete the request, as it is not needed anymore:
# rm wiki.nwl.csr
Creating an initial crl
First thing to do is initialise an index file (see crlnumber config option):
# echo 00 >/etc/ssl/nwl/crlnumber
Then we create an empty initial crl:
# openssl ca -gencrl -out crl.pem
Correctly watching the generated files
# openssl rsa -in wiki.nwl.key -text # openssl req -in wiki.nwl.csr -text # openssl x509 -in wiki.nwl.crt -text # openssl crl -in crl.pem -text
Revoking a certifikate
First the revocation itself (The name need not match, you can also find all created certificates in /etc/ssl/nwl/newcerts, where they are named by their serial.):
# openssl ca -revoke wiki.nwl.crt
after that, one needs to recreate the crl file:
# openssl ca -gencrl -out crl.pem
Enhancing Validity
Certificates
There is no way to edit an already existing certificate (and having it automatically resigned by the CA afterwards), so a matching CSR has to be created first:
# openssl x509 -x509toreq -in wiki.nwl.crt -out wiki.nwl.csr -signkey wiki.nwl.key
In order to keep the certificate DB sane, openssl enforces to revoke the old certificate before the new one can be signed:
# openssl ca -revoke wiki.nwl.crt # openssl ca -in wiki.nwl.csr -out wiki.nwl.crt
Certificate Authority
Was not necessary yet, but for instructions see this link: http://marc.info/?l=openssl-users&m=113292902213919
Certificate Revocation List
This is quite easy. CRLs simply need to be recreated after some time (and should then be made accessible, of course). To do so:
# openssl ca -gencrl -out crl.pem
Creating Certificate Hash Symlinks
Usually certificates and revocation lists are being looked up by their hash. Ideally one creates a symlink therefore:
# ln -s wiki.nwl.crt $(openssl x509 -noout -hash -in wiki.nwl.crt).0 # ln -s crl.pem $(openssl crl -noout -hash -in crl.pem).r0
Note the mandatory suffixes .0
for certificates and .r0
for revocation lists.
Misc
PEM Files
Sometimes you need a so called Pem-File, which contains both key and certificate. Creating it is very simple though:
- create a key and certificate signing request
- sign the request, generating the certificate
- use cat to put them together in one singe file:
cat bincimap.key bincimap.crt >> bincimap.pem
HTTPS
Browserconfiguration
To get the Browser trust your own CA, the CA certificate must be imported into it.
Servercertifikates
Praktically all browsers check the CN of the certificate offered whether it matches the hostname requested. This is also the reason, why virtual hosting for ssl-hosts does not work.