הטמעת הצמדת אישורים (Certificate Pinning) לאפליקציות מובייל

אפליקציית המובייל שלך חשופה ליירוט באמצעות פרוקסים או כלי pentest, מה שחושף נתונים ולוגיקת API. אנחנו מיישמים certificate pinning turnkey ב-iOS וב-Android, ומגנים על החיבורים מפני התקפות MITM. הצוות שלנו מגדיר public key pinning עם backup pins ובדיקות CI, ומבטיח הגנה אמינה ותפעול יציב של האפליקציה.

פיתוח ותמיכה בכל סוגי היישומים הניידים:

יישומים ניידים למידע ובידור
אפליקציות חדשות, משחקים, מדריכים, קטלוגים מקוונים, אפליקציות מזג אוויר, אפליקציות כושר ובריאות, אפליקציות נסיעות, אפליקציות חינוכיות, רשתות חברתיות ומסנג'רים, חידונים, בלוגים ופודקאסטים, פורומים, אגרגטורים
יישומים ניידים למסחר אלקטרוני
חנויות מקוונות, אפליקציות B2B, מרקטפלייסים, בורסות מקוונות, שירותי קאשבק, בורסות, פלטפורמות דרופשיפינג, תוכניות נאמנות, משלוחי מזון ומוצרים, מערכות תשלום.
יישומים ניידים לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, ניהול פרויקטים, כלים לצוותי מכירות, ניהול פיננסי, ניהול ייצור, ניהול לוגיסטיקה ומשלוחים, ניהול משאבי אנוש, מערכות ניטור נתונים
יישומים ניידים לשירותים אלקטרוניים
פלטפורמות מודעות מסווגות, בתי ספר מקוונים, בתי קולנוע מקוונים, פלטפורמות שירות אלקטרוניות, פלטפורמות קאשבק, אירוח וידאו, פורטלים נושאיים, פלטפורמות הזמנות ותזמון מקוונות, פלטפורמות מסחר מקוונות

אלה הם רק חלק מסוגי היישומים הניידים שאנו עובדים איתם, ולכל אחד מהם עשויים להיות מאפיינים ופונקציונליות ספציפיים משלו, המותאמים לצרכים ולמטרות הספציפיות של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 1734 השירותים
הטמעת הצמדת אישורים (Certificate Pinning) לאפליקציות מובייל
מורכב
~2-3 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית מובייל עבור FEEDME
    פיתוח אפליקציית מובייל עבור FEEDME
    971
  • פיתוח אפליקציית מובייל עבור XOOMER
    פיתוח אפליקציית מובייל עבור XOOMER
    868
  • פיתוח אפליקציית מובייל עבור RHL
    פיתוח אפליקציית מובייל עבור RHL
    1288
  • פיתוח אפליקציית מובייל עבור ZIPPY
    פיתוח אפליקציית מובייל עבור ZIPPY
    1143
  • פיתוח אפליקציית מובייל עבור Affhome
    פיתוח אפליקציית מובייל עבור Affhome
    1076
  • פיתוח אפליקציית מובייל עבור חברת FLAVORS
    פיתוח אפליקציית מובייל עבור חברת FLAVORS
    677

הטמעת Certificate Pinning לאפליקציות מובייל

אפליקציות מיורטות באמצעות Charles Proxy או Frida — קריאת בקשות, שינוי תגובות, חקירת ה-API. זה קורה מכיוון שחיבורי TLS מאמתים אישורים מול רשויות אישורים (CA) של המערכת, והמשתמש (או הבודק) פשוט הוסיף את ה-CA שלו כרשות מהימנה. במהלך 5 השנים האחרונות, הטמענו Certificate Pinning ביותר מ-30 פרויקטים למובייל — מסטארטאפים פינטק ועד פתרונות ארגוניים. זה סוגר לחלוטין את וקטור התקיפה MITM במכשירים שאינם מושרשים. אנו מגדירים Pinning ב-iOS וב-Android, כולל מפתחות גיבוי ובדיקות CI. לוחות הזמנים נעים בין 2 ל-5 ימים, תלוי במספר השרתים. רוצים להעריך את הפרויקט שלכם? פשוט צרו קשר.

למה Public Key Pinning עדיף על Certificate Pinning

Certificate Pinning — הלקוח מאחסן את האישור המלא (או את ה-hash מסוג SHA-256 שלו) ומשווה אותו למה שהשרת שולח. האישור משתנה בכל חידוש — כל 1-2 שנים. אם תשכחו לעדכן את ה-pin לפני הרוטציה, האפליקציה תפסיק לעבוד עבור כל המשתמשים בו-זמנית.

Public Key Pinning (בסגנון HPKP) — מצמיד את ה-hash של SubjectPublicKeyInfo. כאשר האישור מתחדש, המפתח הפרטי נשאר לעיתים קרובות זהה, כך שה-pin נשאר תקף. זו הבחירה הנכונה לסביבת ייצור. בנוסף, שמרו על pin גיבוי — hash של מפתח גיבוי (יכול להיות מה-CA שלכם). הבה נשווה בין הגישות:

מאפיין Certificate Pinning Public Key Pinning
תדירות עדכון לקוח כל 1-2 שנים כל כמה שנים
סיכון לחסימת משתמשים גבוה נמוך
מורכבות ההטמעה נמוכה בינונית
גמישות בעת החלפת CA דורש עדכון לעיתים קרובות לא נדרש

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

שלב תיאור משך
ניתוח תשתית זיהוי כל השרתים, קבלת אישורים ומפתחות ציבוריים 1-2 שעות
יצירת Hash חישוב SHA-256 SPKI עבור כל מפתח, כולל pin גיבוי 30 דקות
הטמעת Pinning שילוב אימות בשכבת הרשת (TrustKit, OkHttp, Flutter) 1-2 ימים
הגדרת CI שלב לאימות שבניית release כוללת pinning 1-2 שעות
בדיקות אימות חסימה דרך פרוקסי, בדיקת pin גיבוי יום אחד
תיעוד נוהל רוטציה ואנשי קשר לעדכון חירום שעה אחת

