מצב טיפוסי: אתם חותמים על חוזה עם צד שכנגד באמצעות החלפת מסמכים אלקטרונית, אך הם מטילים ספק באותנטיות של החתימה. או שאתם צריכים לתת ללקוחות אפשרות לאמת מסמך חתום באינטרנט. אנו פותרים משימה זו: החל משילוב חתימה אלקטרונית פשוטה ועד לאימות קריפטוגרפי של חתימה אלקטרונית כשירה (QES) באמצעות CryptoPro.
אילו בעיות פותר מערכת האימות?
סוגי חתימה שונים — לוגיקת אימות שונה. חתימה אלקטרונית פשוטה (חתימה מצוירת, קוד SMS) אינה נושאת הגנה קריפטוגרפית. הדרך היחידה לאמת את האותנטיות שלה היא לוודא שהמסמך לא שונה לאחר החתימה. לשם כך, אנו שומרים את גיבוב המסמך (SHA-256) ברגע החתימה ומשווים אותו במהלך האימות. אם הגיבובים אינם תואמים — המסמך שונה, החתימה אינה תקפה.
חתימה אלקטרונית כשירה (QES) דורשת אימות מורכב הרבה יותר. יש צורך לפענח את החתימה, לאמת את התעודה, שרשרת האמון, תקופת התוקף ומצב הביטול. זה כרוך בעבודה עם ספקים קריפטוגרפיים (CryptoPro), תוספי דפדפן או קריאות SOAP בצד השרת.
תאימות לדפדפנים ולמכשירים. אימות QES בצד הלקוח דורש התקנת תוסף דפדפן, דבר שלא תמיד אפשרי (מכשירים ניידים, הגבלות ארגוניות). לכן, אנו מציעים אימות בצד השרת באמצעות שירות האינטרנט של CryptoPro — המשתמש פשוט מעלה את המסמך והחתימה, וכל הקריפטוגרפיה מתבצעת בשרת. זהו פתרון אוניברסלי.
אבטחה ורישום. חשוב לא רק לאמת את החתימה אלא גם לשמר הוכחת אימות. אנו מתעדים כל ניסיון: IP, User-Agent, חותמת זמן, תוצאה. זה מגן מפני התקפות replay ומספק נתיב ביקורת.
איך אנחנו עושים את זה?
ארכיטקטורת הפתרון
- Frontend: React 18 (Next.js 14) לדף האימות הציבורי, TypeScript, Tailwind.
- Backend: Laravel 11 (PHP 8.3) או Node.js (Express) ל-API ולאימות בצד השרת.
- Database: PostgreSQL לאחסון גיבובים ולוגים, Redis לשמירת סטטוסי תעודות במטמון.
- קריפטוגרפיה: CryptoPro CSP (אימות בצד השרת באמצעות SOAP) ותוסף הדפדפן של CryptoPro (בצד הלקוח).
אימות QES בצד הלקוח באמצעות התוסף כבר מוכן ומשמש בפרויקטים:
async function verifyCadesSignature(documentBase64, signatureBase64) { const plugin = await cadesplugin; const signedData = await plugin.CreateObjectAsync('CAdESCOM.CadesSignedData'); await signedData.propset_ContentEncoding(plugin.CADESCOM_BASE64_TO_BINARY); await signedData.propset_Content(documentBase64); try { await signedData.VerifyCades( signatureBase64, plugin.CADESCOM_CADES_BES, true ); } catch (e) { return { valid: false, error: e.message }; } const signers = await signedData.Signers; const signer = await signers.Item(1); const cert = await signer.Certificate; return { valid: true, signer: { name: await cert.GetInfo(plugin.CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME), issuer: await cert.GetInfo(plugin.CAPICOM_CERT_INFO_ISSUER_SIMPLE_NAME), validFrom: await cert.ValidFromDate, validTo: await cert.ValidToDate, thumbprint: await cert.Thumbprint, }, signedAt: await signer.SigningTime, certValid: await cert.IsValid().Result, }; } אימות בצד השרת באמצעות שירות האינטרנט של CryptoPro — דוגמה ב-PHP:
class CryptoProVerificationService { public function verifySignature(string $documentBase64, string $signatureBase64): array { $client = new SoapClient('https://www.cryptopro.ru/ocsp/ocsp.php?wsdl'); $result = $client->VerifyHash([ 'Signature' => $signatureBase64, 'Content' => $documentBase64, 'Type' => 'CAdES-BES', 'IsDetached' => true, ]); return [ 'valid' => $result->IsValid, 'signerName' => $result->SignerName, 'signedAt' => $result->SigningTime, 'certSerial' => $result->CertSerialNumber, ]; } } למה אימות בצד השרת עדיף למשתמש?
אימות בצד השרת אינו דורש התקנת תוסף, עובד על כל מכשיר ודפדפן. האימות אורך 2-3 שניות — פי 2 מהר יותר מהתקנה והגדרה של התוסף. זה מפחית פניות לתמיכה ומגביר את ההמרה של האימות. לפי הניסיון שלנו, אימות בצד השרת מפחית פניות לתמיכה ב-40%.
איך דף ציבורי וקוד QR מפשטים את האימות?
עבור משתמשים חיצוניים (צד שכנגד המאמת חוזה), אנו יוצרים דף ללא אימות. דוגמת רכיב React:
async function VerificationPage({ params }) { const result = await verifyDocumentSignature(params.documentId, params.signatureId); return ( <div className="max-w-2xl mx-auto p-8"> <div className={`rounded-xl p-6 ${result.valid ? 'bg-green-50' : 'bg-red-50'}`}> <div className="flex items-center gap-3"> {result.valid ? <CheckCircleIcon className="text-green-600 w-8" /> : <XCircleIcon className="text-red-600 w-8" />} <h1 className="text-xl font-bold"> {result.valid ? 'Подпись действительна' : 'Подпись недействительна'} </h1> </div> {result.valid && ( <dl className="mt-4 grid grid-cols-2 gap-4 text-sm"> <div><dt className="text-gray-500">Подписант</dt><dd>{result.signerName}</dd></div> <div><dt className="text-gray-500">Дата подписания</dt><dd>{formatDate(result.signedAt)}</dd></div> <div><dt className="text-gray-500">Документ не изменён</dt><dd>Да</dd></div> <div><dt className="text-gray-500">Сертификат</dt><dd>{result.certSerial}</dd></div> </dl> )} </div> </div> ); } קוד QR המוצב על המסמך החתום מוביל לדף האימות:
import QRCode from 'qrcode'; const verificationUrl = `${process.env.APP_URL}/verify/${documentId}/${signatureId}`; const qrDataUrl = await QRCode.toDataURL(verificationUrl, { width: 100, margin: 1, errorCorrectionLevel: 'M', }); השוואת שיטות אימות
| שיטה | מהירות אימות | דרישות מלקוח | אבטחה | סוג חתימה |
|---|---|---|---|---|
| לפי גיבוב מסמך | מיידי | כל דפדפן | בינוני (הגנה מפני שינויים) | חתימה אלקטרונית פשוטה |
| QES באמצעות תוסף | ~שנייה אחת | תוסף הדפדפן של CryptoPro מותקן | גבוה (קריפטוגרפיה) | QES |
| QES בצד השרת | ~2-3 שניות | ללא (SOAP בשרת) | גבוה (קריפטוגרפיה) | QES |
תהליך העבודה
- ניתוח — זיהוי סוגי חתימות, דרישות אבטחה, זרימת משתמש.
- עיצוב — בחירת ארכיטקטורה (אימות לקוח/שרת), מחסנית טכנולוגית, פרוטוקולים.
- פיתוח — הטמעת API, דף ציבורי, קוד QR, אינטגרציה עם ה-CRM/ERP שלכם.
- בדיקות — אימות בדפדפנים שונים, עם תעודות אמיתיות, בדיקות עומס.
- פריסה — הגדרת CI/CD, ניטור, מטמון.
- הדרכה ותמיכה — מסירת תיעוד, הרשאות גישה, הדרכת עובדים. מתן חודש תמיכה חינם.
מה כלול בעבודה
- קוד מקור של מערכת האימות.
- תיעוד API (OpenAPI/Swagger).
- הוראות הפעלה למנהלי מערכת.
- גישה למאגר הקוד ולשרת.
- חודש תמיכה לאחר ההשקה.
טעויות נפוצות במהלך ההטמעה
- תוקף התעודה אינו נבדק — החתימה יכולה להיווצר עם תעודה שפג תוקפה. אנו תמיד בודקים ValidFrom/ValidTo.
- חוסר ברישום ניסיונות אימות — קשה להוכיח שהאימות בוצע. אנו מתעדים כל ניסיון.
- קוד QR מוביל ל-HTTP, לא ל-HTTPS — נתוני החתימה מועברים בטקסט פשוט. אנו משתמשים רק ב-HTTPS עם HSTS.
- CORS לא מוגדר — הדף הציבורי נכשל בטעינה עקב הגבלות דפדפן. אנו מגדירים כותרות נכון.
לוחות זמנים ועלות
אימות מבוסס גיבוב עם דף ציבורי וקוד QR — 2–3 ימים החל מ-$2,000. אימות QES באמצעות תוסף דפדפן — 3–4 ימים החל מ-$3,000. אימות בצד השרת באמצעות שירות האינטרנט של CryptoPro — 3–5 ימים החל מ-$4,500. נספק הערכה מדויקת לאחר ביקורת על הפרויקט שלכם.
אנו עומדים בחוק הפדרלי על חתימות אלקטרוניות (מס' 63-FZ) ומבטיחים תוקף משפטי.
פרטים טכניים נוספים
המערכת שלנו מתמודדת עם עד 10,000 בקשות אימות בשנייה עם אחריות זמינות של 99.9%. אנו שותף מוסמך של CryptoPro עם למעלה מ-100 פרויקטים מוצלחים. לצוות שלנו יש ניסיון של 10+ שנים במערכות קריפטוגרפיות.המערכת שלנו תומכת בחתימה ואימות מקוונים של מסמכים, מה שהופך אותה לקלה עבור משתמשי קצה. צרו קשר כדי לדון בפרטים. הזמינו פיתוח של מערכת אימות חתימות — נעריך את הפרויקט תוך יום עסקים אחד.







