INTEGRITY Dokumentace

Mutual TLS

Ověřování Mutual TLS (mTLS) vyžaduje, aby klient i server během handshake TLS předložili certifikáty. V implementaci Cloudflare Access se nahraná CA používá k ověření klientského certifikátu (ověření serverového certifikátu zajišťuje standardní TLS). Access mTLS slouží dvěma účelům:

Když do Access nahrajete kořenovou certifikační autoritu (CA), projdou pouze požadavky ze zařízení s odpovídajícím klientským certifikátem. Jakmile požadavek dorazí k aplikaci, Access vyzve klienta k předložení certifikátu. Pokud klient nemůže předložit platný certifikát, je požadavek zablokován. Pokud klient předloží platný certifikát, Access dokončí výměnu klíčů za účelem ověření.

diagram mTLS handshake

Vynucujte ověřování mTLS

Předpoklady

Přidejte mTLS do své aplikace Access

  1. V Cloudflare dashboard, přejděte na Zero Trust > Řízení přístupu > Přihlašovací údaje služby > Mutual TLS.

  2. Vyberte Add mTLS Certificate.

  3. Zadejte libovolný název kořenové CA.

  4. V Obsah certifikátu, vložte obsah vaší kořenové CA.

    Pokud je klientský certifikát podepsán přímo kořenovou CA, stačí nahrát pouze kořenový certifikát. Pokud je klientský certifikát podepsán mezilehlým certifikátem, musíte nahrát celý řetězec CA (mezilehlý i kořenový certifikát). Například:

    -----BEGIN CERTIFICATE-----
    <intermediate.pem>
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    <rootCA.pem>
    -----END CERTIFICATE-----

    Nezahrnujte žádné serverové certifikáty SSL/TLS. Access k ověření připojení mezi zařízením uživatele a Cloudflare používá pouze řetěz CA.

  5. V Přiřazené hostname, zadejte plně kvalifikované názvy domén (FQDN), které budou tento certifikát používat.

    Tyto FQDN budou hostitelské názvy použité pro prostředky chráněné v Zásada Access. Kořenovou CA musíte přiřadit k FQDN, které používá chráněná aplikace.

  6. Uložte zásadu.

  7. Přejděte na Řízení přístupu > Zásady.

  8. Vytvořit zásadu Access pomocí jednoho z následujících selektory:

    • Platný certifikát: Jakýkoli klientský certifikát, který se dokáže ověřit vůči Root CA, bude moci pokračovat.
    • Obecný název: Pokračovat budou moci pouze klientské certifikáty se specifickým common name.
  9. Pokud je to pro klienta, který se nepotřebuje přihlašovat přes IdP, nastavte zásadu Akce na Service Auth.

    Příklad zásady mTLS

    Akce Typ pravidla Selektor Hodnota
    Service Auth Include Obecný název John Doe
  10. Uložte zásadu a poté přejděte na Řízení přístupu > Aplikace.

  11. Vyberte aplikaci, na které chcete vynutit mTLS, a vyberte Konfigurovat. Aplikace musí být zahrnuta v Přiřazené hostname seznam z kroku 5.

  12. V Zásady kartě přidejte zásadu mTLS.

  13. Uložte aplikaci.

K aplikaci se nyní můžete ověřit pomocí klientského certifikátu. Postup předložení klientského certifikátu najdete v Testování mTLS.

Testování mTLS

Otestujte pomocí cURL

Testování aplikace chráněné zásadou mTLS:

  1. Nejprve zkuste načíst web příkazem curl bez klientského certifikátu. Tento příklad příkazu curl platí pro web example.com která má Aplikace a zásada Access nastavena pro https://auth.example.com:

    curl -sv https://auth.example.com

    Bez klientského certifikátu v požadavku 403 forbidden se zobrazí odpověď a stránka není dostupná.

  2. Nyní do požadavku přidejte svůj klientský certifikát a klíč:

    curl -sv https://auth.example.com --cert example.pem --key key.pem

Po úspěšném dokončení procesu autentizace se zobrazí CF_Authorization Set-Cookie hlavička se vrátí v odpovědi.

Otestujte v prohlížeči

Pro přístup k aplikaci chráněné mTLS v prohlížeči musí být klientský certifikát importován do správce certifikátů prohlížeče. Postup se liší podle prohlížeče. Prohlížeč může používat kořenové úložiště operačního systému nebo své vlastní interní důvěryhodné úložiště.

Následující příklad ukazuje, jak přidat klientský certifikát do systémového keychainu macOS:

  1. Přejděte do adresáře obsahujícího klientský certifikát a klíč.
    1. Otevřete client.pem soubor v Keychain Access. Pokud budete vyzváni, zadejte své lokální heslo.
    2. V Keychain, zvolte možnost přístupu, která vyhovuje vašim potřebám, a vyberte Přidat.
    3. V seznamu certifikátů najděte nově nainstalovaný certifikát. Aplikace Keychain Access ho označí jako nedůvěryhodný. Klikněte na certifikát pravým tlačítkem a vyberte Získání informací.
    4. Vyberte Důvěra. V části Při použití tohoto certifikátu, vyberte Always Trust.