iOS: NSURLSession + TrustKit

func urlSession( _ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void ) {
    guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust, let serverTrust = challenge.protectionSpace.serverTrust else {
        completionHandler(.cancelAuthenticationChallenge, nil)
        return
    }
    guard let serverCert = SecTrustGetCertificateAtIndex(serverTrust, 0), let serverKey = SecCertificateCopyKey(serverCert) else {
        completionHandler(.cancelAuthenticationChallenge, nil)
        return
    }
    let serverKeyData = SecKeyCopyExternalRepresentation(serverKey, nil)! as Data
    let serverKeyHash = sha256(data: serverKeyData)
    let pinnedHashes = ["base64encodedSHA256ofSubjectPublicKeyInfo=="]
    if pinnedHashes.contains(serverKeyHash) {
        completionHandler(.useCredential, URLCredential(trust: serverTrust))
    } else {
        completionHandler(.cancelAuthenticationChallenge, nil)
    }
}

לפרויקטים עם מספר שרתים, השתמשו ב-TrustKit — מוגדר דרך Info.plist, תומך ב-pins גיבוי ודיווח הפרות.

Android: OkHttp CertificatePinner

val certificatePinner = CertificatePinner.Builder()
    .add("api.example.com", "sha256/AAAAAAAAA...primaryKeyHash==")
    .add("api.example.com", "sha256/BBBBBBBBB...backupKeyHash==")
    .build()
val client = OkHttpClient.Builder()
    .certificatePinner(certificatePinner)
    .build()

OkHttp מחשב אוטומטית את ה-SHA-256 של SubjectPublicKeyInfo. במקרה של אי-התאמה — func urlSession( _ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void ) { guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust, let serverTrust = challenge.protectionSpace.serverTrust else { completionHandler(.cancelAuthenticationChallenge, nil) return } guard let serverCert = SecTrustGetCertificateAtIndex(serverTrust, 0), let serverKey = SecCertificateCopyKey(serverCert) else { completionHandler(.cancelAuthenticationChallenge, nil) return } let serverKeyData = SecKeyCopyExternalRepresentation(serverKey, nil)! as Data let serverKeyHash = sha256(data: serverKeyData) let pinnedHashes = ["base64encodedSHA256ofSubjectPublicKeyInfo=="] if pinnedHashes.contains(serverKeyHash) { completionHandler(.useCredential, URLCredential(trust: serverTrust)) } else { completionHandler(.cancelAuthenticationChallenge, nil) } } . קבלו hashes דרך openssl:

openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \
 | openssl x509 -pubkey -noout \
 | openssl pkey -pubin -outform der \
 | openssl dgst -sha256 -binary \
 | openssl enc -base64

עבור Flutter, השתמשו בחבילת val certificatePinner = CertificatePinner.Builder() .add("api.example.com", "sha256/AAAAAAAAA...primaryKeyHash==") .add("api.example.com", "sha256/BBBBBBBBB...backupKeyHash==") .build() val client = OkHttpClient.Builder() .certificatePinner(certificatePinner) .build() או ב-wrapper native דרך ערוצי פלטפורמה.

מהם הסיכונים בהטמעה לא נכונה?

הכאב התפעולי העיקרי — רוטציית מפתחות. 30+ ימים לפני חידוש האישור, פרסמו עדכון עם pin גיבוי חדש, תנו למשתמשים לעדכן, ואז סובבו את המפתח. אם זה לא נעשה, האפליקציה מאבדת קישוריות לשרת עבור כל הלקוחות. במבני debug, pinning מושבת בדרך כלל באמצעות דגל SSLPeerUnverifiedException או flavor נפרד. ודאו שבניית release ב-CI נבנית עם pinning — אחרת אתם מאבדים הגנה.

טעויות נפוצות בהטמעה
  • שימוש ב-pin יחיד בלבד — אם המפתח נפגע, נדרש עדכון חירום.
  • אחסון pins בטקסט פשוט בבינארי — תוקף יכול לחלץ אותם באמצעות ניתוח סטטי. השתמשו בהסתרה או בהצפנה.
  • אין fallback לאישור — אם כל ה-pins לא תואמים, האפליקציה צריכה לחסום את החיבור, לא להתעלם מהשגיאה.
  • רוטציית מפתחות ללא עדכון לקוח מוקדם — הגורם השכיח ביותר להפסקות המוניות.

מה כלול בעבודה שלנו

  • הגדרת Pinning עבור כל שרתי האפליקציה (iOS + Android, עד 5 שרתים כלולים).
  • Pin גיבוי — הוספת hash של מפתח גיבוי לרוטציה חלקה.
  • אינטגרציית CI — הגדרת דגלים להפרדת מבני debug/release.
  • תיעוד — תיאור נוהל עדכון ה-pin ואנשי קשר לשחרור חירום.
  • תמיכה — למשך 30 יום לאחר ההטמעה, אנו עונים על שאלות ועוזרים ברוטציה הראשונה.

לוחות זמנים

הגדרת Pinning לשרת אחד עם pins גיבוי — 2-3 ימים. לפרויקטים עם 3+ שרתים — עד 5 ימים. התמחור מחושב באופן אישי, בהתאם למורכבות ולמספר הפלטפורמות.

קבלו ייעוץ: צרו קשר, ואנחנו נעריך את לוחות הזמנים לפרויקט שלכם. כתבו לנו — נעריך את הפרויקט שלכם תוך יום אחד.