Text v Expression Editor:
trueVybraná operace v části Úprava hlavičky požadavku: Odebrat
Název hlavičky: Client-Cert
← Cloudflare SSL/TLS / ssl / client-certificates
RFC 9440 ↗ definuje Client-Cert a Client-Cert-Chain Pole HTTP hlaviček pro předávání informací o klientském certifikátu origin serverům. Tyto hlavičky můžete sestavit pomocí pravidla úprav hlaviček požadavku s následujícími poli Ruleset Engine:
cf.tls_client_auth.cert_rfc9440 : Koncový certifikát klienta zakódovaný podle formátování RFC 9440 (viz odkaz).cf.tls_client_auth.cert_chain_rfc9440 : Řetězec certifikátů (bez koncového certifikátu) zakódovaný podle formátování RFC 9440 (viz odkaz).Jak je uvedeno v definicích polí, lze pole nastavit buď na prázdný řetězec, nebo na platné kódování podle RFC 9440. Správné použití závisí na několika faktorech popsaných v následujících částech.
cert_rfc9440 a cert_chain_rfc9440 pole jsou vyplněna bez ohledu na výsledek ověření certifikátu. To znamená, že klient může předložit neplatný, prošlý nebo samopodepsaný certifikát a pole budou přesto obsahovat zakódovaná data certifikátu. Než začnete hodnotám důvěřovat, vždy zkontrolujte následující pole:
cf.tls_client_auth.cert_verified : Vrací true pokud je klientský certifikát platný.cf.tls_client_auth.cert_revoked : Vrací true pokud byl klientský certifikát odvolán.Klient může rovněž zahrnout vlastní Client-Cert nebo Client-Cert-Chain hlavičky v požadavku a vložit tak libovolné hodnoty. Jak je popsáno v Bezpečnostní hlediska RFC 9440 ↗, musíte bezpodmínečně odstranit veškeré existující Client-Cert a Client-Cert-Chain hlavičky z příchozích požadavků bez ohledu na platnost certifikátu. Tím se zabrání tomu, aby klient vložil podvržená data certifikátu, kterým by váš origin důvěřoval.
Viz Povolení mTLS pro podrobnosti o konfiguraci mTLS a validace certifikátů.
Zakódovaný koncový certifikát je omezen na 10 KiB a zakódovaný řetěz na 16 KiB. Pokud zakódovaná hodnota překročí limit, příslušné pole obsahuje prázdný řetězec. Ke kontrole tohoto stavu použijte následující pole:
cf.tls_client_auth.cert_rfc9440_too_large : Vrací true pokud zakódovaný certifikát přesáhne 10 KiB.cf.tls_client_auth.cert_chain_rfc9440_too_large : Vrací true pokud zakódovaný řetěz přesáhne 16 KiB.Zde uvádíme příklad, jak tato pole bezpečně použít k sestavení důvěryhodného Client-Cert a Client-Cert-Chain hlavičky přeposílat na váš origin.
Origin se pak může spolehnout na přítomnost hlaviček a mít jistotu, že klient předložil platný certifikát.
Poznámka: Client-Cert-Chain hlavička může být vynechána, pokud klient nepředložil žádné mezilehlé certifikáty (pouze koncový certifikát).
Musíte vytvořit následující pravidla pro úpravu hlaviček požadavku. Hlavička Odebrat pravidla musí být umístěna před Nastavit dynamické pravidla, aby byly hlavičky vložené klientem odstraněny u každého požadavku ještě před nastavením ověřených hodnot.
Toto pravidlo bezpodmínečně odstraňuje jakýkoli Client-Cert hlavičku odeslanou klientem.
Text v Expression Editor:
trueVybraná operace v části Úprava hlavičky požadavku: Odebrat
Název hlavičky: Client-Cert
Toto pravidlo bezpodmínečně odstraňuje jakýkoli Client-Cert-Chain hlavičku odeslanou klientem.
Text v Expression Editor:
trueVybraná operace v části Úprava hlavičky požadavku: Odebrat
Název hlavičky: Client-Cert-Chain
Toto pravidlo nastavuje Client-Cert hlavičku pouze tehdy, když klient předložil platný, neodvolaný certifikát, který je v rámci limitu velikosti.
Text v Expression Editor:
cf.tls_client_auth.cert_verified
and not cf.tls_client_auth.cert_revoked
and not cf.tls_client_auth.cert_rfc9440_too_largeVybraná operace v části Úprava hlavičky požadavku: Nastavit dynamické
Název hlavičky: Client-Cert
Hodnota: cf.tls_client_auth.cert_rfc9440
Toto pravidlo nastavuje Client-Cert-Chain hlavičku pouze tehdy, když klient předložil platný, neodvolaný certifikát
a řetězec není prázdný a je v rámci limitu velikosti.
Text v Expression Editor:
cf.tls_client_auth.cert_verified
and not cf.tls_client_auth.cert_revoked
and cf.tls_client_auth.cert_chain_rfc9440 ne ""
and not cf.tls_client_auth.cert_chain_rfc9440_too_largeVybraná operace v části Úprava hlavičky požadavku: Nastavit dynamické
Název hlavičky: Client-Cert-Chain
Hodnota: cf.tls_client_auth.cert_chain_rfc9440
Hlavičky podle RFC 9440 můžete sestavit také Cloudflare Worker
pomocí tlsClientAuth
vlastnosti příchozího požadavku.
Platí stejné bezpečnostní zásady, jaké jsou uvedeny výše.
Kromě vynucení ověřování mTLS pro vašeho hostitele můžete klientský certifikát předat i na váš origin server jako hlavičku HTTP. Toto nastavení bývá užitečné pro serverové logování.
Aby se certifikát nepřidával ke každému jednotlivému požadavku, je odeslán pouze při prvním požadavku připojení mTLS.
Nejběžnějším způsobem předání certifikátu je použití Cloudflare API k aktualizovat nastavení názvu hostitele certifikátu mTLS.
Požadovaná oprávnění API tokenu
Access: Mutual TLS Certificates Writecurl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/access/certificates/settings" \
--request PUT \
--header "X-Auth-Email: $CLOUDFLARE_EMAIL" \
--header "X-Auth-Key: $CLOUDFLARE_API_KEY" \
--json '{
"settings": [
{
"hostname": "<HOSTNAME>",
"china_network": false,
"client_certificate_forwarding": true
}
]
}'Jakmile client_certificate_forwarding je nastaveno na true, každý požadavek v rámci spojení mTLS nyní bude obsahovat následující hlavičky:
Cf-Client-Cert-Der-Base64Cf-Client-Cert-Sha256Můžete také upravte hlavičky odpovědí HTTP pomocí Managed Transforms a předejte tak Hlavičky ověřování klienta TLS.
Workers navíc mohou poskytnout podrobnosti o klientský certifikát.
const tlsHeaders = {
"X-CERT-ISSUER-DN": request.cf.tlsClientAuth.certIssuerDN,
"X-CERT-SUBJECT-DN": request.cf.tlsClientAuth.certSubjectDN,
"X-CERT-ISSUER-DN-L": request.cf.tlsClientAuth.certIssuerDNLegacy,
"X-CERT-SUBJECT-DN-L": request.cf.tlsClientAuth.certSubjectDNLegacy,
"X-CERT-SERIAL": request.cf.tlsClientAuth.certSerial,
"X-CERT-FINGER": request.cf.tlsClientAuth.certFingerprintSHA1,
"X-CERT-VERIFY": request.cf.tlsClientAuth.certVerify,
"X-CERT-NOTBE": request.cf.tlsClientAuth.certNotBefore,
"X-CERT-NOTAF": request.cf.tlsClientAuth.certNotAfter,
};