
SRO PKCS11 – SSH Agent CNG ist ein souveräner, ultraleichter und abhängigkeitsfreier Windows-Agent, der PKCS#11, SSH-Agent, Pageant und CNG/Smartcard in einer einzigen robusten Binärdatei vereint. Konzipiert für anspruchsvolle Umgebungen, bietet er native Hardware-Kryptographie, Service-/Userland-Isolation und vollständige Smartcard-Unterstützung.
Souveräne Vereinheitlichung PKCS#11 + SSH-Agent + Pageant + CNG/Smartcard
Eine einzige Windows-ausführbare Datei, die vier traditionell getrennte Funktionen vereint:
Souverän. Keine Abhängigkeit von der CRT. Alle Speicheroperationen erfolgen über RtlCopyMemory, RtlZeroMemory, RtlEqualMemory (FreeCRT.h). Unicode überall (natives Win32). Kein malloc, memcpy, strlen, printf.
Sicher. Die privaten Schlüssel werden nie exportiert. Es wird keine PIN übertragen. CNG/KSP verwaltet die native Windows-PIN-Oberfläche. Strenge Isolation von Dienst ↔ Benutzerbereich über gesicherte Pipes.
Minimalistisch. Nur eine Binärdatei. Keine externen DLLs. Keine Registry-Aufblähung. Einfache Installation (regsvr32 oder -install).
Vielseitig. Gleichzeitige Unterstützung von PKCS#11, SSH-Agent, Pageant und WSL2 im selben Prozess.
---``` ┌──────────────────────────────────────────────────────────────┐ │ Clients (Git, VS, WSL, OpenSSH, PuTTY, Firefox) │ └────────────────────────┬─────────────────────────────────────┘ │ ┌───────────────┼───────────────┬─────────────────┐ │ │ │ │ SSH-agent Pageant (WM_COPYDATA) PKCS#11 WSL2 (TCP) │ │ │ │ v v v v ┌──────────────────────────────────────────────────────────────┐ │ Service Stub (session 0, SYSTEM) │ │ - Accepte connexions sur \.\pipe\openssh-ssh-agent │ │ - Crée pipe interne par client (GUID unique) │ │ - Lance helper userland avec token interactif │ │ - Forwarde messages sans manipuler de secrets │ └────────────────────────┬─────────────────────────────────────┘ │ lancé par le service v ┌──────────────────────────────────────────────────────────────┐ │ Helper Userland (session interactive) │ │ - Connecte au pipe interne │ │ - Décode protocole SSH-agent/Pageant │ │ - Invoque CNG/KSP pour signature │ │ - UI PIN native Windows (pas de relay) │ │ - Renvoie signature au service │ │ - Fenêtre Pageant cachée pour WM_COPYDATA │ │ - Listener TCP 127.0.0.1:10022 pour WSL2 │ │ - Tray icon avec menu contextuel │ └────────────────────────┬─────────────────────────────────────┘ │ v ┌──────────────────────────────────────────────────────────────┐ │ CNG/KSP Backend │ │ - NCryptSignHash avec PKCS#1/PSS padding │ │ - Enumération certificats Windows Store │ │ - Filtrage SmartCardOnly / AllowedKSP │ │ - Support RSA + ECDSA (P-256, P-384, P-521) │ │ - Support EdDSA (Ed25519, Ed448) │ │ - Support Brainpool (P256r1, P384r1, P512r1) │ │ - Cache clés + providers (4h timeout) │ └──────────────────────────────────────────────────────────────┘
---
## Ausführungsmodi
### 1. PKCS#11-Modus (automatisch)
Geladen von:
- `ssh -I ssh-agent.exe benutzer@host`
- Firefox (Sicherheitseinstellungen → PKCS#11-Modul laden)
- `pkcs11-tool --module ssh-agent.exe --list-objects`
Stellt die standardmäßigen PKCS#11-Exporte bereit:
- `C_Initialize`, `C_Finalize`, `C_GetInfo`
- `C_GetSlotList`, `C_GetSlotInfo`, `C_GetTokenInfo`
- `C_GetMechanismList`, `C_GetMechanismInfo`
- `C_OpenSession`, `C_CloseSession`, `C_Login`, `C_Logout`
- `C_FindObjectsInit`, `C_FindObjects`, `C_FindObjectsFinal`
- `C_GetAttributeValue`
- `C_SignInit`, `C_Sign`
- `C_VerifyInit`, `C_Verify`
- `C_DecryptInit`, `C_Decrypt`
- `C_GenerateRandom`, `C_SeedRandom`
**Unterstützte Mechanismen (insgesamt 14):**
- `CKM_RSA_PKCS` (roh mit Padding)
- `CKM_RSA_X_509` (roh ohne Padding)
- `CKM_SHA1_RSA_PKCS` (Legacy ssh-rsa)
- `CKM_SHA256_RSA_PKCS` (rsa-sha2-256)
- `CKM_SHA384_RSA_PKCS` (rsa-sha2-384)
- `CKM_SHA512_RSA_PKCS` (rsa-sha2-512)
- `CKM_SHA256_RSA_PKCS_PSS` (RSA-PSS SHA-256)
- `CKM_SHA384_RSA_PKCS_PSS` (RSA-PSS SHA-384)
- `CKM_SHA512_RSA_PKCS_PSS` (RSA-PSS SHA-512)
- `CKM_ECDSA` (roh)
- `CKM_ECDSA_SHA1` (Legacy)
- `CKM_ECDSA_SHA256` (ecdsa-sha2-nistp256/384/521)
- `CKM_ECDSA_SHA384`
- `CKM_ECDSA_SHA512`
### 2. Benutzerland-Agent-Modus (eigenständig)```bash
ssh-agent.exe
\\.\pipe\openssh-ssh-agent in der BenutzersitzungKompatibel mit:
set SSH_AUTH_SOCK=\\.\pipe\openssh-ssh-agent)ssh-agent.exe -install net start SROSSHAgentCNG
### 4. Modus Helper Crypto Userland
- Läuft in Sitzung 0 (SYSTEM)
- Akzeptiert Verbindungen über globalen Pipe
- Erstellt einen internen Pipe pro Client (gesichert durch SID)
- Startet einen Userland-Helper mit `CreateProcessAsUserW`
- Leitet Nachrichten weiter, ohne die Geheimnisse zu berühren
- Helper-Pool mit Timeout 4h (automatische Wiederverwendung)
- LRU-Eviction, wenn Pool voll
**Vorteile:**
- UI-PIN in der Benutzersitzung (nicht in Sitzung 0)
- Kompatibel mit gehärteten Umgebungen
- Strenge Isolation Service ↔ Crypto
- Multi-Benutzer-Multiplexing```bash
ssh-agent.exe -useragent -pipe \\.\pipe\ssh-ksp-helper-{GUID}
Automatisch vom Dienst gestartet:
NCryptSignHash auf (native PIN-Oberfläche)