-
Notifications
You must be signed in to change notification settings - Fork 0
certificate_pinning
Erweiterte TLS-Sicherheit für ausgehende Verbindungen zu HSM (Hardware Security Module) und TSA (Timestamp Authority) durch Certificate Pinning.
Certificate Pinning bietet zusätzliche Sicherheit gegenüber Standard-TLS:
- Trust-on-First-Use (TOFU): Vertraue nur bekannten Zertifikaten
- Man-in-the-Middle Protection: Verhindert MITM-Angriffe trotz kompromittierter CAs
- SHA256 Fingerprint Verification: Verifiziere exakte Zertifikats-Identität
- Leaf oder Chain Pinning: Flexibles Pinning von Leaf-Cert oder Intermediate-CA
- Client verbindet zu Server
- Server sendet Zertifikat
- Client prüft Zertifikat gegen System-CA-Store
- ✅ Verbindung etabliert (wenn CA-signiert)
Problem: Kompromittierte CA kann gefälschte Zertifikate ausstellen.
- Client verbindet zu Server
- Server sendet Zertifikat
- Client prüft Zertifikat gegen System-CA-Store
- Client berechnet SHA256-Fingerprint des Zertifikats
- Client vergleicht Fingerprint mit Whitelist
- ✅ Verbindung nur bei Match etabliert
Vorteil: Selbst kompromittierte CAs können Server nicht impersonieren.
# Certificate Pinning aktivieren
export THEMIS_PKI_ENABLE_CERT_PINNING=true
# Pinned Fingerprints (SHA256, hex, komma-separiert)
export THEMIS_PKI_PINNED_CERTS="a1b2c3d4...,e5f6g7h8..."
# Nur Leaf-Zertifikat pinnen (Standard: false = gesamte Chain)
export THEMIS_PKI_PIN_LEAF_ONLY=false#include "utils/pki_client.h"
using namespace themis::utils;
PKIConfig config;
config.endpoint = "https://hsm.example.com:8443/api/v1";
config.cert_path = "/etc/themis/client.crt";
config.key_path = "/etc/themis/client.key";
// Certificate Pinning aktivieren
config.enable_cert_pinning = true;
// SHA256-Fingerprints der erlaubten Zertifikate
config.pinned_cert_fingerprints = {
"a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2",
"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"
};
// Optional: Nur Leaf-Cert pinnen (nicht Intermediate/Root)
config.pin_leaf_only = false;
VCCPKIClient client(config);# SHA256-Fingerprint eines Zertifikats
openssl x509 -in server.crt -noout -fingerprint -sha256
# Output:
# SHA256 Fingerprint=A1:B2:C3:D4:E5:F6:...:01:02
# Hex ohne Doppelpunkte (für Konfiguration)
openssl x509 -in server.crt -noout -fingerprint -sha256 | \
sed 's/.*=//;s/://g' | tr '[:upper:]' '[:lower:]'
# Output:
# a1b2c3d4e5f6...0102# Verbinde und zeige Zertifikat
echo | openssl s_client -connect hsm.example.com:8443 2>/dev/null | \
openssl x509 -noout -fingerprint -sha256
# Oder mit curl
curl --insecure -v https://hsm.example.com:8443 2>&1 | \
grep -A 20 "Server certificate"#include <openssl/x509.h>
#include <openssl/sha.h>
std::string compute_cert_fingerprint(X509* cert) {
unsigned char md[SHA256_DIGEST_LENGTH];
unsigned int n = 0;
if (!X509_digest(cert, EVP_sha256(), md, &n)) {
return "";
}
std::ostringstream oss;
for (unsigned int i = 0; i < n; ++i) {
oss << std::hex << std::setw(2) << std::setfill('0')
<< static_cast<int>(md[i]);
}
return oss.str();
}PKIConfig hsm_config;
hsm_config.endpoint = "https://hsm.internal.corp:8443";
hsm_config.enable_cert_pinning = true;
hsm_config.pinned_cert_fingerprints = {
// HSM-Server-Zertifikat SHA256
"fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210"
};
VCCPKIClient hsm_client(hsm_config);
// Signing-Operation
auto result = hsm_client.signHash(hash_bytes);
// -> Verbindung nur bei korrektem FingerprintPKIConfig tsa_config;
tsa_config.endpoint = "https://tsa.example.com:443/rfc3161";
tsa_config.enable_cert_pinning = true;
tsa_config.pinned_cert_fingerprints = {
// TSA-Server-Zertifikat SHA256
"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
// Backup-TSA (für Redundanz)
"abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef"
};
// Timestamp-Request
// (TSA-Client würde hier ähnlich zu PKI-Client funktionieren)PKIConfig config;
config.endpoint = std::getenv("PKI_ENDPOINT");
config.enable_cert_pinning = true;
// Verschiedene Fingerprints für Dev/Prod
if (is_production) {
config.pinned_cert_fingerprints = {
"prod_cert_fingerprint_sha256..."
};
} else {
config.pinned_cert_fingerprints = {
"dev_cert_fingerprint_sha256..."
};
}Vorteile:
- Spezifischste Kontrolle
- Einfache Rotation (nur Leaf-Cert austauschen)
Nachteile:
- Muss bei jedem Cert-Renewal aktualisiert werden
Verwendung:
config.pin_leaf_only = true;
config.pinned_cert_fingerprints = {
"leaf_cert_sha256..." // Nur Server-Zertifikat
};Vorteile:
- Flexibler bei Cert-Renewal
- Pin Intermediate-CA statt Leaf
Nachteile:
- Weniger spezifisch
Verwendung:
config.pin_leaf_only = false;
config.pinned_cert_fingerprints = {
"intermediate_ca_sha256...", // Intermediate CA
"root_ca_sha256..." // Optional: Root CA
};Für Redundanz bei Zertifikatsrotation:
config.pinned_cert_fingerprints = {
"current_cert_sha256...",
"next_cert_sha256..." // Für nahtlose Rotation
};Plane Zertifikatsrotation im Voraus:
# 30 Tage vor Ablauf: Neues Zertifikat generieren
openssl x509 -in current.crt -noout -enddate
# Fingerprint des neuen Zertifikats zur Whitelist hinzufügen
# BEVOR altes Zertifikat abläuftVerifiziere Fingerprints über sicheren Kanal:
# Fingerprint per SSH/VPN abrufen
ssh [email protected] "openssl x509 -in /etc/ssl/server.crt -fingerprint -sha256"
# Fingerprint in Konfiguration eintragentry {
auto result = pki_client.signHash(hash);
} catch (const std::exception& e) {
// Log Certificate Pinning Fehler
audit_logger.logSecurityEvent(
SecurityEventType::INTEGRITY_VIOLATION,
"system",
"pki_client",
{{"error", e.what()}, {"endpoint", config.endpoint}}
);
// Alert Operations Team
alert_ops("Certificate pinning failure detected!");
}Für den Fall, dass alle Pins ungültig werden:
// Fallback: Manual verification mode
if (config.pinned_cert_fingerprints.empty()) {
THEMIS_WARN("Certificate pinning disabled - manual verification required");
// Erzwinge manuelle Bestätigung durch Operator
}Problem: Fingerprint stimmt nicht überein.
Diagnose:
# Aktueller Server-Fingerprint
echo | openssl s_client -connect hsm.example.com:8443 2>/dev/null | \
openssl x509 -noout -fingerprint -sha256
# Vergleich mit gepinntem Fingerprint
grep THEMIS_PKI_PINNED_CERTS /etc/themis/configLösung:
- Fingerprint korrekt? → Update Konfiguration
- Server-Zertifikat geändert? → Neuen Fingerprint hinzufügen
- MITM-Angriff? → Security Incident Response
Problem: Standard SSL-Verifikation schlägt fehl.
Lösung:
# CA-Bundle aktualisieren
sudo update-ca-certificates
# Oder: Spezifisches CA-Cert hinzufügen
curl --cacert /path/to/ca.crt https://hsm.example.com:8443Problem: Zertifikat wurde rotiert, Fingerprint nicht aktualisiert.
Lösung:
// Temporär: Beide Fingerprints erlauben
config.pinned_cert_fingerprints = {
"old_cert_sha256...",
"new_cert_sha256..."
};
// Nach erfolgreicher Rotation: Alten Fingerprint entfernen- Fingerprint-Berechnung: ~0.1ms (SHA256)
- Whitelist-Check: O(n) mit n = Anzahl gepinnter Zertifikate
- Typischer Overhead: < 1ms für 5 gepinnte Certs
Empfehlung: Max. 5-10 gepinnte Fingerprints.
CURL cached SSL-Sessions automatisch:
// SSL Session Cache (automatisch in CURL)
// Nachfolgende Requests nutzen bestehende Session
// -> Kein erneuter Pinning-Check nötigCertificate Pinning ist kompatibel mit FIPS-Modus:
# FIPS-Mode aktivieren (OpenSSL)
export OPENSSL_FIPS=1
# SHA256 ist FIPS-approved- Erfüllt PCI DSS 3.2.1 Requirement 4.1 (Strong Cryptography)
- Additional Layer of Defense
- Trust Services Criteria: CC6.1 (Logical and Physical Access Controls)
- Defense in Depth gegen CA-Kompromittierung
| Methode | Sicherheit | Flexibilität | Wartungsaufwand |
|---|---|---|---|
| Certificate Pinning | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ (regelmäßige Updates) |
| mTLS (Client Certs) | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ (Client-Cert-Management) |
| Standard TLS | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ (automatische CA-Updates) |
| IP Whitelisting | ⭐⭐ | ⭐⭐ | ⭐⭐⭐ (statische IPs erforderlich) |
Empfehlung: Kombiniere Certificate Pinning + mTLS für maximale Sicherheit.
-
Fingerprints sammeln:
openssl s_client -connect hsm.example.com:8443 < /dev/null 2>/dev/null | \ openssl x509 -fingerprint -sha256 -noout
-
Test-Environment:
// Aktiviere Pinning in Dev/Test config.enable_cert_pinning = true; config.pinned_cert_fingerprints = {"dev_fingerprint..."};
-
Monitoring:
// Log Pinning-Erfolge/Fehler THEMIS_INFO("Certificate pinning: {}", pin_valid ? "PASSED" : "FAILED");
-
Rollout Produktion:
# Konfiguration aktualisieren export THEMIS_PKI_ENABLE_CERT_PINNING=true export THEMIS_PKI_PINNED_CERTS="prod_fingerprint..." # Service neu starten sudo systemctl restart themis
- AQL Overview
- AQL Syntax Reference
- EXPLAIN and PROFILE
- Hybrid Queries
- Pattern Matching
- Subquery Implementation
- Subquery Quick Reference
- Fulltext Release Notes
- Hybrid Search Design
- Fulltext Search API
- Content Search
- Pagination Benchmarks
- Stemming
- Hybrid Fusion API
- Performance Tuning
- Migration Guide
- Storage Overview
- RocksDB Layout
- Geo Schema
- Index Types
- Index Statistics
- Index Backup
- HNSW Persistence
- Vector Index
- Graph Index
- Secondary Index
- Security Overview
- RBAC and Authorization
- TLS Setup
- Certificate Pinning
- Encryption Strategy
- Column Encryption
- Key Management
- Key Rotation
- HSM Integration
- PKI Integration
- eIDAS Signatures
- PII Detection
- PII API
- Threat Model
- Hardening Guide
- Incident Response
- SBOM
- Enterprise Overview
- Scalability Features
- Scalability Strategy
- HTTP Client Pool
- Enterprise Build Guide
- Enterprise Ingestion
- Benchmarks Overview
- Compression Benchmarks
- Compression Strategy
- Memory Tuning
- Hardware Acceleration
- GPU Acceleration Plan
- CUDA Backend
- Vulkan Backend
- Multi-CPU Support
- TBB Integration
- Time Series
- Vector Operations
- Graph Features
- Temporal Graphs
- Path Constraints
- Recursive Queries
- Audit Logging
- Change Data Capture
- Transactions
- Semantic Cache
- Cursor Pagination
- Compliance Features
- GNN Embeddings
- Geo Overview
- Geo Architecture
- 3D Game Acceleration
- Geo Feature Tiering
- G3 Phase 2 Status
- G5 Implementation
- Integration Guide
- Content Architecture
- Content Pipeline
- Content Manager
- JSON Ingestion
- Content Ingestion
- Filesystem API
- Image Processor
- Geo Processor
- Policy Implementation
- Developer Guide
- Implementation Status
- Development Roadmap
- Build Strategy
- Build Acceleration
- Code Quality Guide
- AQL LET Implementation
- Audit API Implementation
- SAGA API Implementation
- PKI eIDAS
- WAL Archiving
- Architecture Overview
- Strategic Overview
- Ecosystem
- MVCC Design
- Base Entity
- Caching Strategy
- Caching Data Structures
- Docker Build
- Docker Status
- Multi-Arch CI/CD
- ARM Build Guide
- ARM Packages
- Raspberry Pi Tuning
- Packaging Guide
- Package Maintainers
- Roadmap
- Changelog
- Database Capabilities
- Implementation Summary
- Sachstandsbericht 2025
- Enterprise Final Report
- Test Report
- Build Success Report
- Integration Analysis
- Source Overview
- API Implementation
- Query Engine
- Storage Layer
- Security Implementation
- CDC Implementation
- Time Series
- Utils and Helpers
Updated: 2025-11-30