PV090: PKI a HTTP

David Štorek, <xstorek@fi.muni.cz>

PKI

"PKI (public key infrastructure) je označení infrastruktury pro distribuci a správu (tvorbu, využití a zneplatnění) veřejných klíčů a digitálních certifikátů."[1]

  • integrita

  • nepopíratelnost

  • důvěrnost

Pojmy
  • Privátní klíč

  • Veřejný klíč

  • Certifikát

  • Certifikační autorita (CA)

  • Certificate signing request (CSR)

  • Certificate revocation list (CRL)

Certifikáty a CA

  • hierarchická struktura důvěry

    • příklad: Let’s Encrypt[2]

Atributy certifikátu[3]
Certificate
    Version Number
    Serial Number
    Signature Algorithm ID
    Issuer Name
    Validity
        Not Before
        Not After
    Subject name                            // tady je země, kraj, město...
    Subject Public Key Info
        Public Key Algorithm
        Subject Public Key
    Issuer Unique Identifier (optional)
    Subject Unique Identifier (optional)
    Extensions (optional)
        ...
Certificate Signature Algorithm
Certificate Signature
Systémový SSL adresář
$ openssl version -d
  • OPENSSLDIR/certs - úložiště certifikátů

Obsah certifikátu v čitelné formě
$ openssl x509 -in cert.pem -text

Self-signed certifikát a vlastní certifikační autorita

  • certifikát podepsaný sám sebou

  • např. kořenové certifikáty certifikačních autorit

Podepisovací klíč certifikační autority
$ openssl genrsa -des3 -out ca.key 4096
Certificate signing request
$ openssl req -new -key ca.key -out ca.csr -sha512
Vytvoření certifikátu podepsáním CSR
$ openssl ca -in ca.csr -out ca.crt -keyfile ca.key -selfsign -md sha512 -enddate 20330401235959Z
  • enddate (startdate) ve formátu ANS.1 GeneralizedTime[4]

    • oproti ANS.1 nepodporuje časové zóny a minuty a sekundy jsou povinné

Podepsání certifikátu žadatele
$ openssl ca -out user.pem -in user.csr

Revokace certifikátu

CRL naší vlastní autority
$ openssl ca -revoke cert.pem
  • CRL - certificate revocation list

  • OCSP - Online Certificate Status Protocol

    • Dotaz na CA ohledně platnosti certifikátu

    • CA musí být online

Alternativy PKI

  • Web of Trust

    • decentralizované - není nutno spoléhat na jednu entitu (CA)

    • např. PGP

  • DANE (DNS-based Authentization of Named Entities)

    • pomocí DNSSEC

HTTP Protokol

  • přenost souborů po internetu - nejčastěji HTML

  • textový - čitelný člověkem

  • vznikl v letech 1989 - 90 v CERNu v rámci WWW (World Wide Web)[5]

    • zároveň vznikl také první HTTP klient (prohlížeč) WorldWideWeb, HTML a počátky httpd

HTTP požadavek a odpověď

Požadavek
GET /~kas/pv090 HTTP/1.1
Host: www.fi.muni.cz
User-Agent: curl/8.10.1
Odpověď
HTTP/1.1 200 OK
Date: Mon, 21 Oct 2024 12:51:52 GMT
Server: Apache
Last-Modified: Mon, 30 Sep 2024 13:44:37 GMT
Content-Length: 4439
Content-Type: text/html; charset=utf-8
Content-Language: en

<html>
    Tělo požadavku
</html>
Metody
  • GET, POST, HEAD, PUT, DELETE, TRACE, OPTIONS, CONNECT

Status kódy[6]
  • 1xx - informační

  • 2xx - úspěch

  • 3xx - přesměrování

  • 4xx - chyba na straně klienta

  • 5xx - chyba na straně serveru

Verze HTTP

HTTP/0.9
  • velmi jednoduchý

  • pouze metoda GET, žádné hlavičky, žádné status kódy

HTTP/1.0 (konec 1996)
  • status kódy

  • hlavičky

  • možnost přenosu i jiných dokumentů, než HTML (hlavička Content-Type)

HTTP/1.1 (začátek 1997, revize 1999 a 2014)[7]
  • hlavička Connection: Keep-Alive

    • dosud každý nový požadavek znamenal nové TCP spojení - zbytečně pomalé

  • hlavička Host umožnila provozovat různé domény z jedné IP adresy

HTTP/2 (2015)[8]
  • není textový, ale binární

  • paralelní - není nutno čekat na odpověď před odesláním dalšího požadavku

  • v současnosti jej používá zhruba 35% webů[9]

HTTP/3 (2022)[10]
  • používá QUIC místo TCP

    • místo jednoho TCP spojení využívá vícero proudů přes UDP, packet loss pak řeší na každém proudu zvlášť

  • používá jej zhruba 25% webů[11]

HTTP servery

  • mezi nejpopulárnější patří Apache a nginx[12]

Konfigurace nginx[13]
  • konfigurace typicky v /etc/nginx/nginx.conf

  • za běhu serveru ovládaný příkazem nginx

    • např. nginx -s reload pošle signál pro znovunačtení konfigurace

Formát konfiguračního souboru
  • jednoduchá direktiva

    • jméno a parametry, ukončené středníkem

    • např. listen 8080;

  • bloková direktiva

    • místo středníku další instrukce ve složených závorkách {}

  • bloková direktiva, která obsahuje další direktivy, se nazývá kontext

Příklad jednoduché konfigurace
server {
    location / {
        root /data/www;
    }

    location /images/ {
        root /data;
    }
}
Moduly
  • doplňky do nginx

  • core modules nebo third-party

  • zapínáme direktivou load_module

  • na debianu symlink z /etc/nginx/modules-available/ do /etc/nginx/modules-enabled/

CGI skripty

  • generují dynamický obsah

  • HTTP server na základě požadavku spustí nějaký program a jeho standartní výstup pošle jako odpověď

Cookies

  • ukládání informací o stavu u klienta

  • hlavička Set-Cookie se jménem, hodnotou a Atributy

    • např. Set-Cookie: sessionToken=1337; Expires=Mon, 21 Oct 2024 18:00:00 GMT

  • session cookie - zaniká se zánikem session (typicky zavření okna prohlížeče)

  • persistent cookie - zaniká po datu v Expires

  • klient musí cookies vždy poslat v požadavku: Cookie: sessionToken=1337

Autentizace

Basic auth[14]
  • klient chce autorizovaný zdroj

  • server pomocí hlavičky WWW-Authenticate: Basic požádá o přístupové údaje

  • klient pomocí hlavičky Authorization: Basic <hash údajů> tyto údaje zašle

  • není to šifrované! nutno používat HTTPS

Mezi další metody patří např. SPNEGO - protokol umožňující se domluvit na způsobu autentizace.


1. Převzato z wikipedie: https://cs.wikipedia.org/wiki/PKI
2. Hierarchie Let’s encrypt: https://letsencrypt.org/certificates/
6. HTTP status kódy: https://http.cat/
7. HTTP/1.1: RFC 9112
8. HTTP/2: RFC 9113
10. HTTP/3: RFC 9114