Page contents
Úvod
Dokumentace TeskaLabs SeaCat PKI¶
Vítejte v dokumentaci TeskaLabs SeaCat PKI.
TeskaLabs SeaCat PKI¶
TeskaLabs SeaCat PKI je produkt kybernetické bezpečnosti pro správu infrastruktury veřejných klíčů (PKI). Tato aplikace je navržena pro vytváření a správu X.509 certifikátů, žádostí o certifikáty (CSR), RSA a EC soukromých klíčů a seznamů odvolaných certifikátů (CRL).
Poskytuje vše, co je potřeba pro provozování certifikační autority (CA).
Vyrobeno s ❤️ od TeskaLabs
TeskaLabs SeaCat PKI je produktem TeskaLabs.
Snímky obrazovky¶
Zde jsou příklady webové aplikace TeskaLabs SeaCat PKI.
Picture: Správa dostupných soukromých klíčů.
Picture: Vytváření nové žádosti o certifikát.
Technická specifikace¶
TeskaLabs SeaCat PKI se skládá z webové aplikace a mikroservisu. Mikroservis poskytuje REST API. Data jsou uložena v databázi MongoDB. TeskaLabs SeaCat PKI může používat různé moduly hardwarové bezpečnosti (HSM) prostřednictvím rozhraní PKCS#11. Uživatelská autentizace se provádí pomocí OAuth 2.0 s protokolem OpenID Connect.
TeskaLabs SeaCat PKI je navržena tak, aby byla provozována jako systém s vysokou dostupností (tj. geograficky distribuovaný cluster). Jednoduché nasazení na jednom uzlu je také možné.
Produkt je multi-tenant, což znamená, že každý nájemce má svá vlastní data (certifikáty, klíče atd.) a může být provozován nezávisle.
Produkt může být nasazen jako on-premises nebo dodán jako služba.
Funkce¶
- 
Obecné
- Webové uživatelské rozhraní
 - Podporované veřejné klíče: RSA, EC
 - Rozhraní PKCS#11 pro moduly hardwarové bezpečnosti (HSM) a soukromé klíče vázané na HSM
 - REST API
 - Multi-tenant: Může provozovat více certifikačních autorit (CA) atd.
 - Vysoká dostupnost
 - Geograficky distribuovaný cluster
 - Vysoký objem operací CA
 
 - 
X.509
 - 
C-ITS Security (ETSI ITS-G5), C-V2X Security (LTE-V2X)
- ETSI TS 103 097 v1.3.1
 - ETSI TS 102 941 v1.3.1
 
 - 
Autentizace a autorizace uživatelů
- OAuth 2.0
 - Protokol OpenID Connect
 - Integrace s Microsoft Active Directory
 - Role-Based Access Control
 
 
Note
TeskaLabs SeaCat PKI je postavena pomocí Python, cryptography.io a OpenSSL
C-ITS Bezpečnost¶
TeskaLabs SeaCat PKI poskytuje podporu pro C-ITS (Kooperativní Inteligentní Dopravní Systémy) bezpečnostní kryptografický systém publikovaný ETSI.
C-ITS Bezpečnost je definována následujícími standardy:
ETSI¶
- ETSI TS 102 941 v1.3.1, v1.2.1 - Bezpečnost; Správa důvěry a soukromí [PDF]
 - ETSI TS 103 097 v1.3.1 - Formáty certifikátů [PDF]
 - ASN.1 specifikace
 
Evropská komise / JRC¶
- C-ITS Politika certifikátů (EU CP)
 - C-ITS Politika bezpečnosti (EU SP)
 
IEEE¶
- IEEE 1609.2-2016 - Bezpečnostní služby pro aplikace a zprávy o správě [placené]
 
Návody
Příručky¶
Tato sekce obsahuje příručky pro používání TeskaLabs SeaCat PKI v různých scénářích.
První kroky¶
Jako první věc byste měli Vytvořit certifikační autoritu, abyste mohli vydávat certifikáty pro své uživatele a zařízení.
Vytvoření certifikační autority¶
Certifikační autorita (CA) je důvěryhodná entita, která vydává digitální certifikáty. Aby se tato důvěra ustanovila, musí mít samotná CA certifikát. Tento certifikát je obvykle samopodepsaný, což znamená, že CA podepisuje svůj vlastní certifikát. Tento samopodepsaný certifikát slouží jako základ důvěry pro všechny certifikáty vydané CA. Bez tohoto samopodepsaného certifikátu by CA nebyla schopna ověřit pravost certifikátů, které vydává, a celá řetěz důvěry by byl přerušen. Proto je vytvoření samopodepsaného certifikátu pro CA zásadním prvním krokem při nastavování infrastruktury veřejných klíčů (PKI).
Požadavky¶
- TeskaLabs SeaCat PKI běží v základním nastavení (SoftHSMv2 nakonfigurován pro aktivního nájemce).
 - Přístup k webovému uživatelskému rozhraní
 
Kroky¶
- 
Přejděte na obrazovku "Certifikáty" > "Vytvořit certifikát"
 - 
Vyplňte formulář
- Vyberte možnost "Vytvořit samopodepsaný certifikát" na kartě "Zdroj"
 - Vyberte možnost "Vygenerovat nový soukromý klíč" v rozbalovacím seznamu "Soukromý klíč"
 - Zadejte název pro soukromý klíč, tj. "Můj soukromý klíč CA"
 - Vyberte "SoftHSM" v rozbalovacím seznamu Poskytovatel soukromého klíče, soukromý klíč bude vygenerován v HSM
 - Vyberte "MySoftHSMToken" v rozbalovacím seznamu Token PKCS#11
 - Vyberte "RSA" v rozbalovacím seznamu Typ klíče
 - Vyberte "4096" v rozbalovacím seznamu Velikost klíče
 - Vyberte "Certifikační autorita" v rozbalovacím seznamu "Použít šablonu"
 - Vyplňte název CA na kartě "Obecné", tj. "Můj CA"
 - Prodloužte platnost certifikátu CA na "Platný do", 10 let je dobrý výchozí čas
 - Vyplňte Obecný název pro CA na kartě "Subjekt", tj. "Můj CA", neváhejte přidat další pole do subjektu
 - Klikněte na tlačítko "Vytvořit" pro vytvoření certifikátu
 
Můžete také upravit další atributy certifikátu podle svých konkrétních potřeb.
 - 
Zkontrolujte vytvořený certifikát CA
Gratulujeme! Vytvořili jste certifikát CA.
Certifikát CA si můžete stáhnout pomocí ikony "Stáhnout" v pravém horním rohu karty.
Nyní můžete vytvořit certifikát pro uživatele nebo zařízení.
 
Schválení žádosti o podepsání certifikátu¶
Žádost o podepsání certifikátu (CSR) je žádost o digitální certifikát od certifikační autority (CA). CSR obsahuje informace o veřejném klíči žadatele, subjektu požadovaného certifikátu a další relevantní detaily. CA tyto informace používá k vygenerování certifikátu, který lze použít k ověření identity žadatele a šifrování dat.
Požadavky¶
- TeskaLabs SeaCat PKI běží v základním nastavení (SoftHSMv2 nakonfigurován pro aktivního nájemce).
 - Přístup k webovému uživatelskému rozhraní
 - CSR vytvořená uživatelem
 - Certifikát CA a soukromý klíč v rámci CA
 
Krok za krokem¶
- 
Přejděte na obrazovku "Import"
Vyplňte formulář:
- Typ importovaného materiálu: "CSR"
 - Formát: "PEM" nebo "DER" podle skutečného formátu souboru CSR
 - Soubor: nahrajte soubor CSR
 
 - 
Zkontrolujte importovaný CSR
Pokud CSR obsahuje správné informace, klikněte na tlačítko "Schválit". CSR můžete také smazat, abyste zrušili žádost.
 - 
Vytvořte certifikát
Na této obrazovce vyplňte:
- Certifikační autoritu do pole "Vydavatel".
 - Stiskněte "Kopírovat žádost o podepsání certifikátu do certifikátu", pokud chcete zkopírovat atributy z CSR
 - Zkontrolujte, změňte nebo přidejte atributy na zbývajících záložkách
 - Stiskněte "Odeslat" pro vytvoření certifikátu
 
 - 
