Measurement5 דק׳ קריאה
בנינו מערכת חתימה דיגיטלית משלנו. זה לא אומר שזה היה קל
בבוקר החלטנו לא לקנות מערכת חתימה דיגיטלית, ובלילה כבר רצה אצלנו אחת משלנו. הקוד היה החלק הקל. יומן של כל מה שלא היה: מה בכוונה לא בנינו, אילו תקלות הופיעו רק בשימוש אמיתי, ולמה הקו שמציירים באצבע הוא החלק הכי פחות חשוב.
נכתב על ידי ניצן סויסה · מדידה ודאטה
29 בספטמבר, בוקר. על השולחן שלוש מערכות חתימה דיגיטלית בקוד פתוח. כולן רציניות, לכולן קהילה ותיעוד, ואף אחת לא מתאימה לנו. באותו לילה כבר רצה אצלנו מערכת חתימה משלנו, באוויר, עם מסמך בדיקה ראשון חתום ושמור בארכיון.
נשמע כמו עוד פוסט של "בניתי מוצר בערב אחד". הוא לא. זה יומן של כל מה שלא היה קל, וזה החלק המעניין. הקוד, כמו שתראו, היה החלק הכי פחות קשה בסיפור.
למה לא קנינו
כל מסמך שאנחנו מבקשים ממישהו לחתום עליו נוצר אצלנו: הצעת מחיר שנבנית מהנתונים ב-CRM, הסכם שהפרטים של הלקוח כבר מולאו בו, טופס הצטרפות. המערכות שבדקנו בנויות סביב PDF קיים: מעלים קובץ, גוררים תיבה למקום שבו החתימה אמורה לשבת. זה מצוין כשהמסמך זהה בכל פעם. אצלנו כל הצעת מחיר נראית אחרת: פעם שלוש שורות, פעם עשר, פעם עם הנחה ופעם בלי. מי שגורר תיבות על PDF כזה יגלה ביום השני שהתיבה יושבת על שורה 4 במקום על הסה"כ.
ומה שכן התאים לנו, אצל אחת המערכות ישב בתוכנית בתשלום, ואצל אחרת בלי ממשק חתימה בעברית. בעל עסק ששולח ללקוח שלו קישור לחתימה באנגלית מקבל, בתוך עשר דקות, טלפון של "מה זה הדבר הזה ששלחת לי?".
אז החלטנו לבנות. קטן, שלנו, ומתחיל מ-HTML ולא מ-PDF: המסמך הוא דף אינטרנט שהשדות יושבים בתוכו בדיוק איפה שהם צריכים. אותו קובץ מוצג כטופס בטלפון של מי שחותם, והופך ל-PDF סגור אחרי החתימה.
קודם כתבנו מה לא בונים
לפני שורת קוד אחת נכתב איפיון. החלק החשוב בו לא היה מה נכנס, אלא מה בכוונה נשאר בחוץ:
- חותם אחד לכל מסמך. חתימה נגדית של בעל העסק היא שורה מודפסת, לא עוד סבב.
- אין עורך שבו גוררים שדות. תבנית נכתבת פעם אחת, כמו דף אינטרנט, ומשרתת אלפי מסמכים.
- המערכת לא שולחת את הקישור לחתימה. שולח אותו התהליך שכבר קיים אצל העסק, ב-SMS, בוואטסאפ או במייל, איפה שכבר יש ניטור ואיפה שהלקוח מכיר את השולח. היא שולחת רק קוד אימות, וגם הוא כבוי כברירת מחדל.
- כמה חותמים על אותו מסמך, דומיין נפרד לכל לקוח: תוכנן, לא נבנה.
כל "לא" ברשימה הזאת הוא שבוע עבודה שלא היה צריך לקרות. ומערכת קטנה שמשרתת תהליך אמיתי כבר השבוע שווה יותר ממערכת מושלמת שעדיין באיפיון.
את הקוד כתב סוכן. את הקצוות מצאנו אנחנו
את הגרסה הראשונה כתב סוכן AI, בריפו נקי, לפי האיפיון, ביום אחד. ופה המקום להיות כנה: זה היה החלק הקל. אם הייתי עוצר שם, היה לי "מוצר" שעובד יפה בדמו ונשבר בשבוע הראשון.
לפני שהמערכת ראתה מסמך אחד של לקוח, היא עברה סקירת אבטחה ו-20 ממצאים תוקנו. אחר כך הרצנו אותה בעצמנו מקצה לקצה, על מסך בגודל של טלפון. שם נמצאו עוד שלוש תקלות, ואחת מהן הייתה קטלנית בדיוק למסמך שבשבילו בנינו את כל זה: השורות בטבלה של הצעת המחיר פשוט נעלמו. במילים פשוטות: המערכת ניקתה את המסמך מכל דבר חשוד לפני שמילאה בו את הנתונים, והניקוי לא הבין שהשורות עוד בדרך. הצעת מחיר בלי שורות היא דף עם סה"כ ותו לא. הפכנו את הסדר, קודם ממלאים ואז מנקים, והשורות חזרו.
ה-PDF הראשון שיצא לתהליך של לקוח הודפס מקצה לקצה, בלי שוליים, כי הגדרה אחת במעטפת דרסה את השוליים שביקשנו. טכנית הכל עבד. בפועל, אף אחד לא היה חותם על דף שנראה ככה.
כמה שעות אחר כך חיברנו תהליך שני: הסכם שיש בתוכו טופס פרטים מלא. ושם חיכתה הקלאסיקה: כתובת אתר בשדה "אתר". מי מקליד דבר כזה? כולם. זה בדיוק מה שהשדה ביקש. וכל מסמך כזה נכשל ברגע החתימה.

