
SRO PKCS11 – SSH Agent CNG는 PKCS#11, SSH-agent, Pageant 및 CNG/Smartcard를 단일 강력한 바이너리로 통합하는 독립적이고 초경량이며 의존성이 없는 Windows 에이전트입니다. 까다로운 환경을 위해 설계되어 네이티브 하드웨어 암호화, 서비스/유저랜드 격리, 완벽한 스마트카드 지원을 제공합니다.
PKCS#11 + SSH-agent + Pageant + CNG/스마트카드의 주권적 통합
전통적으로 분리된 네 가지 기능을 단일 Windows 실행 파일로 통합합니다:
주권적. CRT에 대한 종속성 없음. 모든 메모리 연산은 RtlCopyMemory, RtlZeroMemory, RtlEqualMemory를 통해 수행 (FreeCRT.h). 모든 곳에서 유니코드 사용 (Win32 네이티브). malloc, memcpy, strlen, printf 없음.
안전함. 개인 키는 절대 내보내지 않음. PIN이 전송되지 않음. CNG/KSP가 Windows 기본 PIN UI를 처리. 보안 파이프를 통해 서비스 ↔ 사용자 영역 엄격한 격리.
최소화. 단일 바이너리. 외부 DLL 없음. 레지스트리 bloating 없음. 간단한 설치 (regsvr32 또는 -install).
다재다능. 동일한 프로세스에서 PKCS#11, SSH-agent, Pageant, WSL2 동시 지원.
┌──────────────────────────────────────────────────────────────┐ │ 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) │ └──────────────────────────────────────────────────────────────┘
## 실행 모드
### 1. PKCS#11 모드 (자동)
다음에 의해 로드됨:
- `ssh -I ssh-agent.exe user@host`
- `Firefox (Security Devices → Load PKCS#11 Module)`
- `pkcs11-tool --module ssh-agent.exe --list-objects`
표준 PKCS#11 내보내기 노출:
- `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`
**지원 메커니즘 (총 14개):**
- `CKM_RSA_PKCS` (패딩이 있는 raw)
- `CKM_RSA_X_509` (패딩 없는 raw)
- `CKM_SHA1_RSA_PKCS` (레거시 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` (raw)
- `CKM_ECDSA_SHA1` (레거시)
- `CKM_ECDSA_SHA256` (ecdsa-sha2-nistp256/384/521)
- `CKM_ECDSA_SHA384`
- `CKM_ECDSA_SHA512`
### 2. 사용자랜드 에이전트 모드 (독립 실행형)```bash
ssh-agent.exe
\\.\pipe\openssh-ssh-agent 파이프를 생성합니다호환 대상:
set SSH_AUTH_SOCK=\\.\pipe\openssh-ssh-agent)ssh-agent.exe -install net start SROSSHAgentCNG
- 세션 0(SYSTEM)에서 실행
- 글로벌 파이프 연결 수락
- 클라이언트별 내부 파이프 생성(SID로 보안)
- `CreateProcessAsUserW`로 userland 헬퍼 실행
- 비밀에 접근하지 않고 메시지 포워딩
- 타임아웃 4시간인 헬퍼 풀(자동 재사용)
- 풀이 가득 차면 LRU 제거
**장점:**
- 사용자 세션의 UI PIN(세션 0 아님)
- 강화된 환경과 호환 가능
- 서비스 ↔ 암호화 간 엄격한 격리
- 다중 사용자 멀티플렉싱
### 4. 사용자 영역 암호화 헬퍼 모드```bash
ssh-agent.exe -useragent -pipe \\.\pipe\ssh-ksp-helper-{GUID}
서비스에 의해 자동으로 시작됨:
NCryptSignHash 호출 (네이티브 PIN UI)regsvr32 ssh-agent.exe
키 생성:
- `HKLM\SOFTWARE\San@sro Inc\PKCS11-SSH-Agent`
- `HKCU\SOFTWARE\San@sro Inc\PKCS11-SSH-Agent`
- `HKCU\SOFTWARE\Mozilla\Firefox\PKCS11Modules\SROSSHAgent`
### Windows 서비스 설치```bash
ssh-agent.exe -install
net start SROSSHAgentCNG
~/.bashrc 또는 ~/.zshrc에 추가 :```bash
export SSH_AUTH_SOCK="$HOME/.ssh/agent.sock"
if ! pgrep -u $USER socat > /dev/null || [ ! -S "$SSH_AUTH_SOCK" ]; then # Nettoyage préventif rm -f "$SSH_AUTH_SOCK"
# Lancement du bridge en arrière-plan
# Note: Utiliser 127.0.0.1 si mode 'mirrored'
# sinon l'IP du host (ex: 192.168.99.x)
socat UNIX-LISTEN:"$SSH_AUTH_SOCK",fork,unlink-early \
TCP:127.0.0.1:10022 > /dev/null 2>&1 &
fi
### 제거```bash
regsvr32 /u ssh-agent.exe
ssh-agent.exe -remove
키: HKLM\SOFTWARE\San@sro Inc\pkcs11-cng 또는 HKCU\SOFTWARE\San@sro Inc\pkcs11-cng