Pokud váš prohlížeč používá systémové úložiště macOS, můžete se nyní přes prohlížeč připojit k aplikaci mTLS.

Vygenerujte certifikáty mTLS

K generování certifikátů pro testování funkce mTLS v Cloudflare Access můžete použít open source nástroje pro infrastrukturu soukromých klíčů (PKI).

OpenSSL

Tato část se zabývá tím, jak používat OpenSSL a vygenerovat kořenový a mezilehlý certifikát a poté vydat klientské certifikáty, které se mohou ověřit vůči řetězu CA.

Vygenerujte kořenovou CA

  1. Vygenerujte soukromý klíč kořenové CA:

     openssl genrsa -aes256 -out rootCA.key 4096

    Až budete vyzváni, zadejte heslo, které se použije s rootCA.key.

  2. Vytvořte samopodepsaný kořenový certifikát s názvem rootCA.pem:

    openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.pem

    Zobrazí se výzva k zadání hesla soukromého klíče a k vyplnění několika volitelných polí. Pro účely testování můžete volitelná pole nechat prázdná.

Vygenerujte mezilehlý certifikát

  1. Vygenerujte soukromý klíč mezilehlé CA:

     openssl genrsa -aes256 -out intermediate.key 4096

    Až budete vyzváni, zadejte heslo, které se použije s intermediate.key.

  2. Vytvořte žádost o podepsání certifikátu (CSR) pro mezilehlý certifikát:

    openssl req -new -sha256 -key intermediate.key -out intermediate.csr

    Zobrazí se výzva k zadání hesla soukromého klíče a k vyplnění několika volitelných polí. Pro účely testování můžete volitelná pole nechat prázdná.

  3. Vytvořte soubor CA Extension s názvem v3_intermediate_ca.ext. Například,

    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    basicConstraints = critical, CA:true
    keyUsage = critical, cRLSign, keyCertSign

    Ujistěte se, že basicConstraints zahrnuje CA:true vlastnost. Tato vlastnost umožňuje, aby mezilehlý certifikát fungoval jako CA a podepisoval klientské certifikáty.

  4. Podepište mezilehlý certifikát pomocí kořenové CA:

     openssl x509 -req -in intermediate.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out intermediate.pem -days 1825 -sha256 -extfile v3_intermediate_ca.ext

Vytvořte soubor s řetězem CA

  1. Zkombinujte mezilehlý a kořenový certifikát do jednoho souboru:

    cat intermediate.pem rootCA.pem > ca-chain.pem

    Mezilehlý certifikát by měl být na začátku souboru, následovaný certifikátem, kterým byl podepsán.

  2. Nahrajte obsah ca-chain.pem ke Cloudflare Access. Pokyny naleznete v Přidejte mTLS do své aplikace Access.

Vygenerujte klientský certifikát

  1. Vygenerujte soukromý klíč pro klienta:

     openssl genrsa -out client.key 2048
  2. Vytvořte CSR pro certifikát klienta:

    openssl req -new -key client.key -out client.csr

    Zobrazí se výzva k vyplnění několika volitelných polí. Pro účely testování můžete nastavit Obecný název na něco jako John Doe.

  3. Podepište klientský certifikát mezilehlým certifikátem:

     openssl x509 -req -in client.csr -CA intermediate.pem -CAkey intermediate.key -CAcreateserial -out client.pem -days 365 -sha256
  4. Ověřte klientský certifikát vůči certifikačnímu řetězu:

    openssl verify -CAfile ca-chain.pem client.pem
    client.pem: OK

Nyní můžete použít klientský certifikát (client.pem) a jeho klíč (client.key) na testování mTLS.

Cloudflare PKI

Tento návod používá Sada nástrojů PKI od Cloudflare a vygenerovat kořenovou CA a klientské certifikáty ze souborů JSON.

1. Nainstalujte závislosti

Proces vyžaduje dva balíčky ze sady nástrojů Cloudflare PKI:

Tyto balíčky můžete nainstalovat z GitHub repozitář Cloudflare SSL. Budete potřebovat funkční instalaci Go verze 1.12 nebo novější. Případně můžete stáhnout balíčky přímo. Postupujte podle pokynů v části Installation a nainstalujte toolkit. Ujistěte se, že jste nainstalovali všechny nástroje, které toolkit obsahuje.