Zkontrolujte vytvořený certifikát
Gratulujeme! Vytvořili jste certifikát.
Certifikát si můžete stáhnout pomocí ikony "Stáhnout" v pravém horním rohu karty.
 
SCEP¶
SeaCat PKI podporuje SCEP, také známý jako Protokol pro jednoduchou registraci certifikátů.
Konfigurace¶
Založte X.509 certifikační autoritu schopnou SCEP.
- 
Zadejte nového nájemce
v
etc/seacatpki.conf:[tenants] ids=TENANT_ROOT_CAPoznámka: Název nájemce (např. "TENANT_ROOT_CA") je libovolný.
 - 
Určete základní URL SeaCat PKI API
export ROOT_CA_URL=http://localhost:8080/TENANT_ROOT_CA - 
Vygenerujte soukromý klíč CA, RSA 4096 (nebo více).
openssl genrsa -out ca-private-key.pem 4096 - 
Nakonfigurujte nájemce a soukromý klíč CA v PKI
v
seacatpki.conf:[tenants] ids=TENANT_ROOT_CA [seacatpki:x509:ca:scep-tenant] # Standardní konfigurace certifikační autority X.509 ca_key=scep-ca-key [seacatpki:private_key:scep-ca-key] keyfile=${THIS_DIR}/ca-private-key.pem tenants=TENANT_ROOT_CA - 
Restartujte SeaCat PKI
 - 
Vygenerujte samopodepsaný certifikát Root CA
Použijte šablonu rootca.json a upravte především název subjektu.
curl -X PUT "${ROOT_CA_URL}/x509/self-signed" \ --header 'Content-Type: application/json' \ -d @rootca.jsonPoznamenejte si
pbidcertifikátu CA pro pozdější použití. - 
Dokončete konfiguraci SeaCat PKI
v
seacatpki.conf:[tenants] ids=scep-tenant [seacatpki:x509:ca:scep-tenant] # Standardní konfigurace certifikační autority X.509 ca_key=scep-ca-key ca_cert=scep-tenant:4fec087429f00360e314894c79f4d6d59405b131624ce70fccb44154641084a743b855d8c5f230ec69f74e04475e5056 # To umožňuje použití SCEP scep=yes [seacatpki:private_key:scep-ca-key] keyfile=${THIS_DIR}/ca-private-key.pem tenants=scep-tenant - 
Restartujte SeaCat PKI
 - 
SCEP povolená X.509 CA je připravena k použití.
 
Zdroje¶
- Protokol pro jednoduchou registraci certifikátů (SCEP) Specifikace, draft-gutmann-scep-16
 - RFC 2315 PKCS #7: Syntaxe kryptografických zpráv
 - RFC 5652 Syntaxe kryptografických zpráv (CMS)
 
