Dokumentacija
Vklopite HSTS
Vklopite HSTS
Preusmeritev s http:// na https:// zaščiti obiskovalce šele po prvem zahtevku, ta prvi zahtevek pa potuje nešifriran. V javnem omrežju Wi-Fi ga lahko nekdo prestreže in obiskovalca zadrži na lažni različici vaše strani na http://. HSTS (HTTP Strict Transport Security) to luknjo zapre: ena glava odgovora brskalniku naroči, naj za vašo domeno določen čas uporablja HTTPS in http:// sploh več ne poskuša.
Glava nič ne stane in jo upošteva vsak sodoben brskalnik. Kontrolni seznam strani jo pričakuje z max-age vsaj 180 dni.
Kako je glava videti
Strict-Transport-Security: max-age=31536000; includeSubDomains
| Del | Pomen |
|---|---|
max-age |
koliko sekund si brskalnik zapomni, da mora uporabiti HTTPS. Kontrolni seznam zahteva vsaj 15552000 (180 dni); eno leto je 31536000. |
includeSubDomains |
pravilo velja tudi za vse poddomene: shop.example.com, mail.example.com, intranet.example.com … |
preload |
prošnja za vgradnjo v brskalnike (glejte opozorilo spodaj). Neobvezno. |
Brskalniki glavo sprejmejo samo prek HTTPS; v odgovorih na http:// jo prezrejo. Najprej poskrbite, da preusmeritev s HTTP na HTTPS deluje.
Opozorilo: HSTS je obljuba, ki vas brskalnik drži za besedo. Dokler traja
max-age, brskalnik obiskovalca strani ne odpre po navadnem HTTP ali mimo napake certifikata, gumba "vseeno nadaljuj" pa ni. Preden dodateincludeSubDomains, preverite, da ima vsaka poddomena veljaven certifikat, tudi stare, ki delujejo samo nahttp://.
Začnite nizko, nato zvišajte
- Začnite z
max-age=300(pet minut) in preverite stran in njene poddomene. - Za nekaj dni zvišajte na
86400(en dan). - Nato nastavite
31536000(eno leto).
Če se s kratko vrednostjo kaj pokvari, lahko glavo odstranite in brskalniki jo pozabijo v nekaj minutah. Z enim letom si jo zapomnijo za leto dni.
O preloadu
Ključna beseda preload in seznam na hstspreload.org vašo domeno vgradita v Chrome, Firefox, Safari in Edge, tako da HTTPS uporabi že čisto prvi obisk. Seznam zahteva max-age vsaj 31536000, includeSubDomains in preload. Umik s seznama traja mesece in doseže samo obiskovalce s posodobljenimi brskalniki. preload dodajte samo, če ste prepričani, da bo cela domena z vsemi poddomenami za vedno ostala na HTTPS.
Preverite sami
Namesto example.com vpišite svojo stran:
curl -sI https://example.com | grep -i '^strict-transport-security'
curl -sI https://example.com/no-such-page | grep -i '^strict-transport-security'
Popravljeno: obe vrstici izpišeta glavo z max-age=15552000 ali več. Drugi ukaz preveri, da jo nosijo tudi strani z napako; za to v spodnjih primerih za nginx in Apache skrbi always.
Kako popraviti
Glavo nastavite na enem mestu, čim bližje obiskovalcu: CDN ali spletni strežnik pokrije vsak odgovor, tudi slike in predpomnjene strani. Izberite tisto, do česar imate dostop.
WordPress
Če lahko, glavo nastavite v nadzorni plošči gostovanja ali v .htaccess (glejte ta zavihka): tako velja tudi za predpomnjene strani in datoteke, ki do PHP-ja nikoli ne pridejo.
Če imate samo dostop do administracije WordPressa, to dodajte z brezplačnim vtičnikom Code Snippets (Snippets → Add New, izvajanje povsod) ali v functions.php podrejene teme:
// HSTS na vsaki strani, ki jo WordPress ustvari prek HTTPS.
add_action('send_headers', function () {
if (is_ssl()) {
header('Strict-Transport-Security: max-age=31536000; includeSubDomains');
}
});
Nato počistite predpomnilnik strani. Strani, ki jih streže neposredno predpomnilnik (WP Rocket, LiteSpeed Cache), so lahko še vedno brez glave; če preverjanje s curl pokaže, da manjka, uporabite zavihek za strežnik.
cPanel
Deljeno gostovanje s cPanelom večinoma nima stikala za HSTS, .htaccess pa deluje. To dodajte v .htaccess v korenski mapi strani (File Manager, z vklopljenim Show Hidden Files):
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>
Brskalniki glavo v odgovorih na http:// prezrejo, zato tam ne škodi; pomembno je, da je na vsakem odgovoru na https://.
Plesk
- Odprite Websites & Domains → example.com → SSL/TLS Certificates.
- Vklopite HSTS in max-age nastavite na vsaj 6 mesecev (bolje eno leto). Include subdomains označite šele, ko jih preverite, Preload pa pustite izklopljen, razen če ga res želite.
Če vaša različica Pleska tam nima stikala za HSTS, glavo dodajte v Websites & Domains → example.com → Apache & nginx Settings, v Additional nginx directives:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
nginx
V blok server za HTTPS vaše strani (/etc/nginx/sites-available/example.com na Debianu in Ubuntuju, /etc/nginx/conf.d/example.com.conf na Rocky, Alma in CentOS):
server {
listen 443 ssl;
server_name example.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
Brez always nginx glave ne doda odgovorom z napako. Past: blok location, ki ima svoj add_header, ne podeduje nobene glave iz bloka server, zato vrstico tam ponovite.
sudo nginx -t && sudo systemctl reload nginx
Apache in LiteSpeed
Z dostopom do strežnika (Apache). V <VirtualHost *:443> vaše strani (/etc/apache2/sites-available/example.com-le-ssl.conf ali podobno na Debianu in Ubuntuju, /etc/httpd/conf.d/ na Rocky, Alma in CentOS):
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Potrebuje mod_headers (na Debianu in Ubuntuju: sudo a2enmod headers).
sudo apachectl configtest && sudo systemctl reload apache2
(Na Rocky, Alma in CentOS httpd namesto apache2.)
Brez dostopa do strežnika (deljeno gostovanje, LiteSpeed). Uporabite vrstice za .htaccess iz zavihka cPanel; LiteSpeed jih bere enako.
Cloudflare
- Odprite domeno in pojdite na SSL/TLS → Edge Certificates.
- Pod HTTP Strict Transport Security (HSTS) kliknite Enable HSTS in potrdite opozorilo.
- Max Age Header nastavite na 6 months ali 12 months. Apply HSTS policy to subdomains vklopite šele, ko preverite poddomene; Preload pustite izklopljen, razen če ga res želite.
- Save.
Cloudflare glavo doda vsakemu odgovoru, ki ga streže. Če jo pošilja tudi vaš strežnik, s curl preverite, da je rezultat ena sama glava z vrednostjo, ki jo želite.
Node.js in Next.js
Next.js (lastno gostovanje), v next.config.js:
module.exports = {
async headers() {
return [{
source: '/:path*',
headers: [
{ key: 'Strict-Transport-Security', value: 'max-age=31536000; includeSubDomains' },
],
}];
},
};
Na Vercelu lastne domene glavo HSTS že dobijo od platforme; preden dodate svojo, preverite s curl.
Express: paket helmet privzeto pošilja Strict-Transport-Security z enoletnim max-age (app.use(helmet())). Če je pred aplikacijo nginx, zadošča nastavitev tam (zavihek nginx).
Laravel
Ustvarite middleware, na primer app/Http/Middleware/StrictTransportSecurity.php:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class StrictTransportSecurity
{
public function handle(Request $request, Closure $next): Response
{
$response = $next($request);
if ($request->isSecure()) {
$response->headers->set('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
}
return $response;
}
}
Registrirajte ga v bootstrap/app.php:
->withMiddleware(function (Middleware $middleware) {
$middleware->append(\App\Http\Middleware\StrictTransportSecurity::class);
})
Za razdelilnikom obremenitve ali proxyjem je isSecure() resničen samo, če Laravel proxyju zaupa ($middleware->trustProxies(at: '*') ali naslov IP vašega proxyja). Sicer se glava nikoli ne pokaže.
IIS in ASP.NET
V datoteki web.config strani:
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
V ASP.NET Core app.UseHsts() privzeto pošlje samo 30 dni, kar je manj od 180, ki jih zahteva kontrolni seznam. Starost nastavite izrecno:
builder.Services.AddHsts(options =>
{
options.MaxAge = TimeSpan.FromDays(365);
options.IncludeSubDomains = true;
});
Gostovane platforme
Na Shopifyju, Wixu, Squarespaceu in Webflowu glave odgovorov nastavlja platforma. Če HSTS manjka ali je krajši od 180 dni, na vaši strani ni nastavitve zanj; lahko vprašate podporo platforme ali stran postavite za Cloudflare in ga nastavite tam.
Potrdite popravek
Znova poženite ukaza curl iz razdelka Preverite sami, nato v PulseKeeperju odprite tarčo in na zavihku Kontrolni seznam kliknite Preveri zdaj. Postavka pokaže najdeni max-age v dneh.