When building personal or internal projects, it is common practice to use self signed certificates in order to enable HTTPS support.
Self signed certificates, as the name implies, are certificates which you generate yourself. They are generally frowned on from a security point of view, since although they make encryption possible, as they are not signed by a recognised authority, they make no guarantees about trust.
This means that, at the very least, you’ll get a warning in your browser. Worse, it becomes very easy for an attacker to MITM your connection, since both situations will trigger a warning, unless you manually compare key signatures, you’ll never know.
The good news is that, if the only clients that ever connect to your service are under your control (your own custom client, or a browser on your computers in your office, etc), you can use self signed certificates safely by becoming your own certificate authority.
… So here’s how (mainly for my own reference).
Becoming your own certificate authority
The first step is to generate your own master key and certificate that you’ll use to sign your keys.
Start, by generating your root key. It is very important that you keep this safe as anyone who somehow gets a copy of it could create certificates signed as you!
openssl genrsa -out root.key 4096
Next, generate your master certificate using this key
openssl req -x509 -new -nodes -key root.key -days 1825 -out root.pem
Once you’ve generated this certificate, you need to install it on your clients. How this is done varies from client to client, but most browsers have an option (usually in the “advanced” or “security” section) to install a certificate provider. Have a google for “YOUR CLIENT” and “installing certificate” will usually get you somewhere.
On iOS devices the process is simply a matter of emailing the .pem to yourself and clicking on it, and the device will guide you through installation. This will make it available to Safari, but irritatingly there seems to be no way to install certificates for Chrome on iOS.
To update linux command line apps (incuding curl), copy and rename the .pem to /usr/local/share/ca-certificates
and then run update-ca-certificates
as root.
Generate your server certificates
Once you’ve installed your certificate authority key on the various computers and devices under your control, you are free to generate as many self signed certificates as you wish. Once these certificates are signed by your certificate authority, they will be accepted as legit by all the computers that you’ve installed your root.pem on.
This will provide not only encryption, but also trust, providing protection against eavesdropping and spoofing.
- Generate your server key:
openssl genrsa -out server.key 4096
- Generate a certificate signing request (CSR):
openssl req -new -key server.key -out server.csr
- Generate your certificate, signing it with your master key:
openssl x509 -req -in server.csr -CA root.pem -CAkey root.key -CAcreateserial -out server.crt -days 365
Install your certificate, in Apache or wherever, as you would any other certificate.