Registrace/Obnova certifikátu¶
Postup registrace certifikátu¶
Klient C (také sscep)
Certifikační autorita CA (také SeaCat PKI)  
Cvygeneruje pár soukromého/verejného klíčeCvygeneruje CSR (také Žádost o podepsání certifikátu, PKCS#10)- Přidejte atributy
 - Přidejte veřejný klíč
 - Podepište CSR soukromým klíčem (Proof-of-Possession nebo PoP)
 Codešle CSRCApřes SCEP (žádost je ve formátu PKCS#7, také CMS)CApřijme CSR (přes SCEP rozhraní, včetně PKCS# ověření)CAověří CSRCAuloží CSR do úložiště- V tuto chvíli se 
CAmůže rozhodnout, že schválení bude zpožděno, a vrátíPENDINGC. Proces může být zde obnoven.Cmusí pravidelně kontrolovat stav registrace uCA. CAschválí CSR a tento krok implicitně vytvoří certifikát klienta- Přidejte vybrané atributy z CSR
 - Přidejte veřejný klíč z CSR
 - Podepište nový certifikát svým soukromým klíčem CA
 CAuloží nový certifikát klienta do úložištěCzíská tento certifikát klienta odCA(přes SCEP)Culoží certifikát klienta na místní disk
Poznámka: Proces obnovy je podobný registraci.
Nástroj sscep¶
SSCEP je příkazový řádkový klient pro protokol SCEP.
Může být použit jako klient pro SeaCat PKI.
- 
Nakonfigurujte vstupní bod SCEP pro SeaCat PKI.
% export SCEP_URL="http://example.com/scep-tenant/scep" - 
Získejte certifikát CA
% sscep getca -c ca.cert -u ${SCEP_URL}Uloží certifikát CA do souboru
ca.cert. - 
Připravte CSR
% openssl req -newkey rsa:2048 -sha256 -nodes -out local.csr -keyout local.key -subj "/C=GB/L=London/O=TeskaLabs/OU=SeaCat/CN=example.com"To vytvoří
local.keyalocal.csr. - 
Registrace certifikátu
% sscep enroll -v -k local.key -r local.csr -c ca.cert -l local.cert -t 2 -u ${SCEP_URL} - 
Obnova certifikátu
% sscep enroll -v -k local.key -r local.csr -c ca.cert -O local.cert -K local.key -l local.cert -u ${SCEP_URL} 
Podpora SCEP od Apple¶
Apple umožňuje specifikovat profil pro macOS a iOS, který obsahuje specifikace SCEP umožňující automatizovanou registraci zařízení.
Dokumentace:
- Reference profilu konfigurace (Apple, PDF)
 - Profily konfigurace (Online, proměnné pro substituci pro profily)
 
SCEP profil¶
./scep-apple-profile.mobileconfig
Profil je XML soubor. Apple poskytuje nástroj "Apple Configurator 2" pro správu profilů. Profil může být distribuován jako soubor nebo stažen přes HTTP(S) s MIME typem 'application/x-apple-aspen-config'.
TR-069¶
Jak implementovat TR-069, ACS a vzájemnou TLS autentizaci pomocí TeskaLabs SeaCat PKI.
Tento dokument podrobně popisuje, jak implementovat zabezpečenou, vzájemně autentizovanou TLS komunikaci mezi CPE a ACS pro TR-069. Základem této technické specifikace je Technická zpráva "TR-069 CPE WAN Management Protocol Issue: 1 Amendment 6" publikovaná The Broadband Forum.
Podrobně popisuje, jak zaregistrovat CPE pomocí SCEP.
Architektura¶
Poznámky¶
- TR-069 klient na CPE je HTTPS klient
 - ACS je HTTP server
 - NGINX poskytuje ukončení HTTPS a vzájemnou TLS autentizaci
 - SeaCat PKI poskytuje schopnost CA (Certifikační autorita)
 - SCEP klient na CPE používá protokol HTTP/1.0, který je předepsán specifikací SCEP
 
Certifikáty¶
Server CA Certifikát¶
Dlouhodobý (20+ let) X.509 certifikát, který je přednahrán do CPE během výroby. Také nazýván "důvěryhodný kořenový certifikát".
CPE CA Certifikát¶
Dlouhodobý (20+ let) X.509 certifikát, který je stažen do CPE pomocí SCEP nástroje. Certifikační autorita (CA) CPE je provozována SeaCat PKI. Toto je typicky jiný certifikát než Server CA certifikát.
CPE Certifikát¶
Krátkodobý (~ 1 rok) unikátní CPE klientský certifikát, který je generován (registrace) a obnovován během životního cyklu CPE pomocí SCEP. Je generován certifikační autoritou SeaCat PKI, pomocí CPE CA certifikátu, na základě SCEP žádosti z CPE (registrace nebo obnova). Soukromý klíč CPE je generován a uložen na CPE. Také nazýván "klientský certifikát".
Server Certifikát¶
Vydán Server CA na 3 měsíce, pravidelně obnovován.
Podrobné CPE ceremonie pro unikátní CPE klientský certifikát¶
Ceremonie jsou zpracovávány pomocí SCEP.
Registrace¶
Toto je počáteční ceremonie, která získává první klientský certifikát pro CPE.
Spuštěno: Po dostupnosti síťového připojení CPE, může být spuštěno pravidelně.
Předpoklad: CPE nemá klientský certifikát.
- CPE generuje pár soukromého/verejného klíče (CPK)
 - CPE generuje žádost o podepsání certifikátu (CSR) pomocí CPK
 - CPE odesílá CSR na SeaCat PKI přes HTTPS PUT volání (klientský certifikát není potřeba).
 - Odpověď obsahuje Klientský certifikát nebo chybový kód.
 - Pokud dojde k chybě, ceremonie registrace se restartuje po 1 minutě.
 - Klientský certifikát je uložen na trvalém úložišti CPE a používán s CPK pro TR-069 / HTTPS volání na ACS.
 
Podrobnosti CSR:
- Hodnota pole CN v CSR (a klientském certifikátu) MUSÍ být globálně unikátní pro každé CPE. Konkrétně, pole CN MUSÍ dodržovat formát doporučený pro uživatelské jméno/id v TR-069 CPE WAN Management Protocol Issue: 1 Amendment 6 Section 3.4.4.
 
Obnova¶
Toto je pravidelná ceremonie, která obnovuje klientský certifikát, když se blíží konec jeho životního cyklu.
Spuštěno: Po dostupnosti síťového připojení CPE a pravidelně 4x denně.
Předpoklad: CPE má klientský certifikát (i když vypršel).
- CPE kontroluje, zda se klientský certifikát blíží k vypršení nebo již vypršel
 - Pokud klientský certifikát vyprší, CPE generuje nový CSR
 - CPE odesílá CSR na SeaCat PKI přes HTTPS PUT volání (klientský certifikát není potřeba).
 - Odpověď obsahuje Klientský certifikát nebo chybový kód.
 - Pokud dojde k chybě, tato ceremonie se restartuje po 1 minutě, když je klientský certifikát vypršel, nebo po 4 hodinách, když ještě nevypršel.
 - Klientský certifikát je uložen na trvalém úložišti CPE a používán s CPK pro TR-069 / HTTPS volání na ACS.
 
Poznámka: Požadavky na CSR jsou stejné jako pro Registraci.
Poznámka: Ceremonie obnovy je velmi podobná registraci.
Tok komunikace¶
HTTPS/TLS specifikace¶
- TLS v1.2+
 - RSA 2048 pro CPE
 - RSA 4096 pro Server
 - RSA 8192 pro CA
 TLS_RSA_WITH_AES_128_CBC_SHA
Reference¶
- 
RFC 2986
PKCS #10: Specifikace syntaxe žádosti o certifikát
CSR, PKCS#10 - 
TR-069 / CPE WAN Management Protocol
Issue: 1 Amendment 6
The Broadband Forum - 
SCEP: Simple Certificate Enrolment Protocol
Internet Draft
Network Working Group, Internet Engineering Task Force (IETF) 
SeaCat Mutual TLS¶
PKI pro mobilní aplikace a IoT.
Toto je rozšíření SeaCat pro kryptografickou rodinu certifikátů X.509.
Inicializace PKI¶
$ openssl ecparam -name prime256v1 -genkey -noout -out seacat_private_key.pem
[tenants]
ids=TENANT
[seacatpki:private_key:TENANT_seacat_private_key]
tenants=TENANT
keyfile=./TENANT/seacat_private_key.pem
[seacatpki:x509:ca:TENANT]
ca_key=TENANT_seacat_private_key
Poznámka: Předpokládá se, že "TENANT" je název nájemce.
Certifikační autorita klienta¶
curl -X PUT \
  'http://localhost:8080/TENANT/x509/self-signed' \
  -H 'Content-Type: application/json' \
  -d '{
        "serialNumber": 1,
        "subject": {
            "O": "My Org", "CN": "Root CA"
        },
        "validity": {
            "notBefore": "now",
            "notAfter": { "weeks": 1040 }
        },
        "extensions": [
            { "basicConstraints": {
                "CA": true,
                "pathLen": 0
            }, "critical": true } ,
            { "keyUsage": [
                "keyCertSign",
                "cRLSign"
            ] }
        ]
    }'
[tenants]
ids=TENANT
[seacatpki:private_key:TENANT_seacat_private_key]
tenants=TENANT
keyfile=./TENANT/seacat_private_key.pem
[seacatpki:x509:ca:TENANT]
ca_key=TENANT_seacat_private_key
ca_cert=TENANT:18222c51d1c5e96f9a3ceb5b2b739943ce7c0b5e2dcb639c7fd0c1cab06a088f74dfd9988bade47bb18273d039753ef8
seacat=yes
Specifikace SeaCat TLS¶
Vzájemná autentizace TLS/SSL
Certifikační autorita klienta¶
CA se používá k registraci klientů SeaCat a v procesu ověřování klienta během TLS handshake.
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
    Signature Algorithm: ecdsa-with-SHA256
        Issuer: O=TeskaLabs, OU=SeaCat, CN=Devel Root CA
        Validity
            Not Before: Sep 22 00:00:00 2019 GMT
            Not After : Sep 21 23:59:59 2039 GMT
        Subject: O=TeskaLabs, OU=SeaCat, CN=Devel Root CA
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:db:16:df:53:73:9a:b4:22:aa:e9:21:22:0c:de:
                    84:c4:2f:23:1e:eb:86:37:1f:54:7b:6d:b6:47:04:
                    37:e2:fb:b2:34:e1:0f:a2:95:0e:c8:c7:ab:fc:78:
                    fc:ae:9f:78:72:e7:03:d2:19:2f:dd:4c:1e:e3:57:
                    a9:f1:ae:a5:c0
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:TRUE, pathlen:0
            X509v3 Subject Key Identifier:
                75:BD:5E:00:9E:C3:F5:1D:8E:7B:AD:33:C5:C9:0C:E9:79:B8:A7:22
            X509v3 Key Usage:
                Certificate Sign, CRL Sign
    Signature Algorithm: ecdsa-with-SHA256
         30:45:02:20:1c:6e:54:ba:70:a5:46:e0:a4:b0:d3:70:90:ce:
         35:f6:2d:ec:e4:2e:c6:96:91:47:00:1b:d7:30:d7:b8:92:dc:
         02:21:00:c2:88:0c:ac:51:c4:bd:66:44:85:c8:53:84:8e:b3:
         0f:db:37:27:63:ab:d1:7c:dd:5a:1a:c1:02:9a:11:a4:1c
Hlavní body:
- Samopodepsaný (root) certifikát
 - EC Nist P-256 / prime256v1
 - CA:TRUE, pathlen:0
 - Použití klíče: Certificate Sign, CRL Sign
 
Brána¶
- EC Klíč NIST P-256 aka secp256r1 a prime256r1 (P-384 je podporován iOS a Android > 7)
 - Šifry: ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-CHACHA20-POLY1305
 - ID relace povoleno
 - Relace Tickets zakázány
 - Odeslat certifikát CA klienta (z SeaCat PKI)
 - Ověření hloubky: 1
 
Příklad konfigurace z OpenSSL:
openssl s_server -www -accept "*:443" \
    -key seacat_gw.key \
    -cert seacat_gw.cert \
    -Verify 1 \
    -CAfile seacat_client_ca.pem
Poznámka: V tomto příkladu je pokryto pouze ověření klienta.
NGINX jako brána¶
proxy_cache_path seacat_auth.cache keys_zone=seacat_auth:40m max_size=100m;
server {
    listen       80 default_server;
    server_name  _;
    server_tokens off;
    access_log /log/nginx-access.log;
    error_log /log/nginx-error.log;
    # Používáme acme.sh pro certifikát brány
    location /.well-known/acme-challenge/ {
        default_type          text/plain;
        proxy_read_timeout    60;
        proxy_connect_timeout 60;
        proxy_redirect        off;
        proxy_set_header      X-Real-IP $remote_addr;
        proxy_set_header      X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header      X-Forwarded-Proto $scheme;
        proxy_set_header      Host $host;
        proxy_pass            http://acme-sh;
    }
    location / {
        return 301 https://teskalabs.com;
    }
}
server {
    listen 443 default_server ssl http2;
    server_name  _;
    server_tokens off;
    access_log /log/nginx-access-ssl.log;
    error_log /log/nginx-error-ssl.log;
    ssl_certificate /acme.sh/example.com_ecc/fullchain.cer;
    ssl_certificate_key /acme.sh/example.com_ecc/example.com.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDH+AESGCM:ECDH+CHACHA20:ECDH+AES256:DH+AES256:ECDH+AES128:!aNULL:!MD5:!DSS:!AESCCM;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 4h;
    add_header Strict-Transport-Security max-age=31536000;
    # Ověření certifikátů klienta
    ssl_verify_client optional;
    ssl_client_certificate conf.d/seacat_ca.pem;
    # Veřejné API SeaCat PKI
    location /seacat {
        proxy_redirect        off;
        proxy_set_header      X-Real-IP $remote_addr;
        proxy_set_header      X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header      X-Forwarded-Proto $scheme;
        proxy_set_header      Host $host;
        proxy_pass            http://seacatpki:8080/seacat/seacat;
    }
    # Umístění, které je omezeno pouze na autentizované klienty
    location /restricted {
        # Autentizace pomocí SeaCat PKI
        auth_request /_seacat_pki_auth;
        # Nastavit hlavičku X-SeaCat-Identity na základě hodnoty přijaté z volání autentizace SeaCat PKI
        auth_request_set $seacat_identity $upstream_http_x_seacat_identity;
        proxy_set_header X-SeaCat-Identity $seacat_identity;
        #proxy_pass https://restricted.example.com;
        #proxy_ssl_server_name on;
    }
    # Toto je interní autentizační volání na SeaCat PKI pro ověření identity klienta
    location = /_seacat_pki_auth {
        internal;
        proxy_method          PUT;
        proxy_set_header      X-SSL-Client-Verify $ssl_client_verify;
        proxy_set_header      X-Real-IP $remote_addr;
        proxy_set_header      X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header      X-Forwarded-Host $host;
        proxy_set_header      X-Forwarded-Request $request;
        proxy_set_body        "$ssl_client_raw_cert";
        proxy_pass            http://seacatpki:8080/seacat-tenant/seacat/nginx_authenticate;
        # Odpovědi jsou ukládány do cache, aby se snížila zátěž na SeaCat PKI
        proxy_cache           seacat_auth;
        proxy_cache_key       $ssl_client_fingerprint;
        proxy_cache_lock      on;
        proxy_cache_valid     200 360s;
        proxy_ignore_headers  Cache-Control Expires Set-Cookie;
    }
    location / {
        return 301 https://teskalabs.com;
    }
}
Poznámka: Pro více informací viz kapitola docker.
Let's Encrypt pro certifikát brány¶
Certifikát brány (nebo serverový certifikát) může být vydán např. Let's Encrypt.
Je nutné použít klienta acme.sh, protože je potřeba EC klíčový pár (ne RSA).
Příklad z Docker Compose:
docker-compose exec acme-sh acme.sh --standalone --keylength ec-256 --issue -d CHANGEME.seacat.io
Poznámka: Klient certbot má omezenou podporu pro ECC (v zásadě, automatická obnova je velmi složitá).
Je možné použít certbot, ale důrazně to nedoporučujeme.
Klient¶
TODO: Jakýkoli druh pinning certifikátu serveru?
Ověření registrace¶
Toto je REST volání klienta, které SeaCat PKI může provést na externí službu, aby ověřilo, zda může být CR schválen a tím pádem udělena identita SeaCat klientovi.
URL konfigurace jde do položky konfigurace approve
[seacat:seacat]
ca_cert=...
ca_key=...
approve=http://example.com/validate_cr
SeaCat PKI provede POST volání s následujícím tělem:
{
    '_c': '2019-12-13T13:31:11.158000',
    '_id': '...',
    '_m': '2019-12-13T13:31:11.158000',
    '_v': 1,
    'data': '3081f2a0819a800219028119636f6d2e7465736b616c6162732e7365616361742e64656d6f820d3139313231333134333131305a830d3139313231333134333631305aa459a01380072a8648ce3d020181082a8648ce3d03010781420004161ed21a40c02116ff718edd3333e68ef1976627d790548a084fd9dcaee8cb95df5b49a81d403a3ef7a3ba41c662d731fc5ca8523333b02a542411d5953a4ef2a500a10a80082a8648ce3d0403028247304502210086b3c27afb163412a655b89f62a3a969a1d7732857e2598240ae8e61e614b76a022042e159e02c8b5cd7892587f4ad76caf68796197bc58d4204c3dd3c90f6926c4d',
    'family': 'seacat',
    'info': {
        'application': 'com.teskalabs.seacat.demo',
        'identity': 'HDKXPDREZADFK4G2'
    },
    'label': 'HDKXPDREZADFK4G2 (com.teskalabs.seacat.demo)',
    'seacat_application': 'com.teskalabs.seacat.demo',
    'seacat_identity': 'HDKXPDREZADFK4G2',
    'tenant': 'seacat',
    'type': 'cr'
}
Poznámka: Je to ekvivalentní informace k REST volání "Získat meta informace o kryptomateriálu" SeaCat PKI.
Očekávaná odpověď MUSÍ BÝT JSON.
CR bude schválen pouze tehdy, pokud obsah má následující strukturu:
{ "result": "OK" }
Administrace
Cluster¶
TeskaLabs SeaCat PKI může být nasazen jako jediná instance nebo jako cluster. Cluster může být geograficky distribuován pro zajištění vysoké dostupnosti a obnovy po havárii.
Architektura Clustera¶
Diagram architektury ilustruje možnosti nasazení TeskaLabs SeaCat PKI v kontejnerech a zdůrazňuje komponenty zapojené jak v konfiguracích s jedinou instancí, tak v clusterových konfiguracích:
- 
Jediná Instance (Levá strana diagramu):
- Komponenty:
- NGINX: Působí jako reverzní proxy pro zpracování příchozích požadavků a jejich směrování na příslušné služby.
 - Web UI: Poskytuje rozhraní pro správu PKI.
 - SeaCat PKI: Hlavní PKI mikroservis, který vydává a spravuje certifikáty.
 - HSM (Hardware Security Module): Volitelná integrace pro bezpečné ukládání klíčů.
 - MongoDB: Slouží jako databázový backend pro ukládání dat certifikátů a konfigurací.
 
 - Všechny komponenty jsou kontejnerizovány v jediné instanci Docker/Podman, což zajišťuje jednoduchost v nasazení a údržbě.
 
 - Komponenty:
 - 
Clusterová Konfigurace (Pravá strana diagramu):
- Charakteristiky Clustera:
- Komponenty jsou identické s nastavením jediné instance, ale jsou distribuovány napříč více uzly.
 - Více instancí SeaCat PKI a MongoDB zajišťuje redundanci a vysokou dostupnost.
 
 - Geografická Distribuce:
- Uzly v clusteru mohou být nasazeny na různých geografických místech, což umožňuje obnovu po havárii a zlepšuje odolnost proti chybám.
 
 - Synchronizace:
- Instance MongoDB se synchronizují napříč clusterem, aby udržely konzistenci dat.
 - Obsah HSM musí být synchronizován napříč clusterem pomocí nástrojů pro správu HSM.
 
 
 - Charakteristiky Clustera:
 
Obě konfigurace umožňují flexibilní nasazení, aby splnily různé požadavky na škálovatelnost, spolehlivost a výkon.
Kontejnorizace¶
TeskaLabs SeaCat PKI je přátelský k Docker a Podman.
Backendová mikroservis může být nasazena jako kontejner spolu s ostatními komponentami aplikačního ekosystému (NGINX, MongoDB atd.).
Celé kontejnerizované nasazení může být orchestráno pomocí docker compose, Kubernetes a dalších nástrojů pro orchestraci kontejnerů.
Nasazení pomocí docker-compose¶
Použité kontejnery:
mongo: MongoDB databázenginx: NGINX API Gatewayseacatpki: TeskaLabs SeaCat PKI mikroservisacme.sh: acme.sh klient Let's Encrypt (volitelně)
Struktura adresářů¶
docker-compose.yamlconf-nginx/nginx.conf
conf-seacatpki/seacatpki.conf
seacatpki/# Klon Git repozitáře SeaCat PKIdata-mongo/# Trvalá složka pro data Mongo DBlog/# Logovací souboryacme.sh/# Soubory Let's Encrypt / acme.sh
docker-compose.yaml¶
services:
    mongo:
        image: mongo
        volumes:
        - ./data-mongo:/data/db
        - ./log:/log
        networks:
        - seacatpkinet
    nginx:
        image: nginx:latest
        depends_on:
        - seacatpki
        ports:
        - 80:80/tcp
        - 443:443/tcp
        volumes:
        - ./conf-nginx:/etc/nginx/conf.d
        - ./log:/log
        - ./acme.sh:/acme.sh
        networks:
        - seacatpkinet
    seacatpki:
        build: .
        depends_on:
        - mongo
        volumes:
        - ./conf-seacatpki:/conf
        - ./log:/log
        networks:
        - seacatpkinet
    acme-sh:
        image: neilpang/acme.sh
        command: daemon
        volumes:
        - ./acme.sh:/acme.sh
        networks:
        - seacatpkinet
networks:
    seacatpkinet:
        driver: bridge
nginx.conf¶
server {
    listen 80 default_server;
    server_name  _;
    server_tokens off;
    access_log /log/nginx-access.log;
    error_log /log/nginx-error.log;
    location /.well-known/acme-challenge/ {
        default_type          text/plain;
        proxy_read_timeout    60;
        proxy_connect_timeout 60;
        proxy_redirect        off;
        proxy_set_header      X-Real-IP $remote_addr;
        proxy_set_header      X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header      X-Forwarded-Proto $scheme;
        proxy_set_header      Host $host;
        proxy_pass            http://acme-sh;
    }
}
server {
    listen 443 default_server ssl http2;
    server_name  _;
    server_tokens off;
    access_log /log/nginx-access-ssl.log;
    error_log /log/nginx-error-ssl.log;
    ssl_certificate /acme.sh/example.com_ecc/fullchain.cer;
    ssl_certificate_key /acme.sh/example.com_ecc/example.com.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 4h;
    add_header Strict-Transport-Security max-age=31536000;
    location / {
        return 301 https://example.com;
    }
}
Note
Část SSL (443) může být přidána až po vydání certifikátu acme.sh (níže).
seacatpki.conf¶
[asab:storage]
type=mongodb
mongodb_uri=mongodb://mongo:27017/
mongodb_database=seacatpkidb
[web]
listen=0.0.0.0 8080
[logging:file]
path=/log/seacatpki.log
acme.sh¶
Skript acme.sh se používá k získání certifikátu Let's Encrypt.
$ docker-compose exec acme-sh acme.sh \
    --update-account --accountemail you@yourdomain.com
$ docker-compose exec acme-sh acme.sh \
    --standalone --keylength ec-384 --issue -d example.com
Tip
Automatické obnovování je také zajištěno tímto kontejnerem.
Obraz kontejneru¶
Obraz mikroservisu TeskaLabs SeaCat PKI je založen na Alpine Linux. TeskaLabs distribuuje obraz kontejneru prostřednictvím svého soukromého registru kontejnerů.
Obraz kontejneru obsahuje knihovny SoftHSM2 a OpenSSL.
Dockerfile
V kořenovém adresáři repozitáře mikroservisu SeaCat PKI je k dispozici Dockerfile.
Nasazení do LXD kontejneru¶
Nastavení kontejneru¶
1) Spusťte nový LXC kontejner založený na Alpine.
$ lxc launch images:alpine/3.21 seacat-pki
$ lxc exec seacat-pki /bin/ash
2) Nainstalujte požadované balíčky.
V nově spuštěném LXC kontejneru:
$ apk update
$ apk upgrade
$ apk add --no-cache \
  python3 \
  py3-pip \
  libstdc++ \
  openssl