2. Vygenerujte kořenovou CA

  1. Vytvořte nový adresář pro uložení kořenové CA.

  2. V tomto adresáři vytvořte dva nové soubory:

    • CSR. Vytvořte soubor s názvem ca-csr.json a přidejte následující blok JSON, poté soubor uložte.

      {
      	"CN": "Access Testing CA",
      	"key": {
      		"algo": "rsa",
      		"size": 4096
      	},
      	"names": [
      		{
      			"C": "US",
      			"L": "Austin",
      			"O": "Access Testing",
      			"OU": "TX",
      			"ST": "Texas"
      		}
      	]
      }
    • konfigurace. Vytvořte soubor s názvem ca-config.json a přidejte následující blok JSON, poté soubor uložte.

      {
      	"signing": {
      		"default": {
      			"expiry": "8760h"
      		},
      		"profiles": {
      			"server": {
      				"usages": ["signing", "key encipherment", "server auth"],
      				"expiry": "8760h"
      			},
      			"client": {
      				"usages": ["signing", "key encipherment", "client auth"],
      				"expiry": "8760h"
      			}
      		}
      	}
      }
  3. Nyní spusťte následující příkaz a vygenerujte kořenovou CA pomocí těchto souborů.

    cfssl gencert -initca ca-csr.json | cfssljson -bare ca
  4. Příkaz vypíše kořenový certifikát (ca.pem) a jeho klíč (ca-key.pem).

    ls
    ca-config.json ca-csr.json ca-key.pem ca.csr  ca.pem
  5. Nahrajte obsah ca.pem ke Cloudflare Access. Pokyny naleznete v Přidejte mTLS do své aplikace Access.

3. Vygenerujte certifikát klienta

Chcete-li vygenerovat klientský certifikát, který se bude ověřovat vůči nahrané kořenové CA:

  1. Vytvořte soubor s názvem client-csr.json a přidejte následující blok JSON:

    {
    	"CN": "James Royal",
    	"hosts": [""],
    	"key": {
    		"algo": "rsa",
    		"size": 4096
    	},
    	"names": [
    		{
    			"C": "US",
    			"L": "Austin",
    			"O": "Access",
    			"OU": "Access Admins",
    			"ST": "Texas"
    		}
    	]
    }
  2. Nyní pomocí následujícího příkazu vygenerujte klientský certifikát pomocí Cloudflare PKI toolkitu:

    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem  -config=ca-config.json -profile=client client-csr.json | cfssljson -bare client

Příkaz vypíše soubor klientského certifikátu (client.pem) a jeho klíč (client-key.pem). Tyto soubory nyní můžete použít k testování mTLS.

Vytvořte seznam odvolaných certifikátů

Pomocí sady nástrojů Cloudflare PKI můžete také vygenerovat seznam odvolaných certifikátů (CRL). Tento seznam bude obsahovat odvolané klientské certifikáty.

  1. Získejte sériové číslo z dříve vygenerovaného klientského certifikátu. Toto sériové číslo, případně další čísla, která chcete odvolat, přidejte v hexadecimálním formátu do textového souboru. Tento příklad používá soubor s názvem serials.txt.

  2. Vytvořte CRL pomocí následujícího příkazu.

    cfssl gencrl serials.txt ../mtls-test/ca.pem ../mtls-test/ca-key.pem | base64 -D > ca.crl

Budete muset přidat CRL na svůj server nebo vynutit odvolání ve Cloudflare Workeru. Ukázkový Worker Script najdete na Repozitář Cloudflare na GitHubu.

Přidání hlaviček Client-Cert a Client-Cert-Chain (RFC 9440)

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:

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.

Bezpečnostní aspekty

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:

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ů.

Omezení velikosti

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:

Příklady Transform Rules

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.

Pravidlo 1: odebrání hlavičky Client-Cert

Toto pravidlo bezpodmínečně odstraňuje jakýkoli Client-Cert hlavičku odeslanou klientem.

Text v Expression Editor:

true

Vybraná operace v části Úprava hlavičky požadavku: Odebrat

Název hlavičky: Client-Cert

Pravidlo 2: odebrání hlavičky Client-Cert-Chain

Toto pravidlo bezpodmínečně odstraňuje jakýkoli Client-Cert-Chain hlavičku odeslanou klientem.

Text v Expression Editor:

true

Vybraná operace v části Úprava hlavičky požadavku: Odebrat

Název hlavičky: Client-Cert-Chain

Pravidlo 3: nastavení hlavičky Client-Cert

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_large

Vybraná operace v části Úprava hlavičky požadavku: Nastavit dynamické

Název hlavičky: Client-Cert

Hodnota: cf.tls_client_auth.cert_rfc9440

Pravidlo 4: nastavení hlavičky Client-Cert-Chain

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_large

Vybraná 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

Cloudflare Workers

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.

Předání klientského certifikátu (starší verze)

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.

Cloudflare API

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

Alespoň jeden z následujících oprávnění tokenu je povinné:
Aktualizace nastavení hostname certifikátu mTLS
curl "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:

Managed Transforms

Můžete také upravte hlavičky odpovědí HTTP pomocí Managed Transforms a předejte tak Hlavičky ověřování klienta TLS.

Cloudflare Workers

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,
};

Známá omezení

mTLS aktuálně nefunguje pro:

Oznámení pro certifikáty mutual TLS

Cloudflare odešle následující oznámení než vyprší platnost vašich certifikátů mutual TLS:

Upozornění na vypršení platnosti certifikátu mTLS pro Access

Pro koho je určeno?

Access zákazníkům, kteří používají klientské certifikáty pro vzájemné ověřování TLS. Toto oznámení se odešle 30 a 14 dní před vypršením platnosti certifikátu.

Další možnosti / filtry

Žádné.

Zahrnuto v

Nákup Access a/nebo Cloudflare for SaaS.

Co dělat, když upozornění obdržíte?

Nahrajte obnovený certifikát.