ההנפקה היא צינור (pipeline) של ארבעה שלבים. הדוגמה כאן היא של MSCA דרך Agent (המקרה הנפוץ):
POST /CertmPlatform/api/Ca/{server}/{name}/issue/{format}/{keySize} עם פרטי הסובייקט, SAN, EKU וכו'. אימות: Windows Negotiate/NTLM. הרשאה: ApiAuthorization(Roles = Management).CaController.IssueFromFormInternal (Controllers/CaController.cs:561):
CsrBuilder.GenerateKey(keySize) — יוצר זוג מפתחות RSA בזיכרון של ה־IIS process.CsrBuilder.BuildCsr(request, template) — בונה CSR וחותם אותו במפתח הפרטי שזה עתה נוצר.ICAService svc = GetCaService(server, name) מחזיר אינסטנס לפי סוג ה־CA:
MSCA — Microsoft CA (מקומי דרך COM, או דרך Agent).EJBCA — REST + SOAP (Services/Clients/EjbcaClient.cs).Acme — ACME (כרגע stub, לא יוצר תעודות אמיתיות).svc.IssueCertificate(csr, template) מחזירה byte[] של התעודה ב־DER, או null אם נכשל.
במסלול ה־MSCA Foreign (Services/CA_Modules/MSCA_Foreign.cs:121):
CertmPlatform CertmScanner (Agent) Microsoft CA
───────────── ──────────────────── ────────────
MSCA.IssueCertificate
└─ IssueCertificateForeign
└─ CertmScannerClient.IssueAsync(ca, csr)
POST api/MsCa/{server\name}/issue ─────► MsCaLocal (COM)
ICertRequest2
└─ Submit(CSR)
└─ GetCertificate()
◄────────────── cert (DER bytes) ──────────
◄── byte[] cert
הבחירה איזה Agent לפנות אליו מבוססת על השדה CA.agent בטבלת ה־CAs;
הערך נשלף מהמילון scanners דרך Config.Get("scanners") (טבלת SQL Scanners, ראה Migration 4).
.pfx) או PEM לפי הפורמט שביקש המשתמש. הקובץ זורם חזרה ל־UI ב־application/octet-stream. רישום ב־ActiveLog + SysLog עם שם המשתמש שביצע.POST /api/Ca/{server}/{name}/cert או POST /api/Ca/{ca}/submit/csr
שמדלגים על שלב 2 ושולחים את ה־CSR ישירות ל־CA. אז המפתח הפרטי לא עובר דרך CertmPlatform בכלל.
| תפקיד | מי | איפה בקוד |
|---|---|---|
| יוזם | המשתמש בדפדפן (Issue Cert wizard). בעתיד גם: SCEP client, ACME client, חידוש אוטומטי. |
ClientApp/src/pages/ca/IssueCert.tsx |
| שער הכניסה | IIS → CertmPlatform (ASP.NET Core, in-process). מאמת את ה־user מול AD ובודק הרשאה ב־Permissions. |
Program.cs, Services/ApiAuthorizationFilter.cs |
| מתאם / אורכֶסטרטור | CertmPlatform — בונה מפתח, בונה CSR, בוחר Module לפי סוג ה־CA, אורז את התוצאה. | Controllers/CaController.cs, Services/CAService.cs |
| שליח | CertmScanner (Agent) — רץ על מכונה אחרת, על־פי־רוב במתחם של ה־CA. רק הוא יודע לדבר עם ה־CA מקומית. | CertmScanner/ (פרויקט נפרד)Services/Clients/CertmScannerClient.cs |
| מבצע בפועל (חתימה) | ה־CA עצמו — Microsoft CA (COM ICertRequest2) / EJBCA (REST) / Cloud ACME. |
CertmScanner/Services/MsCaLocal.cs, Services/CA_Modules/EJBCA.cs |
| רישום | CertmPlatform — כל פעולה נכתבת ב־ActiveLog (טבלת SQL) עם שם המשתמש המקורי + סוג קוד שגיאה. |
ActiveLog.WriteRecord(...) |
נקודה חשובה: CertmPlatform אף פעם לא חותם תעודות בעצמו — הוא רק יוזם, מתאם ורושם. החתימה היא תמיד באחריות ה־CA. ה־Agent הוא רק שכבת תקשורת שמאפשרת ל־CertmPlatform לדבר עם CA שיושב במתחם אחר (בעיקר בגלל ש־MSCA דורש COM מקומי על מכונת ה־CA).
ברמת המאקרו הציור הגיוני וקרוב למה שקיים, אבל כשבודקים קופסה־קופסה יש כמה דברים בציור שעדיין לא ממומשים בקוד.
התשובה הקצרה: הציור מתאר ארכיטקטורת יעד; היום ממומש בעיקר העמוד השדרה של CertM Management → Scanner → MSCA (DCOM) ו־EJBCA ישיר. הרחבה:
CertM Management ↔ CertmPlatform — המתאם המרכזי. ✓Scanner 1 ↔ CertmScanner (Agent) — נכון, סוכן נפרד אחד או יותר, נבחר פר CA דרך CA.agent. ✓Scanner 1 → MSCA (DCOM) — מדויק. CertmScanner/Services/MsCaLocal.cs משתמש ב־COM/DCOM של ICertRequest2. ✓SCEP Client → CertM Management — ה־routes קיימים (/api/scep/*), אבל המודול עצמו stub חלקי ולא מקבל בקשות SCEP אמיתיות (אין ScepLib, ראה DEPENDENCIES.md). ⚠F5/NetScaler/Dynamics/Palo Alto/imperva/front door/reblaze/websphere — מיוצגת ב־UI כטאב "NetApps". בקוד היום ממומש רק F5 BIG-IP (אמיתי, דרך iControl REST), Alteon (stub), והשאר לא קיימים. ⚠Scanner 1 → EJBCA (REST API). בציור EJBCA יוצא מהסורק. בקוד EJBCA יוצא ישירות מ־CertmPlatform דרך Services/Clients/EjbcaClient.cs; הסוכן תומך רק ב־MSCA. אם זה ה־target — צריך לעטוף את EjbcaClient בצד הסוכן ולחשוף route ב־CertmScanner.CEP (החץ המקווקו ל־MSCA). לא ממומש. כל מסלול MSCA הוא DCOM דרך הסוכן. אין תמיכה ב־Certificate Enrollment Policy/Service (HTTPS-based MSCA).PKI Linux Agent Per OS and Version. לא קיים בקוד. אין סוכן Linux להפצה/חידוש תעודות בקצה.PKI Agent (משמאל למטה). לא קיים. בציור זה סוכן צד־לקוח (endpoint) ש:
ACME Server ישירות,MSCA דרך Renew DCOM,CertM Management.Services/CA_Modules/Acme.cs שהוא stub (לא מנפיק תעודות בפועל), וקריאת ACME אמורה לצאת ישירות מ־CertmPlatform — אין endpoint agent ביניהם.
בנוסף, יש שלושה פרטים שלא מופיעים בציור אבל קיימים בקוד וכדאי שיהיו במודל המנטלי:
/CertmPlatform/app?who=agent כדי להירשם ולקבל הודעות push. כל קריאות הבקרה הן Platform → Agent; אין REVERSE.path מתחיל ב־$). זה לא רלוונטי לפריסה החדשה אבל קיים בקוד.192.168.0.25\CTESQL) — לקוח יחיד הוא CertmPlatform. סוכנים לא ניגשים ל־DB.לצורך השוואה ישירה — זו ארכיטקטורת המערכת כפי שהיא ממומשת היום (ענף develop):
┌──────────────┐ HTTPS (Negotiate/NTLM) ┌──────────────────────────────────┐
│ Browser │ ──────────────────────────────────► │ IIS → CertmPlatform │
│ (React SPA) │ /CertmPlatform/api/... │ (ASP.NET Core, in-process) │
└──────────────┘ │ │
│ • Negotiate auth + Permissions │
┌──────────────┐ /CertmPlatform/api/scep/* (stub) │ • CsrBuilder (key + CSR) │
│ SCEP Client │ ──────────────────────────────────► │ • CaManager dispatch │
│ (⚠ stub) │ │ • Acme.cs (⚠ stub, in-proc) │
└──────────────┘ │ • EF Core → SQL │
└──┬───────────────┬──────────────┘
│ │
│ WebSocket │ EF Core
│ /app │ TDS
▼ ▼
┌──────────────┐ ┌──────────────────┐
│ WebSocketHub │ │ SQL Server │
│ (agents │ │ 192.168.0.25\ │
│ register) │ │ CTESQL · CertM │
└──────────────┘ └──────────────────┘
CertmPlatform fan-out (every arrow below originates IN CertmPlatform, not in an agent):
┌─────────────────┬────────────────────┬─────────────────┬──────────────────┐
│ │ │ │ │
▼ HTTP ▼ REST + SOAP ▼ iControl REST ▼ (stub) ▼ (stub)
┌─────────────┐ ┌────────────────┐ ┌────────────────┐ ┌────────────┐ ┌────────────┐
│ CertmScanner│ │ EJBCA server │ │ F5 BIG-IP │ │ Alteon │ │ ACME │
│ (Agent, │ │ (direct from │ │ (direct from │ │ (no real │ │ (no real │
│ HTTP/S) │ │ Platform) │ │ Platform) │ │ call) │ │ call) │
│ api/MsCa/...│ └────────────────┘ └────────────────┘ └────────────┘ └────────────┘
└──────┬──────┘
│ COM / DCOM
▼ ICertRequest2
┌─────────────┐
│ Microsoft CA│
└─────────────┘
NetApps not implemented today: NetScaler · Palo Alto · Dynamics · imperva · front door · reblaze · websphere
Agents not implemented today: PKI Agent (endpoint) · PKI Linux Agent
Protocols not implemented today: CEP/CES (MSCA over HTTPS) · real ACME · real SCEP
ההבדל הקריטי מול הציור של אלכס: בקוד היום, EJBCA, F5, Alteon ו־ACME יוצאים ישירות מ־CertmPlatform, לא דרך הסוכן. רק MSCA עובר דרך CertmScanner.
מעבר נקודה־נקודה על הקופסאות והחצים בציור מול הקוד. ✓ = תואם, ⚠ = תואם חלקית, ✗ = לא קיים בקוד היום.
| רכיב / חץ בציור | סטטוס | הערות |
|---|---|---|
SCEP Client → CertM Management |
⚠ | routes קיימים ב־Controllers/ScepController.cs, אבל ה־handler עצמו stub. אין ScepLib תקין; לא מקבל CSR/PKCS#7 אמיתי. צריך מימוש מלא כדי שתחנת SCEP־client אמיתית תעבוד. |
CertM Management (הקופסה המרכזית) |
✓ | CertmPlatform — ASP.NET Core in-process תחת IIS, ב־/CertmPlatform. |
CertM Management → Scanner 1 |
✓ | Services/Clients/CertmScannerClient.cs שולח HTTP אל ה־Agent. הסוכן נבחר פר־CA דרך CA.agent → מילון scanners. |
Scanner 1 (הקופסה) |
✓ | פרויקט נפרד CertmScanner/, אותו בינארי משמש גם לסריקות SSL וגם כ־CA agent. |
Scanner 1 → EJBCA (REST API) |
✗ | חוסר ההתאמה המרכזי. בקוד EJBCA יוצא ישירות מ־CertmPlatform (Services/Clients/EjbcaClient.cs), לא דרך הסוכן. אם זה ה־target, צריך להעביר את הלקוח לסוכן ולהוסיף route ב־CertmScanner. |
Scanner 1 → MSCA (DCOM) |
✓ | CertmScanner/Services/MsCaLocal.cs, COM/DCOM של ICertRequest2. Issue/Revoke/GetCRL/Templates — כולם דרך הסוכן. |
Scanner 1 ⇢ MSCA (CEP) — קו מקווקו |
✗ | אין תמיכה ב־CEP/CES (HTTPS-based MSCA enrollment). אם רוצים לתמוך ב־MSCA דרך CEP במקום DCOM (למשל חוצה־דומיינים), צריך module חדש בסוכן. |
CertM Management → F5/NetScaler/Dynamics/Palo Alto/imperva/front door/reblaze/websphere |
⚠ | F5 BIG-IP ממומש אמיתי (Services/Clients/F5BigIpClient.cs, iControl REST). Alteon stub (Test מחזיר 200 בלי קריאה אמיתית). NetScaler / Palo Alto / imperva / front door / reblaze / websphere — לא קיימים. צריך לקוח דומה ל־F5 לכל אחד. |
PKI Linux Agent Per OS and Version ↔ CertM Management |
✗ | אין סוכן Linux בכלל. כל הסוכנים היום הם Windows (.NET 10 / C# רגיל). |
PKI Agent ↔ CertM Management |
✗ | אין endpoint agent. ההתקנה והחידוש בקצה לא ממוכנים — היום מורידים PKCS#12 דרך ה־UI ומתקינים ידנית. |
PKI Agent → ACME Server |
✗ | Services/CA_Modules/Acme.cs ב־CertmPlatform הוא stub (לא יוצר תעודות). גם אם היה עובד — הוא יוצא ישירות מ־CertmPlatform, לא מ־endpoint agent. |
PKI Agent → MSCA (Renew DCOM) |
✗ | אין מסלול חידוש דרך agent־קצה. חידושים אוטומטיים היום הם רק עבור F5 BIG-IP (וגם זה TODO לפי memory/f5_alteon_stubbed.md). |
הציור שלך מתאר הרחבה בשלושה כיוונים מעבר למה שיש היום:
PKI Agent) — לחידוש אוטומטי על שרתי קצה (Windows) + לתקשורת מול ACME.שני שינויים נוספים שכדאי להתייעץ עליהם לפני שמסמנים את הציור כסופי:
CEP ל־MSCA נחוץ כתחליף ל־DCOM, או רק במצבים מסוימים? CEP פותח אפשרות לסביבות בלי trust דומיין, אבל הוא עוד module שלם לפתח ולתחזק.אם תאשר שזו אכן ארכיטקטורת היעד, אני אפתח issue/epic לכל פריט שמסומן ב־✗ ואצרף קישור ל־DEPENDENCIES.md.
סיכום הפערים בין הציור של אלכס לקוד היום, כ־checklist של מה שצריך לממש. הלגנדה: ✓ = ממומש ועובד · ⚠ = ממומש חלקית/stub · ✗ = לא קיים.
| יכולת | סטטוס | פערים / מה צריך לעשות |
|---|---|---|
| MSCA דרך DCOM (Scanner) | ✓ | עובד דרך CertmScanner/Services/MsCaLocal.cs + ICertRequest2. |
| MSCA דרך CEP/CES (HTTPS) | ✗ | מודול חדש בסוכן: לקוח CEP (policy) + CES (enrollment) על־בסיס WS-Trust. רלוונטי לסביבות בלי trust דומיין. |
| EJBCA דרך REST | ⚠ | קיים Services/Clients/EjbcaClient.cs שעובד, אבל הקריאה יוצאת ישירות מ־Platform. בציור של אלכס היא עוברת דרך הסוכן — צריך לעטוף ולחשוף ב־CertmScanner. |
| ACME אמיתי | ✗ | Services/CA_Modules/Acme.cs הוא stub: מנהל רשומות ב־DB אבל לא מנפיק. צריך מימוש מלא של RFC 8555 (account, order, authz/challenge, finalize). |
| יכולת | סטטוס | פערים / מה צריך לעשות |
|---|---|---|
| PKI Agent — Windows | ✗ | סוכן חדש לחלוטין: רישום מול CertmPlatform (WebSocket), חידוש אוטומטי לפני expiration, התקנה ב־Local Machine store, ACME enrollment, MSCA renew דרך DCOM. נפרד מ־CertmScanner. |
| PKI Agent — Linux (per OS/version) | ✗ | אותה פונקציונליות, ב־.NET חוצה־פלטפורמות או Go/Rust. צריך להחליט: בינארי אחד עם detection או חבילות פר־דיסטרו (deb/rpm). |
| יכולת | סטטוס | פערים / מה צריך לעשות |
|---|---|---|
| SCEP server | ⚠ | routes קיימים ב־Controllers/ScepController.cs, אבל ה־handler לא מטפל ב־PKCS#7/PKIMessage אמיתי. אין החלפה ל־ScepLib. צריך מימוש מלא של draft-nourse-scep. |
| יכולת | סטטוס | פערים / מה צריך לעשות |
|---|---|---|
| F5 BIG-IP | ⚠ | קריאה (List/Test) עובדת אמיתית דרך iControl REST. כתיבה (install/renew/delete) ו־F5BigIpMonitorService — TODO. |
| Citrix NetScaler / ADC | ✗ | לקוח חדש מול NITRO API. |
| Radware Alteon | ⚠ | היום stub מלא — Test מחזיר 200 בלי לפנות למכשיר. צריך לקוח אמיתי (Alteon REST API). |
| Microsoft Dynamics | ✗ | צריך להבהיר עם אלכס — Dynamics 365 או רכיב אחר? נראה מוזר בהקשר של load balancers. |
| Palo Alto (NGFW / Panorama) | ✗ | לקוח חדש מול PAN-OS XML API. |
| Imperva (WAF) | ✗ | לקוח חדש מול Imperva API (Cloud / SecureSphere). |
| Azure Front Door | ✗ | לקוח חדש מול Azure ARM API + Key Vault integration. |
| Reblaze | ✗ | לקוח חדש מול Reblaze API. |
| IBM WebSphere | ✗ | לקוח חדש — אופציות: wsadmin/JMX או keystore push דרך SSH. תלוי בגרסה. |
| יכולת | סטטוס | פערים / מה צריך לעשות |
|---|---|---|
| ניתוב פר־סוכן (multi-domain) | ✓ | קיים: CA.agent + מילון scanners ב־SQL. סוכן פר־דומיין AD. |
| חידוש אוטומטי — pipeline | ✗ | היום חידוש = הנפקה מחדש ידנית. צריך scheduler שמזהה תעודות שעומדות לפוג, מפעיל את הסוכן המתאים (PKI Agent / NetApp client), ומעדכן את ה־DB. |
| Push לאחר Issue (NetApps) | ✗ | היום הנפקה מחזירה PFX/PEM למשתמש. צריך זרימה: אם התעודה משויכת ל־NetApp → לפרוס שם אוטומטית. |
| WebSocketHub לסוכנים | ✓ | קיים — סוכנים נרשמים ב־/CertmPlatform/app?who=agent. תומך גם ב־PKI Agent החדש כשייכתב. |
אם הציור של אלכס הוא ה־scope המלא, יש כאן רוב פרויקט נפרד:
CertmScanner.שווה לפצל את זה ל־epics ולתעדף לפני שמתחילים. אני מציע לאשר את הציור כ־target עם אלכס, אז לפתוח issue פר־שורה בטבלאות למעלה, ואז להחליט סדר עבודה (אולי קודם CEP+ACME, אז PKI Agent Windows, אז NetApps?).