# Certifikat via Lets Encrypt och Certbot

1. Först behövs snapd. Kommer per default med Ubuntu. Kontrollera installerade snap paket med `snap list`
2. Ta bort eventuella installation av certbot-auto och Certbot OS med `sudo apt-get remove certbot`
3. Installera certbot med `sudo snap install --classic certbot`
4. Förbered maskinen så att certbot-kommandot kan köras: `sudo ln -s /snap/bin/certbot /usr/bin/certbot`
5. Få ett certifikat och uppdatera apache-konf med `sudo certbot --apache`, alternativt få enbart ett certifikat och uppdatera apache manuellt med `sudo certbot certonly --apache`
6. När du har fått ett certifikat, gör en backup av apache-konfen och skapa en ny apache-konffil: `sudo mv /etc/apache2/sites-available/bookstack.conf /etc/apache2/sites-available/bookstack.conf.old`, `sudo vim /etc/apache2/sites-available/bookstack.conf`
7. Ändra relevanta värden och skapa en ny apache-konfiguration (vhost):  
    ```
    <VirtualHost *:80>
        ServerName YOUR-DOMAIN-HERE
        RewriteEngine On
        RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
    </VirtualHost>
    
    <VirtualHost *:443>
    	ServerName YOUR-DOMAIN-HERE
    	ServerAdmin webmaster@localhost
    	DocumentRoot /var/www/bookstack/public/
    
        SSLEngine on
        SSLCertificateFile      /etc/letsencrypt/live/YOUR-DOMAIN-HERE/fullchain.pem
        SSLCertificateKeyFile   /etc/letsencrypt/live/YOUR-DOMAIN-HERE/privkey.pem
    
        <Directory /var/www/bookstack/public/>
            Options Indexes FollowSymLinks
            AllowOverride None
            Require all granted
            <IfModule mod_rewrite.c>
                <IfModule mod_negotiation.c>
                    Options -MultiViews -Indexes
                </IfModule>
                RewriteEngine On
                # Handle Authorization Header
                RewriteCond %{HTTP:Authorization} .
                RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
                # Redirect Trailing Slashes If Not A Folder...
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteCond %{REQUEST_URI} (.+)/$
                RewriteRule ^ %1 [L,R=301]
                # Handle Front Controller...
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteRule ^ index.php [L]
            </IfModule>
        </Directory>
    
    	ErrorLog ${APACHE_LOG_DIR}/error.log
    	CustomLog ${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>
    ```
8. Aktivera apaches SSL modul: `sudo a2enmod ssl`
9. Verifiera om det finns några fel med `sudo apachectl configtest` och åtgärda vid behov
10. Redigera bookstacks .env-fil: `sudo vim /var/www/bookstack/.env`, ändra `APP_URL` till HTTPS istället för HTTP
11. Slutligen, starta om apache2! `sudo systemctl restart apache2`

## Skapa certifikat manuellt

Först behövs ett värde för en dns-01 challenge:

```
sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain -d your-domain
```

Byt ut värden ovanför till det som önskas. Exemplet ber om ett wildcard. Man kommer behöva lägga till ett värde i sin externa DNS-zon för validering. Certifikaten hamnar sedan i en undermapp till `/etc/letsencrypt/live/`.

Certifikat som har hämtats med certbot kan kontrolleras med `sudo certbot certificates`. Certifikat kan tas bort med `sudo certbot delete`.

Vid förnyelse hade jag problem med att få ut en ny TXT-sträng för DNS validering. Borttagande av certifikat och skapande med nedan syntax för att få TXT värdet fungerade:

```
sudo certbot certonly --manual --preferred-challenges=dns --email admin@jehrlander.net --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d jehrlander.net -d *.jehrlander.net

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for jehrlander.net and *.jehrlander.net

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name:

_acme-challenge.jehrlander.net.

with the following value:

xxxxxx

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
```