תשובות לשאלות של אלכס — CertmPlatform

נכתב על־ידי גל · 2026-05-18 · מבוסס על הקוד בענף develop

עדכון: קיבלתי את הציור ועברתי עליו (קופסאות: SCEP Client, CertM Management, Scanner 1, EJBCA, MSCA, F5/NetScaler/Dynamics/Palo Alto/imperva/front door/reblaze/websphere, PKI Linux Agent, PKI Agent, ACME Server; חצים: REST API, DCOM, CEP, Renew DCOM). שאלות 3 ו־4 עודכנו להשוואה ישירה בין הציור לקוד הקיים.

שאלה 1 — איך עובדת ההנפקה של תעודות?

"איך עובדת ההנפקה של תעודות" — Alex Raitskin, 2026-05-14T08:36:29Z

ההנפקה היא צינור (pipeline) של ארבעה שלבים. הדוגמה כאן היא של MSCA דרך Agent (המקרה הנפוץ):

  1. בקשה מהדפדפן. ה־UI (React SPA) שולח POST /CertmPlatform/api/Ca/{server}/{name}/issue/{format}/{keySize} עם פרטי הסובייקט, SAN, EKU וכו'. אימות: Windows Negotiate/NTLM. הרשאה: ApiAuthorization(Roles = Management).
  2. יצירת מפתח + CSR בצד CertmPlatform. ב־CaController.IssueFromFormInternal (Controllers/CaController.cs:561):
    1. CsrBuilder.GenerateKey(keySize) — יוצר זוג מפתחות RSA בזיכרון של ה־IIS process.
    2. CsrBuilder.BuildCsr(request, template) — בונה CSR וחותם אותו במפתח הפרטי שזה עתה נוצר.
    המפתח הפרטי לא יוצא מ־CertmPlatform עד שעוטפים אותו ל־PKCS#12 בסוף.
  3. שליחת ה־CSR ל־CA. ICAService svc = GetCaService(server, name) מחזיר אינסטנס לפי סוג ה־CA: הקריאה 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).
  4. אריזה והחזרה. ב־CertmPlatform מאחדים את התעודה שחזרה עם המפתח הפרטי שנשמר משלב 2, ויוצרים PKCS#12 (.pfx) או PEM לפי הפורמט שביקש המשתמש. הקובץ זורם חזרה ל־UI ב־application/octet-stream. רישום ב־ActiveLog + SysLog עם שם המשתמש שביצע.
מסלול חלופי — SCEP/CSR קיים: אם הלקוח כבר מחזיק ב־CSR (לדוגמה דרך SCEP או חיצונית), משתמשים ב־POST /api/Ca/{server}/{name}/cert או POST /api/Ca/{ca}/submit/csr שמדלגים על שלב 2 ושולחים את ה־CSR ישירות ל־CA. אז המפתח הפרטי לא עובר דרך CertmPlatform בכלל.

שאלה 2 — מי יוזם, מי מבצע?

"מי יוזם, מי מבצע" — Alex Raitskin, 2026-05-14T08:36:42Z
תפקיד מי איפה בקוד
יוזם המשתמש בדפדפן (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).

שאלה 3 — האם זה מתאים לארכיטקטורה ששלחת?

"אם זה מתאים לארכטקטורה ששלחתי" — Alex Raitskin, 2026-05-14T08:35:42Z

ברמת המאקרו הציור הגיוני וקרוב למה שקיים, אבל כשבודקים קופסה־קופסה יש כמה דברים בציור שעדיין לא ממומשים בקוד. התשובה הקצרה: הציור מתאר ארכיטקטורת יעד; היום ממומש בעיקר העמוד השדרה של CertM Management → Scanner → MSCA (DCOM) ו־EJBCA ישיר. הרחבה:

מה תואם בדיוק לקוד

