Skip to content
IRC-Coding IRC-Coding
PKI Public Key Infrastructure Zertifikate Certificate Authority TLS SSL

PKI Public Key Infrastructure: Zertifikate, CA & TLS/SSL

PKI ist das Framework für digitale Zertifikate. Root CA, Intermediate CA, X.509, CRL, OCSP und TLS/SSL Implementierung mit praktischen Beispielen.

S

schutzgeist

2 min read

PKI Public Key Infrastructure: Zertifikate, CA & TLS/SSL

Dieser Beitrag ist eine umfassende Erläuterung der Public Key Infrastructure – inklusive Zertifikate, Certificate Authorities und TLS/SSL Implementierung.

In a Nutshell

PKI ist das organisatorische und technische Rahmenwerk zum Erstellen, Verteilen, Validieren und Widerrufen von öffentlichen Schlüsseln mittels Zertifikaten. Sie ermöglicht vertrauenswürdige Identitäten für Menschen, Maschinen und Dienste.

Kompakte Fachbeschreibung

Eine Public Key Infrastructure (PKI) besteht aus Root CA und nachgeordneten Intermediate CAs, die X.509 Zertifikate ausstellen, signieren und über CRL oder OCSP widerrufen.

Hauptkomponenten:

  • Certificate Authority (CA): Stellt Zertifikate aus
  • Registration Authority (RA): Prüft Identitäten
  • Certificate Repository: Speichert Zertifikate
  • Validation Authority: Validiert Zertifikate

Zertifikatsinhalte:

  • Public Key: Öffentlicher Schlüssel des Inhabers
  • Identity Information: CN, SAN, OU, O, C
  • Validity Period: Gültigkeitszeitraum
  • Key Usage: Zweckbindung des Schlüssels
  • Digital Signature: Signatur der ausstellenden CA

Vertrauensmodell:

  • Chain of Trust: Hierarchische CA-Struktur
  • Root Certificates: Vertrauensanker in Truststores
  • Certificate Validation: Prüfung der Zertifikatskette

PKI unterstützt Authentifizierung, Signatur, Verschlüsselung und Nichtabstreitbarkeit in TLS, S/MIME, Code Signing und mTLS.

Prüfungsrelevante Stichpunkte

  • Root CA und Intermediate CA Hierarchie
  • X.509 Zertifikatsformat und -inhalte
  • Chain of Trust und Truststore Management
  • CRL (Certificate Revocation List) und OCSP (Online Certificate Status Protocol)
  • TLS/SSL Handshake mit Zertifikatsvalidierung
  • CSR (Certificate Signing Request) Prozess
  • mTLS (Mutual TLS) für Client-Authentifizierung
  • IHK-relevant für IT-Sicherheit und Netzwerktechnik

Kernkomponenten

  1. Root Certificate Authority: Oberste Vertrauensinstanz
  2. Intermediate Certificate Authority: Zwischeninstanzen für Delegation
  3. End Entity Certificate: Zertifikat für Server/Client/Dienste
  4. Certificate Signing Request: Anfrage für Zertifikatsausstellung
  5. Certificate Revocation List: Liste widerrufener Zertifikate
  6. OCSP Responder: Online-Statusprüfung von Zertifikaten
  7. Truststore: Speicher vertrauenswürdiger Root-Zertifikate
  8. Keystore: Speicher eigener Zertifikate und privater Schlüssel

Praxisbeispiele

Zertifikat mit OpenSSL erstellen

# Private Key generieren
openssl genrsa -out server.key 2048

# Certificate Signing Request (CSR) erstellen
openssl req -new -key server.key -out server.csr \
  -subj "/C=DE/ST=Berlin/L=Berlin/O=IRC-Coding/OU=IT/CN=irc-coding.de"

# Self-signed Certificate (für Testing)
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

# Zertifikat anzeigen
openssl x509 -in server.crt -text -noout

# Zertifikat validieren
openssl verify -CAfile ca.crt server.crt