$ apk add --no-cache --virtual buildenv \
  openssh-client \
  git \
  python3-dev \
  libffi-dev \
  openssl-dev \
  gcc \
  g++ \
  swig \
  musl-dev
$ pip3 install --upgrade pip
$ pip3 install --no-cache-dir aiohttp
$ pip3 install --no-cache-dir asn1tools
$ pip3 install --no-cache-dir motor
$ pip3 install --no-cache-dir cryptography
$ pip3 install --no-cache-dir fastjsonschema
$ pip3 install --no-cache-dir asn1crypto
$ pip3 install --no-cache-dir PyKCS11
$ pip3 install --no-cache-dir git+https://github.com/TeskaLabs/asab.git
$ apk del buildenv
$ cd /opt
$ ... nasadit repozitář SeaCat PKI do /opt/seacat-pki ...
$ mkdir /opt/site-xxx
$ vi /opt/site-xxx/seacatpki.conf
3) Vytvořte init.d (autostart) skript.
Název souboru: /etc/init.d/seacatpki
#!/sbin/openrc-run
name="seacatpki"
command="/usr/bin/python3 /opt/seacat-pki/seacat-pki.py -c /opt/site-xxx/seacatpki.conf"
pidfile="/var/run/$SVCNAME.pid"
command_background="yes"
depend() {
    need net
    use dns
}
3) Spusťte službu.
$ rc-service seacatpki start
Reference
HSM
Hardware Security Modules (HSM)¶
TeskaLabs SeaCat PKI podporuje hardwarové bezpečnostní moduly (HSM) s rozhraním PKCS#11.
Konkrétně se HSM používají pro generaci a správu privátních klíčů a také pro generaci náhodných čísel.
Warning
TeskaLabs SeaCat PKI v současnosti podporuje pouze jeden nakonfigurovaný modul PKCS#11, nelze nakonfigurovat více modulů v jedné instanci PKI. Můžete použít více tokenů stejného modulu.
Konfigurace¶
seacatpki.conf:
[seacatpki:pkcs11:<identifikace>]
path=/cesta/k/pkcs11modulu.so
identifikaceje interní název PKCS#11 poskytovatele (např.softhsm2)- 
pathje umístění modulu PKCS#11 v souborovém systému - 
session_persistenceje boolean příznak, který určuje, zda by měla být relace PKCS#11 udržována otevřená po použití (výchozí hodnota jetrue). Některé tokeny uzavírají relaci po použití, takže tento příznak by měl být nastaven nafalsepro takové tokeny. Nastavení tohoto příznaku nafalseovlivní výkon HSM. 
Konfigurace autoskenování¶
Tento přístup znamená, že PKI automaticky prohledá tokeny PKCS#11 na dostupné privátní klíče.
seacatpki.conf:
[seacatpki:pkcs11:<identifikace>]
path=/cesta/k/pkcs11modulu.so
tokens=
    SoftHSMToken1,PIN1,tenant1
    SoftHSMToken2,PIN2,tenant2
    SoftHSMToken3,PIN2,tenant3
    ...