מה קרה שם: יש הגנה שמוודאת שהמסמך לא מנסה לטעון שום דבר מהאינטרנט בזמן שהוא הופך ל-PDF. ההגנה ראתה "https://" בתוך הטקסט שאדם הקליד, ופשוט סירבה. התיקון היה לצמצם את החיפוש למקומות שבאמת טוענים משהו, תמונה או קובץ, ולהוסיף בדיקות שלא יתנו לזה לחזור. נמצא ותוקן באותו לילה. ובדמו? בדמו אף אחד לא מקליד כתובת אתר.
ועוד אחת קטנה ומרושעת: כששולחים לחותם קישור חדש ומבטלים את הישן, הסדר קובע. ביטלנו קודם, וההודעה "בוטל" של הקישור הישן הספיקה לסמן את כל הרשומה במערכת של הלקוח כמבוטלת, עוד לפני שהיא הצביעה על הקישור החדש. הסדר הנכון: יוצרים חדש, מעדכנים את הרשומה, ורק אז מבטלים. אף אחת מהתקלות האלה לא מופיעה בדמו. כולן הופיעו ברגע שחיברנו תהליך אמיתי.
החתימה היא לא הציור
הדבר שהכי לא הבנתי עד שבנינו: הקו שהלקוח מצייר באצבע הוא החלק הכי פחות חשוב במסמך. ביום שיש ויכוח, מה ששווה משהו הוא כל מה שמסביב לו.

לכל מסמך שנחתם אצלנו מצורף עמוד ראיות: מי חתם, מתי המסמך נפתח בפעם הראשונה, מתי נחתם, מאיזה מכשיר, ואם היה קוד אימות. למסמך יש טביעת אצבע דיגיטלית של התוכן, כך שאם מישהו משנה אחר כך אפילו פסיק, הטביעה כבר לא תתאים. הקובץ כולו חתום בחותמת דיגיטלית שנשברת אם נוגעים בו. והעותק נשמר בארכיון שנעול למחיקה לשבע שנים, גם בפנינו. כן, גם אם נרצה. בעיקר אם נרצה.
אני לא עורך דין, ולא אכתוב פה מה בית משפט יגיד על מסמך כזה. אבל אני יודע מה ההבדל בין "יש לנו PDF עם ציור" לבין "יש לנו את כל מה שקרה, ואף אחד לא נגע בזה מאז".
חמש שאלות לפני שסומכים על מערכת חתימה
לא משנה אם קונים מוצר מוכר או מקבלים הצעה ממישהו שבנה אחד. אלה השאלות שהיינו שואלים:
- מה מצורף למסמך החתום חוץ מהציור? אם התשובה היא "PDF עם תמונה של חתימה", זה לא מספיק.
- מי יכול למחוק או לשנות מסמך שכבר נחתם, כולל הספק עצמו?
- מה קורה כשהחותם מקליד משהו לא צפוי? תבדקו בעצמכם: כתובת אתר, שם ארוך במיוחד, אימוג'י.
- איך המערכת שלכם יודעת שמישהו חתם, בלי שמישהו ייכנס לבדוק? המסמך החתום אמור להגיע לבד לרשומה של הלקוח.
- איך נראה מסך החתימה בטלפון, בעברית, אצל מי שמקבל קישור בפעם הראשונה בחייו?
אז כן, בנינו מערכת חתימה משלנו, והיא רצה היום בתוך תהליכים אמיתיים. ומי שמספר שבנה כזאת בערב אחד, כנראה בנה את הציור.
חתימה לוקחת שנייה. ראיה לוקחת עבודה.
רוצים שנסתכל על החשבון שלכם?
השאירו פרטים ונחזור אליכם תוך יום עסקים עם כיוון ראשוני - בלי התחייבות.