Java Keystore Management

// Keystore mit KeyTool erstellen
// keytool -genkeypair -alias server -keyalg RSA -keysize 2048 \
//   -keystore keystore.jks -validity 365

// CSR exportieren
// keytool -certreq -alias server -keystore keystore.jks -file server.csr

// Zertifikat importieren
// keytool -importcert -alias server -file server.crt \
//   -keystore keystore.jks -trustcacerts

// Java Code für Zertifikatsvalidierung
import java.security.cert.*;
import java.io.FileInputStream;

public class CertificateValidator {
    
    public static boolean validateCertificate(String certPath, String caPath) {
        try {
            // Zertifikat laden
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            X509Certificate cert = (X509Certificate) 
                cf.generateCertificate(new FileInputStream(certPath));
            
            // CA-Zertifikat laden
            X509Certificate caCert = (X509Certificate) 
                cf.generateCertificate(new FileInputStream(caPath));
            
            // Zertifikatskette validieren
            cert.checkValidity(); // Gültigkeitszeitraum prüfen
            cert.verify(caCert.getPublicKey()); // Signatur prüfen
            
            // CRL/OCSP Prüfung (vereinfacht)
            if (isRevoked(cert)) {
                return false;
            }
            
            return true;
            
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    
    private static boolean isRevoked(X509Certificate cert) {
        // CRL oder OCSP Prüfung implementieren
        return false;
    }
}

TLS Server mit Node.js

const https = require('https');
const fs = require('fs');

// TLS Server Konfiguration
const tlsOptions = {
    key: fs.readFileSync('server.key'),
    cert: fs.readFileSync('server.crt'),
    ca: fs.readFileSync('ca.crt'), // Für Client-Authentifizierung
    requestCert: true,            // mTLS erfordern
    rejectUnauthorized: true       // Ungültige Zertifikate ablehnen
};

const server = https.createServer(tlsOptions, (req, res) => {
    // Client-Zertifikat-Informationen
    const clientCert = req.socket.getPeerCertificate();
    
    if (clientCert) {
        console.log('Client authenticated:', clientCert.subject.CN);
        res.writeHead(200);
        res.end('Hello authenticated client!');
    } else {
        res.writeHead(401);
        res.end('Client certificate required');
    }
});

server.listen(8443, () => {
    console.log('TLS Server listening on port 8443');
});

Python TLS Client mit Zertifikatsvalidierung

import ssl
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.ssl_ import create_urllib3_context

class TLSAdapter(HTTPAdapter):
    def init_poolmanager(self, *args, **kwargs):
        context = create_urllib3_context()
        context.check_hostname = True
        context.verify_mode = ssl.CERT_REQUIRED
        context.load_verify_locations('ca.crt')  # CA-Zertifikat laden
        
        # mTLS mit Client-Zertifikat
        context.load_cert_chain('client.crt', 'client.key')
        
        kwargs['ssl_context'] = context
        return super().init_poolmanager(*args, **kwargs)

# TLS-Client mit Zertifikatsvalidierung
session = requests.Session()
session.mount('https://', TLSAdapter())

try:
    response = session.get('https://secure-api.example.com/data')
    print("Response:", response.json())
except requests.exceptions.SSLError as e:
    print("TLS Error:", e)
except Exception as e:
    print("General Error:", e)

Certificate Revocation (CRL/OCSP)

// CRL-basierte Revocation Prüfung
import java.security.cert.*;
import java.net.URL;
import java.io.InputStream;

public class CRLValidator {
    
    public static boolean checkRevocation(X509Certificate cert) {
        try {
            // CRL Distribution Points aus Zertifikat extrahieren
            String crlUrl = getCRLDistributionPoint(cert);
            
            if (crlUrl != null) {
                // CRL herunterladen
                URL url = new URL(crlUrl);
                InputStream in = url.openStream();
                
                // CRL laden und validieren
                CertificateFactory cf = CertificateFactory.getInstance("X.509");
                X509CRL crl = (X509CRL) cf.generateCRL(in);
                
                // Prüfen ob Zertifikat widerrufen wurde
                return !crl.isRevoked(cert);
            }
            
            return true; // Keine CRL verfügbar
            
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    
    private static String getCRLDistributionPoint(X509Certificate cert) {
        // CRL Distribution Point aus Zertifikat-Extensions extrahieren
        // Implementierung würde ASN.1 Parsing erfordern
        return null;
    }
}

PKI-Hierarchie und Trust Chain

Typische PKI-Struktur

Root CA (selbstsigniert)
├── Intermediate CA 1 (für Web-Server)
│   ├── irc-coding.de
│   └── api.irc-coding.de
├── Intermediate CA 2 (für Code Signing)
│   ├── desktop-app.exe
│   └── mobile-app.apk
└── Intermediate CA 3 (für E-Mail)
    ├── user1@irc-coding.de
    └── user2@irc-coding.de

Zertifikatsvalidierungskette

public class ChainValidator {
    
    public static boolean validateChain(X509Certificate[] chain, 
                                       X509Certificate[] trustedCAs) {
        try {
            // Trust Anchors initialisieren
            Set<TrustAnchor> trustAnchors = new HashSet<>();
            for (X509Certificate ca : trustedCAs) {
                trustAnchors.add(new TrustAnchor(ca, null));
            }
            
            // PKIX-Parameter konfigurieren
            PKIXParameters params = new PKIXParameters(trustAnchors);
            params.setRevocationEnabled(true); // CRL/OCSP Prüfung aktivieren
            
            // Certificate Path Builder
            CertPathBuilder builder = CertPathBuilder.getInstance("PKIX");
            X509CertSelector selector = new X509CertSelector();
            selector.setCertificate(chain[0]);
            
            PKIXBuilderParameters builderParams = 
                new PKIXBuilderParameters(trustAnchors);
            builderParams.setRevocationEnabled(true);
            
            // Zertifikatskette validieren
            CertPathBuilderResult result = builder.build(builderParams);
            CertPathValidator validator = CertPathValidator.getInstance("PKIX");
            CertPathValidatorResult validatorResult = 
                validator.validate(result.getCertPath(), params);
            
            return true;
            
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

Vorteile und Nachteile

Vorteile von PKI

  • Sicherheit: Starke kryptographische Grundlage
  • Skalierbarkeit: Hierarchische Struktur für große Organisationen
  • Standardisierung: X.509 ist weit verbreitet
  • Flexibilität: Verschiedene Anwendungsfälle (TLS, Code Signing, etc.)
  • Nichtabstreitbarkeit: Digitale Signaturen beweisen Urheberschaft

Nachteile

  • Komplexität: Aufwendige Einrichtung und Wartung
  • Kosten: Commercial CAs verlangen Gebühren
  • Betriebsaufwand: Schlüsselrotation, Zertifikatsverwaltung
  • Single Point of Failure: Root CA Ausfall betrifft gesamte PKI

Häufige Prüfungsfragen

  1. Was ist der Unterschied zwischen Root CA und Intermediate CA? Root CA ist selbstsigniert und Vertrauensanker, Intermediate CA ist von Root CA signiert und delegiert Ausstellung.

  2. Erklären Sie den Chain of Trust! Hierarchische Validierung vom End-Zertifikat über Intermediate CAs bis zur Root CA.

  3. Was ist der Zweck von CRL und OCSP? Überprüfung ob Zertifikate vor Ablauf widerrufen wurden (Compromise, Job-Change, etc.).

  4. Wann verwendet man mTLS? Für gegenseitige Authentifizierung zwischen Server und Client (APIs, Microservices).

Wichtigste Quellen

  1. https://de.wikipedia.org/wiki/Public-Key-Infrastruktur
  2. https://tools.ietf.org/html/rfc5280
  3. https://www.ietf.org/rfc/rfc5280.txt
Zurück zum Blog
Share: