==== How to create your own CA root certificate ==== \\ **Self-signed certificates are pretty bad overall**, even worse when served **over the internet**. You can't easily tell if the certificate you are about to **exceptionally trust**, is yours, or **faked by your gov or ISP**.\\ \\ So, how do you solve this?. By creating your **own CA certificate** and importing it either on your system, or on your Firefox Independent CAcert list.\\ \\ This will turn a **self-signed** tls warning into a **shining green lock**, which will ensure the connection to your server is **not tampered**. In case it gets tampered, a warning will appear on your browser and you will **easily notice someone is modifying** your tls handshake.\\ \\ **Why not using** a let's encrypt certificate? Well, **there is cases** where the service you want to **expose on the internet is merely private** (ex: a nextcloud, music server, documentation) and there is **not a public domain name** pointing to your server, just a **local DNS server** or custom **/etc/hosts** entry.\\ \\ After some background on why/when using **your own CAcert** is needed, **let's get started !!**\\ \\ ==== Create your CA root certificate ===== \\ First, we need to **create our CA signing key** (used to create signed certificates by US)\\ **Please use a strong key!!** openssl genrsa -aes256 -out AGUAKTECH.key 4096 **Create pem** (crt) file for your CAcert (**valid for 10 years**) openssl req -x509 -new -nodes -key AGUAKTECH.key -sha256 -days 3650 -out AGUAKTECH.pem \\ ==== Create a self-signed certificate for your application ==== \\ Generate a **new private key** for our server/domain openssl genrsa -out yourdomain.com.key 4096 Generete a **san.cnf signing request** and configure your domain information [ req ] default_bits = 4096 prompt = no encrypy_key = no default_md = sha256 distinguished_name = dn req_extensions = req_ext [ dn ] # you can choose to use a wildcard or not #CN = *.yourdomain.com CN = yourdomain.com O = Your Domain OU = Your Domain L = Los Angeles ST = California C = EU [ req_ext ] subjectAltName = DNS: *.yourdomain.com, DNS: yourdomain.com Now create a **CSR (signing request)** from the san.cnf config file created openssl req -new -config yourdomain.com.san.cnf -nodes -key yourdomain.com.key -out yourdomain.com.csr \\ ==== Sign your CSR with your CAcert key ===== \\ Given the **csr generated by the issuer** (us), **sign the certificate** to generate a crt file # Expiration time # paranoid: 1 year max # normal: 2-3 years # stupid: 10 years openssl x509 -req -in yourdomain.com.csr -CA AGUAKTECH.pem -CAkey AGUAKTECH.key -CAcreateserial -out yourdomain.com.crt -days 365 -sha256 \\ ==== Install the generated certificate ===== \\ **Certificate installation** steps on firefox: - Upload the **yourdomain.com.crt** file on some http server (optional) - **Browse** the http resource or do it locally using the **file:///path/to/yourdomain.com.crt** - **Check both** trust CA for internet and email. **Enjoy!** **Certificate installation** steps on a Debian-based Linux system (Optional) # copy the .pem file to a .crt file in the appropiate path cp AGUAKTECH.pem /usr/local/share/ca-certificates/ # update system certificates automatically update-ca-certificates \\ ==== Things to consider on Reverse Proxies ===== * **Nginx and Apache** let you specify both the **.crt and the .key** file in **different directives**.\\ * **HAProxy** uses a packed .pem file which **contains the .crt and .key** file all in one (**cat yourdomain.com.crt yourdomain.com.key > yourdomain.com.pem**)