~~NOTOC~~
====== Scenarij 1.1: Ustvarjanje korenskega CA s PQ ključi ======
**Kategorija:** [[.:start|PKI infrastruktura]] \\
**Kompleksnost:** ⭐⭐⭐⭐ (Visoka) \\
**Predpogoji:** Brez (vstopna točka) \\
**Predviden čas:** 15-30 minut
----
===== Opis =====
Ta scenarij opisuje ustvarjanje **samopodpisanega korenskega CA** s postkvantnimi ključi. Korenski CA tvori **sidro zaupanja (Trust Anchor)** za celotno PKI hierarhijo in je varnostno najkritičnejši element infrastrukture.
**Kaj se ustvari:**
* Par ključev ML-DSA-65 (postkvantno varen)
* Samopodpisan X.509 v3 korenski certifikat
* Šifriran zasebni ključ (PKCS#8 z Argon2id)
**Primeri uporabe:**
* Vzpostavitev nove PQ-zmožne Enterprise PKI
* Migracija obstoječe PKI na postkvantne algoritme
* Testno okolje za PQ certifikate
* Izolirana PKI za posebne aplikacije (IoT, podpisovanje kode)
----
===== Diagram poteka =====
┌─────────────────────────────────────────────────────────────────┐
│ USTVARJANJE KORENSKEGA CA │
└─────────────────────────────────────────────────────────────────┘
┌──────────────┐
│ 1. Init │
│ Knjižnica │
└──────┬───────┘
│
▼
┌──────────────┐
│ 2. KeyPair │ ──────► ML-DSA-65 (FIPS 204)
│ generiranje │ ~4KB javni ključ
└──────┬───────┘ ~2KB zasebni ključ
│
▼
┌──────────────┐
│ 3. DN │ ──────► CN=WvdS Root CA
│ ustvarjanje │ O=DATECpro GmbH
└──────┬───────┘ C=SI
│
▼
┌──────────────┐
│ 4. Serial │ ──────► 20 bajtov naključno (160 bit)
│ generiranje │
└──────┬───────┘
│
▼
┌──────────────┐
│ 5. Veljavnost│ ──────► notBefore: zdaj
│ določitev │ notAfter: +20 let
└──────┬───────┘
│
▼
┌──────────────┐
│ 6. Razširitve│ ──────► BasicConstraints: CA=true, pathLen=1
│ nastavitev │ KeyUsage: keyCertSign, cRLSign
└──────┬───────┘ SKI: SHA-256(publicKey)
│
▼
┌──────────────┐
│ 7. Certifikat│ ──────► Subject = Issuer (samopodpisan)
│ ustvarjanje │ Podpis z ML-DSA-65
└──────┬───────┘
│
▼
┌──────────────┐
│ 8. Izvoz │ ──────► root-ca.crt.pem (certifikat)
│ PEM │ root-ca.key.pem (šifriran)
└──────┬───────┘
│
▼
┌──────────────┐
│ 9. Čiščenje │ ──────► Sprostitev ročajev
│ │ Brisanje skrivnosti
└──────────────┘
----
===== Primer kode =====
=== C# (.NET Wrapper) ===
using System;
using System.IO;
using WvdS.Security.Cryptography.X509Certificates.Extensions.PQ;
namespace RootCaExample
{
class Program
{
static void Main(string[] args)
{
// Geslo za zasebni ključ (v produkciji: varno vnašanje!)
string keyPassword = "MyStr0ng!RootCA#Password2024";
// 1. Inicializacija konteksta
using var context = PqCryptoContext.Initialize();
// 2. Generiranje para ključev ML-DSA-65
Console.WriteLine("Generiram par ključev ML-DSA-65...");
using var keyPair = context.GenerateKeyPair(PqAlgorithm.MlDsa65);
// Izvedba samopreizkusa
if (!keyPair.SelfTest())
throw new CryptographicException("Samopreizkus para ključev ni uspel!");
Console.WriteLine($" Javni ključ: {keyPair.PublicKeySize} bajtov");
Console.WriteLine($" Zasebni ključ: {keyPair.PrivateKeySize} bajtov");
// 3. Ustvarjanje Distinguished Name
var subjectDn = new DistinguishedNameBuilder()
.AddCommonName("WvdS Root CA")
.AddOrganization("DATECpro GmbH")
.AddOrganizationalUnit("PQ-Security")
.AddCountry("SI")
.AddLocality("Ljubljana")
.Build();
Console.WriteLine($"Subject DN: {subjectDn}");
// 4. Obdobje veljavnosti (20 let za korenski CA)
var validity = new CertificateValidity(
notBefore: DateTime.UtcNow,
notAfter: DateTime.UtcNow.AddYears(20)
);
// 5. Razširitve za korenski CA
var extensions = new X509ExtensionsBuilder()
// BasicConstraints: CA=true, največ 1 vmesna raven
.AddBasicConstraints(isCa: true, pathLengthConstraint: 1, critical: true)
// KeyUsage: samo podpisovanje certifikatov in CRL
.AddKeyUsage(
KeyUsageFlags.KeyCertSign | KeyUsageFlags.CrlSign,
critical: true
)
// Subject Key Identifier za kasnejše sklicevanje AKI
.AddSubjectKeyIdentifier(keyPair)
.Build();
// 6. Ustvarjanje korenskega certifikata (samopodpisan)
Console.WriteLine("Ustvarjam samopodpisan korenski certifikat...");
using var rootCert = context.CreateRootCertificate(
keyPair: keyPair,
subject: subjectDn,
validity: validity,
extensions: extensions
);
// 7. Izpis informacij o certifikatu
Console.WriteLine("\n=== KORENSKI CA CERTIFIKAT ===");
Console.WriteLine($"Subject: {rootCert.Subject}");
Console.WriteLine($"Issuer: {rootCert.Issuer}");
Console.WriteLine($"Serial: {rootCert.SerialNumber}");
Console.WriteLine($"Veljavno od: {rootCert.NotBefore:yyyy-MM-dd HH:mm:ss} UTC");
Console.WriteLine($"Veljavno do: {rootCert.NotAfter:yyyy-MM-dd HH:mm:ss} UTC");
Console.WriteLine($"Algoritem: {rootCert.SignatureAlgorithm}");
Console.WriteLine($"Prstni odtis: {rootCert.Thumbprint}");
Console.WriteLine($"Je CA: {rootCert.IsCertificateAuthority}");
Console.WriteLine($"Dolžina poti: {rootCert.PathLengthConstraint}");
// 8. Shranjevanje kot PEM datoteke
string certPath = "root-ca.crt.pem";
string keyPath = "root-ca.key.pem";
// Certifikat (javni)
File.WriteAllText(certPath, rootCert.ExportToPem());
Console.WriteLine($"\nCertifikat shranjen: {certPath}");
// Zasebni ključ (šifriran z Argon2id)
File.WriteAllText(keyPath, keyPair.ExportToEncryptedPem(
password: keyPassword,
kdfAlgorithm: KeyDerivationAlgorithm.Argon2id
));
Console.WriteLine($"Zasebni ključ shranjen: {keyPath} (šifriran)");
// 9. Validacija: ponovna naložitev certifikata in preverjanje
Console.WriteLine("\n=== VALIDACIJA ===");
using var loadedCert = context.LoadCertificateFromPem(File.ReadAllText(certPath));
using var loadedKey = context.LoadKeyPairFromEncryptedPem(
File.ReadAllText(keyPath),
keyPassword
);
// Preverjanje samopodpisa
bool signatureValid = loadedCert.VerifySignature(loadedCert); // samopodpisan
Console.WriteLine($"Samopodpis veljaven: {signatureValid}");
// Preverjanje pripadnosti para ključev
bool keyMatch = loadedCert.PublicKeyMatches(loadedKey);
Console.WriteLine($"Ujemanje javnega ključa: {keyMatch}");
Console.WriteLine("\n✓ Korenski CA uspešno ustvarjen!");
}
}
}
----
===== Varnostna opozorila =====
**KRITIČNO – Zasebni ključ korenskega CA:**
Zasebni ključ korenskega CA je **varnostno najkritičnejši element** celotne PKI. Kompromitacija pomeni popolno izgubo zaupanja!
* **Nikoli** ne generirajte ali shranjujte na omrežnih sistemih
* **Nikoli** ne shranjujte nešifrirano
* **Nikoli** ne prenašajte po e-pošti ali nezaščitenih kanalih
**Priporočeni zaščitni ukrepi:**
* **Air-Gapped sistem:** Operacije korenskega CA na izoliranem računalniku brez omrežja
* **HSM:** Hardware Security Module za shranjevanje ključev (npr. YubiHSM, Thales Luna)
* **Šifriranje:** Najmanj AES-256 z močnim geslom (≥20 znakov)
* **Fizična varnost:** Šifriran USB ključ v sefu ali bančnem trezorju
* **Varnostna kopija:** Najmanj 2 kopiji na ločenih lokacijah
* **Key Ceremony:** Dokumentiran proces s pričami za vse operacije korenskega CA
* **Revizijski dnevnik:** Beleženje vseh dostopov
**Najboljše prakse:**
* **ML-DSA-65** ponuja dobro razmerje varnost/zmogljivost za korenske CA
* **pathLength=1** omejuje hierarhijo na Root → Intermediate → End-Entity
* **20 let veljavnosti** je običajno za korenske CA (priporočeno največ 25 let)
* **Nastavitev SKI** omogoča kasnejše sklicevanje AKI v vmesnih certifikatih
* **Samopreizkus** po generiranju zagotavlja pravilno implementacijo
----
===== Povezani scenariji =====
^ Povezava ^ Scenarij ^ Opis ^
| **Naslednji korak** | [[.:intermediate_ca_erstellen|1.2 Vmesni CA]] | Podpis podrejenega CA s korenskim |
| **Nato** | [[.:trust_store_konfigurieren|1.4 Shramba zaupanja]] | Distribucija korenskega certifikata |
| **Nato** | [[.:crl_ocsp_infrastruktur|1.6 CRL/OCSP]] | Vzpostavitev storitev preklica |
| **Alternativno** | [[sl:int:pqcrypt:szenarien:schluessel:generierung|11.1 Generiranje ključev]] | Samo ključi, brez certifikata |
| **Povezano** | [[sl:int:pqcrypt:szenarien:schluessel:speicherung|11.2 Hramba ključev]] | Dodatne možnosti shranjevanja |
----
<< [[.:start|← PKI infrastruktura]] | [[sl:int:pqcrypt:szenarien:start|▲ Scenariji]] | [[.:intermediate_ca_erstellen|1.2 Vmesni CA →]] >>
{{tag>scenarij pki korenski-ca ml-dsa-65 samopodpisan par-ključev certifikat fips-204}}
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//