Raz na jakiś czas muszę dodać kolejną usługę do lrem.net. Na tyle rzadko, że nigdy nie pamiętam jak to się robi. Na tyle często, że fakt iż nie pamiętam mnie wkurza. Czas więc to udokumentować.

Założenia:

  • SSL added and removed here – komunikacja z backendem w HTTP.
  • HTTPS z certyfikatem od Let’s Encrypt.
  • Automatyczne odnawianie rzeczonego certyfikatu.
  • HTTP od użytkownika przekierowuje na HTTPS.
  • Opcjonalnie HTTP basic auth, głównie żeby wytępić roboty.

Najpierw zakładam osobnego użytkownika. Nie jest to w tym przypadku konieczne, bo nie będzie uruchamiał żadnych procesów na tym serwerze, ale po prostu lubię jednolitość:

useradd -m reader

Teraz czas dodać prostą konfigurację nginx:

server {
	listen 80;
	server_name reader.lrem.net;

	location / {
		root /home/reader;
	}
}

Konfiguracji DNS opisywał nie będę. Kolej na uzyskanie certyfikatu. Widziałem kiedyś moduły do Nginx robiące to w locie, ale nie były od nikogo, komu bym ufał. Co innego Certbot od Electronic Frontier Foundation. Inkantacja to tylko:

certbot certonly --webroot -w /home/reader -d reader.lrem.net

certbot renew siedzi już sobie w cronie. Teraz czas dodać konfigurację korzystającą z uzyskanego certyfikatu. Jedyna komplikacja tutaj to fakt, że chcemy przekierowywać z HTTP na HTTPS. ACME, protokół używany przez Let’s Encrypt do weryfikacji posiadania domeny, wymaga jednak HTTP - dodajemy więc osobną lokalizację dla niego.

# Redirect to SSL.
server {
        listen 80;

        server_name reader.lrem.net;

        location /.well-known/acme-challenge/ {
                root /home/reader;
        }

        location / {
                return 301 https://$host$request_uri;
        }
}


server {
        listen 443;

        ssl on;
        ssl_certificate /etc/letsencrypt/live/reader.lrem.net/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/reader.lrem.net/privkey.pem;

        server_name reader.lrem.net;
        access_log /var/log/nginx/reader.access.log;
        error_log /var/log/nginx/reader.error.log;

        root /home/reader;
        index index.html;

        location / {
                proxy_pass http://212.77.100.101:1234;
        }
}

Ostatnia rzecz do zrobienia to dodanie hasła po stronie nginx. Nie jest to ściśle potrzebne dla bezpieczeństwa. Internet jednak pełen jest robotów nie respektujących robots.txt, a ja nie widzę powodu by pozwolić im podgrzewać nadto mój procesor. Tworzę więc jednego użytkownika i dzielę się hasłem z rodziną/znajomymi (co można zrobić już w linku typu https://user:hasło@app.whitehouse.gov). Najpierw:

htpasswd -c -s /etc/nginx/auth/reader.lrem.net reader

Potem dodaję w konfiguracji nginx:

        location / {
                proxy_pass http://212.77.100.101:1234;
                auth_basic "Mind Reader";
                auth_basic_user_file /etc/nginx/auth/reader.lrem.net;
        }