tokensje seznam tokenů v HSM
Každý token je definován následovně:
token_nameje název tokenu (např.SoftHSMToken1)pinje PIN tokenu (např.PIN1)tenantje název nájemce, který má přístup k tokenu (např.tenant1)
Explicitní konfigurace¶
Tento přístup znamená, že PKI použije pouze privátní klíče, které jsou explicitně nakonfigurovány v souboru seacatpki.conf.
[seacatpki:pkcs11:<identifikace>]
path=/cesta/k/pkcs11modulu.so
[seacatpki:private_key:<nazev_klice>]
provider=pkcs11:<identifikace>
tenants=tenant1,tenant2
token_label=SoftHSMToken1
pin=PIN
cka_id=100002
nazev_kliceje interní název privátního klíče (např.my_rsa_key)providerje interní název modulu PKCS#11 (např.softhsm2)tenantsje seznam nájemců, kteří mají přístup k tokenu (např.tenant1,tenant2)token_labelje štítek tokenu (např.SoftHSMToken1)pinje PIN tokenu (např.PIN)cka_idje ID privátního klíče (např.100002)
Požadavky na privátní klíče¶
Privátní klíče umístěné na tokeny PKCS#11 musí splňovat následující požadavky:
CKA_CLASSmusí býtCKO_PRIVATE_KEYCKA_LABELmusí být nastavenCKA_IDmusí být nastaven a unikátní pro každý privátní klíč- Musí existovat exportovatelný veřejný klíč (
CKA_CLASSmusí býtCKO_PUBLIC_KEY) se stejnýmCKA_ID 
SoftHSMv2¶
SoftHSM je softwarový kryptografický úložiště přístupné prostřednictvím rozhraní PKCS#11.
Je emulátorem hardwarového bezpečnostního modulu (HSM), který běží na hlavním CPU.
TeskaLabs SeaCat PKI podporuje SoftHSMv2.
Více na: http://www.softhsm.org
Tip
SoftHSMv2 je k dispozici v TeskaLabs SeaCat PKI kontejnerovém obraze.
Příprava SoftHSM2¶
1) Připravte konfigurační soubor SoftHSM2
softhsm2.conf:
directories.tokendir = ...softhsm/tokens/
objectstore.backend = file
log.level = INFO
Note
directories.tokendir je umístění, kde SoftHSM2 ukládá soukromé klíče a další objekty.
2) Specifikujte umístění konfiguračního souboru SoftHSM2
export SOFTHSM2_CONF=.../softhsm2.conf
Note
Proměnná prostředí SOFTHSM2_CONF musí být nastavena také pro runtime mikroservisu TeskaLabs SeaCat PKI.
3) Inicializujte token
% softhsm2-util --init-token --free --label "MySoftHSMToken"
Slot 0 má volný/neinicializovaný token.
=== SO PIN (4-255 znaků) ===
Zadejte SO PIN: ********
Znovu zadejte SO PIN: ********
=== Uživatelský PIN (4-255 znaků) ===
Zadejte uživatelský PIN: ******
Znovu zadejte uživatelský PIN: ******
Token byl inicializován a je přiřazen ke slotu 1735718982
--free znamená, že bude použit první volný/neinicializovaný token v instanci SoftHSM2.
Uživatelský PIN se používá v konfiguraci tokenu v secatpki.conf.
Danger
label musí být jedinečný název tokenu v instanci SoftHSM2.
Spuštění softhsm2-util v Docker kontejneru
$ docker exec -it 
4) Přidejte modul SoftHSM2 do konfigurace SeaCat PKI
secatpki.conf:
[seacatpki:pkcs11:softhsm2]
path=.../libsofthsm2.so
tokens=
    MySoftHSMToken,<pin>,mytenant