מה לא תואם / חסר בקוד

  1. Scanner 1 → EJBCA (REST API). בציור EJBCA יוצא מהסורק. בקוד EJBCA יוצא ישירות מ־CertmPlatform דרך Services/Clients/EjbcaClient.cs; הסוכן תומך רק ב־MSCA. אם זה ה־target — צריך לעטוף את EjbcaClient בצד הסוכן ולחשוף route ב־CertmScanner.
  2. CEP (החץ המקווקו ל־MSCA). לא ממומש. כל מסלול MSCA הוא DCOM דרך הסוכן. אין תמיכה ב־Certificate Enrollment Policy/Service (HTTPS-based MSCA).
  3. PKI Linux Agent Per OS and Version. לא קיים בקוד. אין סוכן Linux להפצה/חידוש תעודות בקצה.
  4. PKI Agent (משמאל למטה). לא קיים. בציור זה סוכן צד־לקוח (endpoint) ש: בקוד היום ACME עובד דרך Services/CA_Modules/Acme.cs שהוא stub (לא מנפיק תעודות בפועל), וקריאת ACME אמורה לצאת ישירות מ־CertmPlatform — אין endpoint agent ביניהם.

בנוסף, יש שלושה פרטים שלא מופיעים בציור אבל קיימים בקוד וכדאי שיהיו במודל המנטלי:

הציור של מה שיש היום בקוד

לצורך השוואה ישירה — זו ארכיטקטורת המערכת כפי שהיא ממומשת היום (ענף 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.

שאלה 4 — תעבור על הציור שלי ותגיד לי אם זה נכון

"תעבור על הציור שלי ותגיד לי אם זה נכון" — Alex Raitskin, 2026-05-14T08:36:55Z

מעבר נקודה־נקודה על הקופסאות והחצים בציור מול הקוד. ✓ = תואם, ⚠ = תואם חלקית, ✗ = לא קיים בקוד היום.

רכיב / חץ בציור סטטוס הערות
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).

סיכום ההפרשים

הציור שלך מתאר הרחבה בשלושה כיוונים מעבר למה שיש היום:

  1. סוכן endpoint חדש (PKI Agent) — לחידוש אוטומטי על שרתי קצה (Windows) + לתקשורת מול ACME.
  2. סוכן Linux מקביל — אותו תפקיד, פלטפורמה אחרת.
  3. הרחבת NetApps — מ־F5 בלבד לחבילה של 7+ ספקי load-balancer/WAF/gateway.

שני שינויים נוספים שכדאי להתייעץ עליהם לפני שמסמנים את הציור כסופי:

אם תאשר שזו אכן ארכיטקטורת היעד, אני אפתח issue/epic לכל פריט שמסומן ב־✗ ואצרף קישור ל־DEPENDENCIES.md.

שאלה 5 — מה צריך לתמוך בפרויקט? (נגזר מהציור של אלכס)

סיכום הפערים בין הציור של אלכס לקוד היום, כ־checklist של מה שצריך לממש. הלגנדה: ✓ = ממומש ועובד · ⚠ = ממומש חלקית/stub · ✗ = לא קיים.

1. שרתי CA (מקורות הנפקה)

יכולת סטטוס פערים / מה צריך לעשות
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).

2. סוכני קצה (Endpoint agents)

יכולת סטטוס פערים / מה צריך לעשות
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).

3. פרוטוקולי enrollment ללקוחות

יכולת סטטוס פערים / מה צריך לעשות
SCEP server routes קיימים ב־Controllers/ScepController.cs, אבל ה־handler לא מטפל ב־PKCS#7/PKIMessage אמיתי. אין החלפה ל־ScepLib. צריך מימוש מלא של draft-nourse-scep.

4. NetApps — יעדי הפצה של תעודות

יכולת סטטוס פערים / מה צריך לעשות
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. תלוי בגרסה.

5. יכולות חוצות־מערכת (cross-cutting)

יכולת סטטוס פערים / מה צריך לעשות
ניתוב פר־סוכן (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 המלא, יש כאן רוב פרויקט נפרד:

שווה לפצל את זה ל־epics ולתעדף לפני שמתחילים. אני מציע לאשר את הציור כ־target עם אלכס, אז לפתוח issue פר־שורה בטבלאות למעלה, ואז להחליט סדר עבודה (אולי קודם CEP+ACME, אז PKI Agent Windows, אז NetApps?).


קבצים רלוונטיים בקוד: Controllers/CaController.cs · Services/CAService.cs · Services/CA_Modules/MSCA.cs · Services/CA_Modules/MSCA_Foreign.cs · Services/Clients/CertmScannerClient.cs · CertmScanner/Services/MsCaLocal.cs