HTTP
- Hypertext transfer protocol
- bezestavový, textový
- porty 80 a 443
Minimální požadavek a odpověď
GET / HTTP/1.1
Host: example.org
User-Agent: curl/8.0
Accept: */*
HTTP/1.1 200 OK
Date: Sat, 18 Oct 2025 10:15:00 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
Server: nginx/1.24.0
<html>...</html>
Metody
- GET – načtení zdroje (bez těla požadavku; idempotentní)
- HEAD – GET ale jen hlavičky
- POST – odeslání dat (formulář, JSON)
- PUT/PATCH/DELETE – vytvoření/změna/smazání zdroje
- OPTIONS – jaké metody a hlavičky server podporuje
- TRACE/CONNECT – okrajové, používají se zřídka
Verze
- HTTP/0.9 – historické „jednořádkové“ GET odpovídající pouze tělem
- HTTP/1.0 – hlavičky, bez perzistentních spojení
- HTTP/1.1 – perzistentní spojení, chunked encoding, Host povinný
- HTTP/2 – binární hlavičky
- HTTP/3 – UDP + QUIC
Hlavičky požadavku
- Host
- Accept, Accept-Language
- Authorization
- Cache-Control, If-Modified-Since/If-None-Match
- Content-Type, Content-Length
- Cookie
- User-Agent
- Accept-Encoding
Stavové kódy
- 1xx Informativní
- 2xx Úspěch
- 3xx Přesměrování
- 4xx Chyba klienta
- 5xx Chyba serveru
Nejčastější kódy:
| Kód | Název |
|---|---|
| 100 | Continue |
| 101 | Switching Protocols |
| 200 | OK |
| 206 | Partial Content |
| 307 | Temporary Redirect |
| 308 | Permanent Redirect |
| 400 | Bad Request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not Found |
| 500 | Internal Server Error |
| 502 | Bad Gateway |
Hlavičky odpovědi
- Content-Type, Content-Length
- Cache-Control, Expires, ETag, Last-Modified
- Location
- Set-Cookie
- Server
Autentizace
- pomocí Auth hlavičky
- výzva od serveru
WWW-Authenticate: Basic realm="..." - odpověď
Authorization: Basic <base64>. - jméno a heslo je plaintext a ve formátu
name:password - kromě
Basicexistuje i např.Digest, který je hashovaný
- výzva od serveru
- Cookies/sessions
- server po přihlášení vydá požadavek na uložení tokenu hlavičkou
Set-Cookie - klient ho posílá v dalších požadavcích
Cookie: key=value
- server po přihlášení vydá požadavek na uložení tokenu hlavičkou
- SPNEGO
- protokol na dohodnutí přihlašovacího algoritmu
- eg NTLM, Kerberos
Server -> klient
- Long polling – klient drží dlouhootevřené GET, server odpoví až při události
- WebSocket – plnohodnotný duplexní kanál
Proxy
- Forward proxy – klient → proxy → internet
- Reverse proxy – internet → proxy → backend
Servery
python -m http.server, další knihovny- Apache HTTP Server
- Nginx
CGI
- princip: server spustí proces; STDOUT → HTTP odpověď
Nginx — ukázky
Základní strukturou configu jsou bloky a formát připomínající json.
$ nginx -s reload
$ nginx -s quit
Statické soubory:
http {
server {
listen 80;
server_name example.org;
root /data/www;
location / {
try_files $uri $uri/ =404;
}
location /non-to-www {
return 301 $scheme://$host$request_uri;
}
}
}
CGI (FastCGI):
location /cgi-bin/ {
fastcgi_split_path_info ^(/cgi-bin)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/cgi-bin$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
Virtuální servery:
server {
listen 80;
server_name example1.com www.example1.com;
root /var/www/example1;
}
server {
listen 80;
server_name example2.com www.example2.com;
root /var/www/example2;
}
Basic auth:
$ htpasswd -c /etc/nginx/.htpasswd user
location /admin/ {
auth_basic "admin area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
SSL (HTTPS):
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/ssl/certs/www.example.com.crt;
ssl_certificate_key /etc/ssl/private/www.example.com.key;
ssl_trusted_certificate /etc/ssl/certs/chain.crt;
}
PKI
HTTP nad TLS je založeno na asymetrickém šifrování. Veřejný klíč je součástí x509 certifikátu. Při navštěvě webové stránky:
- Server pošle svůj certifikát prohlížeči
- Prohlížeč ověří, že je certifikát
- podepsaný důveryhodnou autoritou
- vydaný pro navštěvovanou doménu
- platný
- Pokud ano, prohlížeč důvěřuje veřejnému klíči serveru.
Zobrazení certifikátu dané stránky:
$ openssl s_client -showcerts -connect www.fi.muni.cz:443
Cíle PKI
- integrita - “zpráva nebyla změněna”
- nepopíratelnost - doložení původce zprávy
- důvěrnost - šifrování zpráv při přenosu
Certificate Authority
- kořenová (root)
- zprostředkující (intermediate)
CA vydávají a spravují certifikáty. Server typicky dostane certifikát podepsaný intermediate CA a musí poslat celý řetěz (mimo root).
DANE
DANE (TLSA záznamy v DNSSEC) umožňuje vázat veřejný klíč/certifikát na doménu přes DNSSEC.
Formát certifikátu
- Subject: Country (C), Common name (CN), Organization (O)
- Subject Alternative Name (SAN): DNS názvy (nutné pro validaci jména)
- Public Key
- Signature Algorithm
- Validity: Not Before/Not After
- Issuer
- Extensions
Důvěryhodné certifikáty
$ openssl version -d
$ man update-ca-certificates
Zobrazení certifikátu
$ openssl x509 -in cert.pem -text -noout
Automatizace – Let’s Encrypt, ACME protokol
- Uživatel použije ACME klient, který pošle požadavek na Lets Encrypt
- Let’s Encrypt bude chtít důkaz, že uživatel vlastní danou doménu (eg specifický DNS záznam)
- Let’s Encrypt toto ověří z různých sítí
- Let’s Encrypt umožní danému klientu spravovat certifikát pro danou doménu
Self-signed certifikáty
- certifikát podepsaný sám sebou
- obecně nedůvěryhodné
- s výjimkou root certifikátů
Nástroje OpenSSL
- Vytváření klíčů
$ openssl genrsa -out private.key 409
- Vytvoření self-signed certifikátu
$ openssl req -x509 -new -key ca.key -sha256 -days 3650 -out ~/pv090/ca/certs/ca.crt
- Certificate signing request
$ openssl req -new -key other.key -out request.csr
- Podepsání CSR (předpokládá
openssl.cnf)
$ openssl ca -in ~/pv090/server.csr -out ~/pv090/server.crt
- Revokace a CRL
$ openssl ca -revoke server.crt
$ openssl ca -gencrl -out revoked.crl
Zdroje
- https://datatracker.ietf.org/doc/html/rfc9110
- https://linux.die.net/man/1/openssl
- https://en.wikipedia.org/wiki/List_of_HTTP_header_fields
- https://w3techs.com/technologies/details/ce-http3
- https://www.fi.muni.cz/~kas/pv090/referaty/2024-podzim/pki-http.html
- https://nginx.org/en/docs/beginners_guide.html
- https://letsencrypt.org/how-it-works/