Token "MySoftHSMToken" bude zpřístupněn nájemci "mytenant".
Tip
softhsm2 je interní název poskytovatele a může být zvolen libovolně.
4) Restartujte mikroservis SeaCat PKI
Generování soukromého klíče¶
Soukromé klíče mohou být generovány z webového rozhraní SeaCat PKI nebo pomocí příkazového nástroje pkcs11-tool.
Druhá metoda je popsána zde.
Generování EC soukromého klíče¶
pkcs11-tool --module .../libsofthsm2.so --login --token-label "MySoftHSMToken" --keypairgen --label "ECKey" --id 100001 --key-type EC:brainpoolP384r1
Generování RSA soukromého klíče¶
pkcs11-tool --module .../libsofthsm2.so --login --token-label "MySoftHSMToken" --keypairgen --label "RSAKey" --id 100002 --key-type RSA:2048
Danger
--id je jedinečný identifikátor soukromého klíče v tokenu a musí být poskytnut.
Přidání soukromého klíče SoftHSM2 explicitně¶
Můžete chtít explicitně přidat soukromý klíč do konfigurace SeaCat PKI.
secatpki.conf:
[seacatpki:private_key:softhsm2_key]
provider=pkcs11:softhsm2
tenants=tenant1,tenant2
token_label=MySoftHSMToken
pin=<PIN>
cka_id=100001
Generátor náhodných čísel¶
SoftHSM2 může být použit jako generátor náhodných čísel (RNG) v TeskaLabs SeaCat PKI.
Není to praktické, ale možné.
Inicializujte dedikovaný token pro RNG:
$ softhsm2-util --init-token --free --label "MyRandomNumberGenerator"
secatpki.conf:
[seacatpki:random]
provider=pkcs11:softhsm2
pin=<PIN>
token_label=MyRandomNumberGenerator
Řešení problémů¶
RuntimeError: Chyba inicializace (není inicializováno). Toto by se nikdy nemělo objevit.
Musíte správně nastavit proměnnou prostředí SOFTHSM2_CONF.
YubiHSM 2¶
YubiHSM 2 je malý modul hardwarové bezpečnosti (HSM), který se vejde do USB portu.
Příprava YubiHSM 2¶
1) Připravte konfigurační soubor YubiHSM2
Konfigurační soubor yubihsm2_pkcs11.conf musí být umístěn v pracovním adresáři mikroservisu TeskaLabs SeaCat PKI.
.../yubihsm2_pkcs11.conf:
connector = http://yubihsm:12345
yubihsm je hostitel, který spouští software YubiHSM2.
YubiHSM 2 funguje tak, že hostitel s USB spouští server YubiHSM2, který poskytuje HTTPS API na portu 12345.
2) Konfigurujte SeaCat PKI pro použití tokenu YubiHSM 2
seacatpki.conf:
[seacatpki:pkcs11:yubihsm2]
path=.../yubihsm_pkcs11.dylib
tokens=YubiHSM,0001password,mytenant
pathje umístění knihovny YubiHSM2 PKCS11 (yubihsm_pkcs11.dylibneboyubihsm_pkcs11.so).tokensje konfigurace instance YubiHSM2:- YubiHSM je název tokenu
 0001passwordje PIN (změňte ho na svůj vlastní)mytenantje nájemce, který má přístup k tokenu YubiHSM 2
Warning
YubiHSM2 nabízí jediný token s názvem "YubiHSM".
3) Restartujte mikroservis SeaCat PKI
Generátor náhodných čísel¶
YubiHSM 2 může být použit jako generátor náhodných čísel (RNG) v TeskaLabs SeaCat PKI.
secatpki.conf:
[seacatpki:random]
provider=pkcs11:yubihsm2
token_label=YubiHSM
YubiKey¶
Token YubiKey může být také použit jako "chudý" hardwarový bezpečnostní modul (HSM) v TeskaLabs SeaCat PKI.
secatpki.conf:
[seacatpki:pkcs11:yubikey]
path=/usr/local/lib/libykcs11.dylib
tokens=
    YubiKey PIV #xxxxxx,<PIN>,mytenant
session_persistence=false
Danger
session_persistence musí být nastaven na false pro token YubiKey.
Utimaco CryptoServer CP5¶
TeskaLabs SeaCat PKI podporuje rodinu HSM Utimaco CryptoServer CP5.
p11-kit¶
p11-kit je proxy PKCS#11 modul.
Tento p11-kit proxy modul funguje jako normální PKCS#11 modul, ale interně načítá předkonfigurovanou sadu PKCS#11 modulů a spravuje jejich funkce, jak bylo popsáno dříve.
Každý slot v konfigurovaných modulech je vystaven jako slot p11-kit proxy modulu.
V podstatě umožňuje kombinovat více PKCS#11 modulů (tj. HSM) pro použití najednou.
TeskaLabs SeaCat PKI podporuje p11-kit.
Více na: p11-glue.github.io (Manual), konkrétně "Proxy Module".
p11-kit konfigurace¶
Každý modul je konfigurován pomocí specializovaného konfiguračního souboru v adresáři pkcs11/modules/.
Jednoduchý příklad:
/opt/local/etc/pkcs11/modules/softhsm2:
module: /opt/local/lib/softhsm/libsofthsm2.so
Konfigurace jednoduše obsahuje cestu k podkladovému PKCS#11 modulu, v tomto případě je to SoftHSM2.
Generátory náhodných čísel¶
TeskaLabs SeaCat PKI používá výchozí software generátory náhodných čísel (RNG), konkrétně Python modul secrets, respektive funkce OpenSSL RNG.
TeskaLabs SeaCat PKI také podporuje hardwarové generátory náhodných čísel (RNG) prostřednictvím PKCS#11.
Warning
Hardwarové RNG se používají pouze pro určité kryptografické operace, např. generování klíčů.
Softwarové klíče (pokud se používají) jsou generovány pomocí softwarového RNG.
Konfigurace poskytovatele RNG PKCS#11¶
Úryvek z seacatpki.conf:
[seacatpki:pkcs11:myhsm]
path=/usr/lib/softhsm/myhsm.dylib
[seacatpki:random]
provider=pkcs11:myhsm
token_label=RNGToken
pin=<PIN>
providerje identifikace poskytovatele, předponapkcs11:znamená, že poskytovatel je PKCS#11 tokentoken_labelje štítek tokenu v rámci poskytovatelepinje PIN tokenu (volitelné, pokud je token již nakonfigurován)
Tip
Vyhrazený PKCS#11 token pro generátor náhodných čísel je doporučen.
C-ITS Security
Nastavení C-ITS bezpečnostní PKI¶
Note
Technické standardy: ETSI TS 102 941 v1.3.1, v1.2.1 & ETSI TS 103 097 v1.3.1
Tip
Šablony pro certifikáty, žádosti o certifikáty, CTL a CRL jsou ve složce templates.
Vygenerování certifikátu kořenové CA¶
Předpoklad: SeaCat PKI je nainstalováno, nakonfigurováno a zastaveno.
- 
Zadejte nového nájemce
Přidejte
TENANT_ROOT_CAdo nájemců, vyberte popisný název pouze malými písmeny ASCII vetc/seacatpki.conf:[tenants] ids=TENANT_ROOT_CA - 
Určete základní URL API SeaCat PKI
export ROOT_CA_URL=http://localhost:8080/TENANT_ROOT_CA - 
Vygenerujte pár soukromého/verejného klíče kořenové CA
Vyberte jednu z následujících EC křivek:
Brainpool P-386 (
brainpoolP384r1)openssl ecparam -name brainpoolP384r1 -genkey -noout -out root-ca-private-key.pemVarianta PKCS#11:
pkcs11-tool --module ... --login --keypairgen --id 10001 --key-type EC:brainpoolP384r1Brainpool P-256 (
brainpoolP256r1)openssl ecparam -name brainpoolP256r1 -genkey -noout -out root-ca-private-key.pemNIST P-256 (
prime256v1,secp256r1)openssl ecparam -name prime256v1 -genkey -noout -out root-ca-private-key.pemPoznámka: Můžete sdílet stejný soukromý klíč mezi různými verzemi C-ITS nebo dokonce X.509.
 - 
