
SRO PKCS11 – SSH Agent CNGは、自己完結型で超軽量、依存関係ゼロのWindowsエージェントであり、PKCS#11、SSH-agent、Pageant、CNG/Smartcardを1つの堅牢なバイナリに統合します。要求の厳しい環境向けに設計されており、ネイティブハードウェア暗号化、サービス/ユーザーランドの分離、完全なスマートカードサポートを提供します。
PKCS#11 + SSHエージェント + Pageant + CNG/スマートカードの主権的統合
伝統的に分離されていた4つの機能を1つのWindows実行ファイルに統合します:
主権的. CRTへの依存なし。すべてのメモリ操作は RtlCopyMemory、RtlZeroMemory、RtlEqualMemory(FreeCRT.h)を使用します。全てUnicode(ネイティブWin32)。malloc、memcpy、strlen、printf は一切使用しません。
安全. 秘密鍵は決してエクスポートされません。PINは転送されません。CNG/KSPはWindowsネイティブのPIN UIを管理します。安全なパイプを介した厳格なサービス↔ユーザーランドの分離。
ミニマリスト. 単一のバイナリ。外部DLLは不要。レジストリの肥大化なし。簡単なインストール(regsvr32 または -install)。
多目的. 同じプロセス内でPKCS#11、SSHエージェント、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` を使用してユーザーランドヘルパーを起動
- 秘密情報には触れずにメッセージを転送
- タイムアウト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