Přidejte nový soukromý klíč do konfiguračního souboru
v
etc/seacatpki.conf:[seacatpki:private_key:TENANT_ROOT_CA_KEY_NAME] keyfile=${THIS_DIR}/root-ca-private-key.pem tenants=TENANT_ROOT_CA - 
Spusťte SeaCat PKI
 - 
Vytvořte samopodepsaný certifikát kořenové CA
Použijte šablonu rootca.json a upravte, pokud je to potřeba.
curl -X PUT "${ROOT_CA_URL}/cits/rca/self-signed?ca_private_key=TENANT_ROOT_CA_KEY_NAME" \ --header 'Content-Type: application/json' \ -d @templates/rootca.jsonPoznamenejte si hodnotu atributu
pbidz odpovědi, je to veřejný objektový ID nového certifikátu. - 
Zadejte nového nájemce pro důvěryhodnou doménu
Poznámka: Krok důvěryhodné domény může být přeskočen, pokud důvěryhodná doména již existuje.
Přidejte
TENANT_TRUST_DOMAINdo nájemců, vyberte popisný název pouze malými písmeny ASCII vetc/seacatpki.conf:[tenants] ids=TENANT_ROOT_CA TENANT_TRUST_DOMAIN - 
Nastavte důvěryhodnou doménu
v
etc/seacatpki.conf:Důvěryhodná doména EU ECTL TLM L0:
[seacatpki:cits:trust:TENANT_TRUST_DOMAIN] tlm_certificate=https://cpoc.jrc.ec.europa.eu/L0/gettlmcertificate/Příklad prázdné důvěryhodné domény:
[seacatpki:cits:trust:TENANT_TRUST_DOMAIN] ; Toto je prázdná důvěryhodná doména - 
Nakonfigurujte novou kořenovou CA v konfiguračním souboru SeaCat PKI
v
etc/seacatpki.conf:[seacatpki:cits:ca:TENANT_ROOT_CA] certificate=<pbid> trust_domain=<TENANT_TRUST_DOMAIN> # Optional crl_sign=digest/certificate crl_validity_days=<pocet-dni>- Určete 
pbidnově vygenerovaného certifikátu kořenové CA z předchozího kroku. - Pokud je to žádoucí, specifikujte 
crl_sign. Výchozí hodnota (i pokud není specifikována) je pouze otisk (digest) v CRL. - Při potřebě lze konfigurovat výchozí 
crl_validity_days, který určuje počet dní, po které by měl být seznam CRL platný. Je-li dodán, parametr „nextUpdate“ v těle požadavku toto chování přepisuje. 
 - Určete 
 - 
Restartujte SeaCat PKI
 - 
Vytvořte seznam důvěryhodných certifikátů kořenové CA (CTL)
Použijte počáteční šablonu CTL rootca-ctl-init.json a zkopírujte ji do
templates/rootca-ctl.json.DŮLEŽITÉ: Upravte URL kořenové CA DC v souboru.
curl -X PUT --url "${ROOT_CA_URL}/cits/rca/ctl" \ --header 'Content-Type: application/json' \ -d @templates/rootca-ctl-init.json.json - 
Vytvořte seznam odvolání certifikátů kořenové CA (CRL)
Použijte prázdnou počáteční šablonu CRL rootca-crl-init.json a zkopírujte ji do
templates/rootca-crl.json.curl -X PUT --url "${ROOT_CA_URL}/cits/rca/crl" \ --header 'Content-Type: application/json' \ -d @templates/rootca-crl-init.json - 
Kořenová CA je nyní nakonfigurována a dostupná k použití.
 
Vygenerování certifikátu autority pro registraci (EA)¶
- 
Zadejte nového nájemce
v
etc/seacatpki.conf:[tenants] ids=TENANT_SUBCAPoznámka: Můžete znovu použít existujícího nájemce, např. s kořenovou CA. Není možné provozovat více EA v jednom nájemci.
 - 
Určete základní URL API SeaCat PKI
export ROOT_CA_URL=http://localhost:8080/TENANT_ROOT_CA export EA_URL=http://localhost:8080/TENANT_SUBCA - 
Vygenerujte ověřovací soukromý klíč autority pro registraci
Vyberte jednu z následujících EC:
Brainpool P-386 (
brainpoolP384r1)openssl ecparam -name brainpoolP384r1 -genkey -noout -out ea-verification-private-key.pemBrainpool P-256 (
brainpoolP256r1)openssl ecparam -name brainpoolP256r1 -genkey -noout -out ea-verification-private-key.pemNIST P-256 (
prime256v1,secp256r1)openssl ecparam -name prime256v1 -genkey -noout -out ea-verification-private-key.pem - 
Vygenerujte šifrovací soukromý klíč autority pro registraci
Vyberte jednu z následujících EC:
Brainpool P-256 (
brainpoolP256r1)openssl ecparam -name brainpoolP256r1 -genkey -noout -out ea-encryption-private-key.pemNIST P-256 (
prime256v1,secp256r1)openssl ecparam -name prime256v1 -genkey -noout -out ea-encryption-private-key.pem - 
Nakonfigurujte klíče v SeaCat PKI
v
etc/seacatpki.conf:[seacatpki:private_key:TENANT_SUBCA-verification-key] keyfile=${THIS_DIR}/ea-verification-private-key.pem tenants=TENANT_SUBCA [seacatpki:private_key:TENANT_SUBCA-encryption-key] keyfile=${THIS_DIR}/ea-encryption-private-key.pem tenants=TENANT_SUBCA - 
Restartujte SeaCat PKI
 - 
Vygenerujte žádost o certifikát EA CA.
Použijte šablonu ea-cacr.json a upravte. Vyplňte hodnoty
verification_key(TENANT_SUBCA-verification-key) aencryption_key(TENANT_SUBCA-encryption-key).curl -X PUT ${EA_URL}/cits/ea/ca-certificate-request \ --header 'Content-Type: application/json' \ -d @templates/ea-cacr.jsonPoznamenejte si hodnotu atributu
pbidz odpovědi, je to veřejný objektový ID žádosti o certifikát CA. - 
Stáhněte žádost o certifikát CA z EA
curl -o ea-cacr.coer ${EA_URL}/sa/<pbid>Poznámka: Pokud EA a kořenová CA sdílejí stejný nájemce, kroky stahování a nahrávání mohou být přeskočeny.
 - 
Nahrajte žádost o certifikát CA do kořenové CA
curl -X PUT "${ROOT_CA_URL}/sa?family=cits&type=cacr" --upload-file ea-cacr.coerPoznamenejte si
pbid. - 
Schvalte žádost o certifikát EA CA v kořenové CA
Použijte šablonu rootca-ea-cacr-approve.json a upravte.
cacr,ca_certificate.curl -X PUT --url "${ROOT_CA_URL}/cits/rca/approve-ca-certificate-request" \ --header 'Content-Type: application/json' \ -d @templates/rootca-ea-cacr-approve.jsonPoznamenejte si
pbidjakoea_cert_pbid, odkazuje na nově vytvořený certifikát EA. - 
Stáhněte certifikáty z kořenové CA
curl -o ea-cert.coer ${ROOT_CA_URL}/sa/<ea_cert_pbid> curl -o rootca-cert.coer ${ROOT_CA_URL}/cits/dc/getcert/<rca_certificate_digest>Certifikát autority pro registraci je uložen v souboru
ea-cert.coer.Poznámka: Pokud EA a kořenová CA sdílejí stejný nájemce, kroky stahování a nahrávání mohou být přeskočeny.
 - 
Nahrajte certifikáty do autority pro registraci
curl -X PUT "${EA_URL}/sa?family=cits&type=cert" --upload-file rootca-cert.coer curl -X PUT "${EA_URL}/sa?family=cits&type=cert" --upload-file ea-cert.coer - 
Nakonfigurujte autoritu pro registraci
v
etc/seacatpki.conf:[seacatpki:cits:ea:TENANT_SUBCA] certificate=<ea_certificate_pbid> encryption_key=TENANT_SUBCA-encryption-key verification_key=TENANT_SUBCA-verification-key trust_domain=<trust_domain_tenant>Použijte
ea_cert_pbidjako odkaz na certifikát EA z předchozích kroků.encryption_keyaverification_keyjsou odkazy na příslušné soukromé klíče nakonfigurované výše.Volitelně vyplňte také název nájemce, který obsahuje
trust_domain, jehož součástí by měla být tato EA. - 
Přidejte EA do CTL kořenové CA
Použijte šablonu rootca-ctl.json nebo předchozí šablonu CTL a upravte.
curl -X PUT --url "${ROOT_CA_URL}/cits/rca/create-certificate-trust-list" \ --header 'Content-Type: application/json' \ -d @templates/rootca-ctl.jsonÚryvek toho, co přidat do CTL:
... { "add": { "ea": { "eaCertificate": "79C2F0762BC405D9", "aaAccessPoint": "http://pki.seacat.io/etsi-plugtest-bp-ea/cits/ea/authorization-validation", "itsAccessPoint": "http://pki.seacat.io/etsi-plugtest-bp-ea/cits/ea/enrolment" } } } ... - 
Restartujte SeaCat PKI
 
Vygenerování certifikátu autority pro autorizaci (AA)¶
- 
Zadejte nového nájemce
v
etc/seacatpki.conf:[tenants] ids=TENANT_SUBCA - 
Určete základní URL API SeaCat PKI
export ROOT_CA_URL=http://localhost:8080/TENANT_ROOT_CA export AA_URL=http://localhost:8080/TENANT_SUBCA - 
Vygenerujte ověřovací soukromý klíč autority pro autorizaci
Vyberte jednu z následujících EC:
Brainpool P-386 (
brainpoolP384r1)openssl ecparam -name brainpoolP384r1 -genkey -noout -out aa-verification-private-key.pemBrainpool P-256 (
brainpoolP256r1)openssl ecparam -name brainpoolP256r1 -genkey -noout -out aa-verification-private-key.pemNIST P-256 (
prime256v1,secp256r1)openssl ecparam -name prime256v1 -genkey -noout -out aa-verification-private-key.pem - 
Vygenerujte šifrovací soukromý klíč autority pro autorizaci
Vyberte jednu z následujících EC:
Brainpool P-256 (
brainpoolP256r1)openssl ecparam -name brainpoolP256r1 -genkey -noout -out aa-encryption-private-key.pemNIST P-256 (
prime256v1,secp256r1)openssl ecparam -name prime256v1 -genkey -noout -out aa-encryption-private-key.pem - 
Nakonfigurujte klíče v SeaCat PKI
v
etc/seacatpki.conf:[seacatpki:private_key:TENANT_SUBCA-verification-key] keyfile=${THIS_DIR}/aa-verification-private-key.pem tenants=TENANT_SUBCA [seacatpki:private_key:TENANT_SUBCA-encryption-key] keyfile=${THIS_DIR}/aa-encryption-private-key.pem tenants=TENANT_SUBCA - 
Restartujte SeaCat PKI
 - 
Vygenerujte žádost o certifikát AA CA.
Použijte šablonu aa-cacr.json a upravte.
curl -X PUT ${AA_URL}/cits/aa/ca-certificate-request \ --header 'Content-Type: application/json' \ -d @templates/aa-cacr.jsonOdpověď
{ "result": "OK", "pbid": "etsi-plugtest-nist-aa2:d09833dafcdb1b7d44614b28500a2ee2eb50c94a918155023b68b65bd1862bb8", "fingerprint": "d09833dafcdb1b7d44614b28500a2ee2eb50c94a918155023b68b65bd1862bb8" } - 
Stáhněte žádost o certifikát CA z AA
curl -o aa-cacr.coer ${AA_URL}/sa/<pbid>Tím se uloží žádost o certifikát CA do souboru
aa-cacr.coer.Poznámka: Pokud AA a kořenová CA sdílejí stejný nájemce, kroky stahování a nahrávání mohou být přeskočeny.
 - 
Nahrajte žádost o certifikát CA do kořenové CA
curl -X PUT "${ROOT_CA_URL}/sa?family=cits&type=cacr" --upload-file aa-cacr.coerOdpověď:
{ "result": "OK", "pbid": "etsi-plugtest-nist-rca:d09833dafcdb1b7d44614b28500a2ee2eb50c94a918155023b68b65bd1862bb8" }Poznamenejte si
pbidjakocacr_pbid. - 
Schvalte žádost o certifikát AA CA v kořenové CA
Použijte šablonu rootca-aa-cacr-approve.json a upravte.
curl -X 
Technická specifikace nové C-ITS PKI¶
Tento dotazník musí být vyplněn poskytovatelem C-ITS PKI před instalací PKI.
TeskaLabs může poskytnout rozumné výchozí hodnoty, kde je to možné, na základě standardizace a zkušeností s nasazením.
TLM, do kterého bude vlořen nový certifikát Root CA¶
V případě EU TLM by měla být určená úroveň (L0, L1, L2) definována podle protokolu EU TLM CPOC.
Také název certifikátu Root CA má být přidělen CPA CPOC.
Odpověď: __
Poznámka: Tento předpoklad je volitelný, TLM může být přeskočen nebo zaveden později.
Požadované komponenty¶
- Počet certifikačních autorit Root (RCA): __
 - Počet autorit pro registraci (EA): __
 - Počet autorit pro autorizaci (AA): __
 
Typická C-ITS PKI obsahuje 1 RCA, 1 EA a 1 AA.
Počet EA a AA může být rozšířen během životního cyklu PKI.
Název nájemce¶
Může se stát součástí URL PKI.
Odpověď: __
Příklad: croads_cz_l0
Základní URL(s) autorit PKI¶
Odpověď: http://__
Může být stejná pro RCA, EA a AA nebo specifická pro každou komponentu.
Musí začínat http://
Klíčová křivka certifikátu Root CA¶
Vyberte jednu z:
- Brainpool P-386
 - Brainpool P-256
 - NIST P-256
 
Doporučujeme Brainpool P-386.
Certifikát Root CA¶
Použijte přiloženou šablonu JSON rootca.json.
Důležité informace:
- Název certifikátu Root CA, příklad 
0_My-New-Root-CA_L0 
Poznámka: Pokud má být certifikát Root CA zaveden do TLM, musí název vyhovovat požadavkům TLM.
Klíčová křivka pro ověřovací klíč certifikátu EA¶
Vyberte jednu pro ověřovací klíč:
- Brainpool P-386
 - Brainpool P-256
 - NIST P-256
 
Doporučujeme Brainpool P-256.
Klíčová křivka pro šifrovací klíč certifikátu EA¶
Vyberte jednu pro šifrovací klíč:
- Brainpool P-256
 - NIST P-256
 
Doporučujeme Brainpool P-256.
Žádost o certifikát EA¶
Použijte přiloženou šablonu JSON ea-cacr.json.
Důležité informace:
- Název certifikátu EA
 
Klíčová křivka pro ověřovací klíč certifikátu AA¶
Vyberte jednu pro ověřovací klíč:
- Brainpool P-386
 - Brainpool P-256
 - NIST P-256
 
Doporučujeme Brainpool P-256.
Klíčová křivka pro šifrovací klíč certifikátu AA¶
Vyberte jednu pro šifrovací klíč:
- Brainpool P-256
 - NIST P-256
 
Doporučujeme Brainpool P-256.
Žádost o certifikát AA¶
Použijte přiloženou šablonu JSON aa-cacr.json.
Důležité informace:
- Název certifikátu AA
 






