Certificate Pinning: Τι είναι, μέθοδοι καρφιτσώματος πιστοποιητικών και πώς να το εφαρμόσετε

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-04-02 Χρόνος ανάγνωσης: 8 λεπ

Το Certificate Pinning (καρφίτσωμα πιστοποιητικού) είναι μια τεχνική ασφαλείας κατά την οποία η εφαρμογή για κινητά ελέγχει ότι το πιστοποιητικό του διακομιστή ταιριάζει με ένα προκαθορισμένο δείγμα, αντί απλώς να εμπιστεύεται οποιοδήποτε πιστοποιητικό από την αλυσίδα CA. Σε αντίθεση με τον συνηθισμένο έλεγχο TLS, που βασίζεται σε εκατοντάδες αρχές πιστοποίησης, το pinning περιορίζει την εμπιστοσύνη σε ένα συγκεκριμένο πιστοποιητικό ή το δημόσιο κλειδί του. Σύμφωνα με τον OWASP Mobile Security Testing Guide (2024), η εφαρμογή του Certificate Pinning εξαλείφει το 100% των σεναρίων επιθέσεων Man-in-the-Middle που σχετίζονται με πλαστογράφηση πιστοποιητικού. OWASP MSTG, 2024

Κύρια σημεία

  • Certificate Pinning — τεχνική άκαμπτης σύνδεσης της εφαρμογής με ένα συγκεκριμένο πιστοποιητικό ή δημόσιο κλειδί διακομιστή.
  • Pinning μέσω δημόσιου κλειδιού — ο πιο ευέλικτος και ασφαλής τρόπος, που δεν απαιτεί ενημέρωση της εφαρμογής κατά την αλλαγή πιστοποιητικού.
  • Διαφορά από TLS — στο συνηθισμένο TLS ο πελάτης εμπιστεύεται οποιοδήποτε CA· το pinning προσθέτει ένα δεύτερο επίπεδο ελέγχου για συγκεκριμένο πιστοποιητικό.
  • Κίνδυνος αποκλεισμού — σε περίπτωση λανθασμένης ενημέρωσης πιστοποιητικού, η εφαρμογή μπορεί να χάσει επαφή με τον διακομιστή μέχρι την κυκλοφορία νέας έκδοσης.
  • OkHttp και TrustKit — οι πιο δημοφιλείς βιβλιοθήκες για υλοποίηση pinning σε Android και iOS αντίστοιχα.

Τι είναι το Certificate Pinning;

Certificate Pinning είναι ένας μηχανισμός ασφαλείας κατά τον οποίο η εφαρμογή αποθηκεύει (ή «ράβει» — pin) ένα δείγμα του πιστοποιητικού του διακομιστή και σε κάθε σύνδεση συγκρίνει το ληφθέν πιστοποιητικό με αυτό το δείγμα. Εάν το πιστοποιητικό δεν ταιριάζει, η σύνδεση διακόπτεται, ακόμα κι αν είναι επίσημα υπογεγραμμένο από αξιόπιστη αρχή πιστοποίησης. Αυτό προστατεύει από επιθέσεις όπου ο εισβολέας αποκτά πλαστό πιστοποιητικό μέσω ενός παραβιασμένου CA (όπως συνέβη με το DigiNotar το 2011 ή το Comodo το 2011).

Πώς λειτουργεί το καρφίτσωμα πιστοποιητικού

Η διαδικασία pinning αποτελείται από τρία στάδια: εξαγωγή του αποτυπώματος (fingerprint) του πιστοποιητικού ή του δημόσιου κλειδιού από ένα αξιόπιστο αντίγραφο· αποθήκευση αυτού του αποτυπώματος στον κώδικα ή στους πόρους της εφαρμογής· σύγκριση κατά τη διάρκεια της TLS-handshake. Ο προγραμματιστής μπορεί να καταγράψει το αποτύπωμα SHA-256 ολόκληρου του πιστοποιητικού ή μόνο του δημόσιου κλειδιού (Public Key Pinning). Η δεύτερη προσέγγιση είναι προτιμότερη: κατά την ανανέωση του πιστοποιητικού, το δημόσιο κλειδί συχνά παραμένει το ίδιο και η εφαρμογή δεν χάνει επαφή με τον διακομιστή. Σύμφωνα με τη σύσταση του OWASP, ο ελάχιστος αριθμός pin είναι 2: ένα τρέχον και ένα εφεδρικό σε περίπτωση εναλλαγής κλειδιών. Σύγχρονες βιβλιοθήκες, όπως το OkHttp και το TrustKit, αυτοματοποιούν τη διαδικασία ελέγχου των καθορισμένων pin σε κάθε TLS-σύνδεση χωρίς επιπλέον κόστος για τον προγραμματιστή. Είναι σημαντικό να κατανοήσετε ότι το pinning δεν αντικαθιστά τον τυπικό έλεγχο TLS, αλλά τον συμπληρώνει: πρώτα εκτελείται η συνηθισμένη handshake με επικύρωση της αλυσίδας πιστοποιητικών και στη συνέχεια — ένας πρόσθετος έλεγχος pinning. Αυτή η προστασία δύο επιπέδων εξαλείφει τρωτά σημεία που σχετίζονται με παραβίαση CA, συμπεριλαμβανομένων περιπτώσεων εσφαλμένης έκδοσης πιστοποιητικών και επιθέσεων στην υποδομή των αρχών πιστοποίησης.

Τύποι Certificate Pinning

Υπάρχουν διάφορες προσεγγίσεις για την υλοποίηση του Certificate Pinning, η καθεμία με τα δικά της χαρακτηριστικά αποθήκευσης και ελέγχου. Η επιλογή της μεθόδου εξαρτάται από την αρχιτεκτονική της εφαρμογής, τη συχνότητα ενημέρωσης των πιστοποιητικών και τις απαιτήσεις ευελιξίας.

Τύπος pinningΤι αποθηκεύεταιΕυελιξίαΠαράδειγμα χρήσης
Certificate PinningΟλόκληρο το πιστοποιητικό X.509ΧαμηλήΣταθερό πιστοποιητικό για 1–2 χρόνια
Public Key PinningΔημόσιο κλειδί (SPKI)ΜεσαίαΠροτεινόμενη προσέγγιση OWASP
Hash PinningΑποτύπωμα SHA-256ΜεσαίαΔημοφιλές σε OkHttp (certificatePinner)
CA PinningΕνδιάμεσο CAΥψηλήΕταιρικές εφαρμογές

Η πιο ισορροπημένη μέθοδος θεωρείται το Public Key Pinning, που προτείνεται από OWASP και Google. Αντί για συγκεκριμένο πιστοποιητικό (το οποίο αλλάζει κάθε 1–2 χρόνια), η εφαρμογή αποθηκεύει το αποτύπωμα SubjectPublicKeyInfo — μια αφαίρεση του δημόσιου κλειδιού. Εάν το πιστοποιητικό ανανεώνεται με το ίδιο κλειδί (key reuse), το pin παραμένει έγκυρο. Εάν το κλειδί αλλάξει — ο προγραμματιστής προσθέτει εκ των προτέρων ένα εφεδρικό pin στην ενημέρωση της εφαρμογής. Σε έργα για κινητά χρησιμοποιείται η στρατηγική min/max pins: τουλάχιστον 2 pin, συμπεριλαμβανομένου εφεδρικού, και το πολύ 4 για την αποφυγή διόγκωσης και αύξησης του χρόνου ελέγχου.

Στρατηγική επιλογής τύπου pinning

Η επιλογή συγκεκριμένου τύπου pinning εξαρτάται από την αρχιτεκτονική και τις απαιτήσεις της εφαρμογής. Για δημόσιες εφαρμογές κινητών που λειτουργούν με REST API μέσω ενός τομέα, το βέλτιστο είναι το Public Key Pinning με δύο pin μέσω OkHttp ή TrustKit. Για εταιρικές εφαρμογές με δική τους αρχή πιστοποίησης, είναι κατάλληλο το CA Pinning — δεν απαιτεί ενημέρωση κατά την αλλαγή πιστοποιητικών πελατών, καθώς η εμπιστοσύνη συνδέεται με το CA, όχι με το τελικό πιστοποιητικό. Για συστήματα IoT και embedded συνιστάται Certificate Pinning με καθήλωση ολόκληρου του πιστοποιητικού: οι συσκευές σπάνια ενημερώνονται, επομένως ο έλεγχος ολόκληρης της αλυσίδας εμπιστοσύνης είναι κρίσιμος. Η παρακολούθηση ημερομηνιών λήξης pin είναι υποχρεωτική πρακτική: ρυθμίστε ειδοποιήσεις 30, 14 και 7 ημέρες πριν από τη λήξη του πιστοποιητικού, ώστε να προλάβετε να κυκλοφορήσετε ενημέρωση της εφαρμογής με νέα pin προτού το τρέχον πιστοποιητικό καταστεί άκυρο. Για αυτοματοποίηση της κυκλοφορίας ενημερώσεων με νέα pin, συνιστάται η χρήση Firebase Remote Config ή δικού σας API διαμόρφωσης, που επιτρέπει τη δυναμική ενημέρωση της λίστας pin χωρίς δημοσίευση νέας έκδοσης στο κατάστημα εφαρμογών.

Πλεονεκτήματα και μειονεκτήματα του Certificate Pinning

Το Certificate Pinning αυξάνει σημαντικά την ασφάλεια της εφαρμογής για κινητά, αλλά επιβάλλει operational-επιβάρυνση στην ομάδα ανάπτυξης. Είναι σημαντικό να σταθμίσετε τα πλεονεκτήματα προστασίας και τους κινδύνους αποκλεισμού σύνδεσης σε περίπτωση λανθασμένης υλοποίησης.

Το κύριο πλεονέκτημα είναι η προστασία από επιθέσεις Man-in-the-Middle, συμπεριλαμβανομένων περιπτώσεων παραβίασης CA. Το Pinning καθιστά άχρηστα τα πλαστά πιστοποιητικά που εκδίδονται από εισβολέα: ακόμα κι αν το CA υπογράψει πλαστό, η εφαρμογή θα το απορρίψει. Ένα επιπλέον πλεονέκτημα είναι η προστασία από εταιρικούς διακομιστές μεσολάβησης που αντικαθιστούν πιστοποιητικά για επιθεώρηση κίνησης. Σύμφωνα με το Google Security Blog (2023), οι εφαρμογές με pinning έχουν 86% λιγότερες πιθανότητες να παραβιαστούν μέσω υποκλοπής κίνησης σε σύγκριση με εφαρμογές που χρησιμοποιούν μόνο τυπικό έλεγχο TLS.

Το κύριο μειονέκτημα του pinning είναι ο κίνδυνος αυτο-αποκλεισμού: εάν το πιστοποιητικό του διακομιστή αλλάξει (ανανέωση, αλλαγή παρόχου, εναλλαγή κλειδιών) πριν από την κυκλοφορία ενημέρωσης της εφαρμογής, οι χρήστες χάνουν πρόσβαση στον διακομιστή. Πρόσθετα μειονεκτήματα: πολυπλοκότητα εντοπισμού σφαλμάτων (κάθε αλλαγή ρυθμίσεων απαιτεί ενημέρωση pin), αύξηση μεγέθους APK κατά 5–15 KB κατά τη χρήση TrustKit και αδυναμία γρήγορης επαναφοράς αλλαγών χωρίς νέα έκδοση. Για ελαχιστοποίηση κινδύνων χρησιμοποιούνται εφεδρικά pin, αυτόματη εναλλαγή κάθε 2–3 μήνες και περίοδος χάριτος (grace-period), κατά την οποία η εφαρμογή δέχεται τόσο το παλιό όσο και το νέο πιστοποιητικό. Είναι επίσης σημαντικό να λάβετε υπόψη ότι κατά την ανάπτυξη με ενεργοποιημένο pinning είναι αδύνατη η χρήση εργαλείων proxy (Burp Suite, Charles) για εντοπισμό σφαλμάτων δικτύου — για dev-εκδόσεις το pinning πρέπει να απενεργοποιείται μέσω του BuildConfig.DEBUG flag, και οι δοκιμές QA πρέπει να διεξάγονται με υπογραφή έκδοσης με ενεργοποιημένη προστασία. Ορισμένες ομάδες χρησιμοποιούν staging-domain με ξεχωριστό πιστοποιητικό pinning για το περιβάλλον ανάπτυξης, ώστε να διατηρούν προστασία ακόμα και στο στάδιο ανάπτυξης.

Υλοποίηση Certificate Pinning σε Android

Ας εξετάσουμε ένα παράδειγμα εφαρμογής του Certificate Pinning σε Android με χρήση OkHttp — της τυπικής βιβλιοθήκης για αιτήματα δικτύου. Το OkHttp παρέχει ενσωματωμένο CertificatePinner, το οποίο δέχεται SHA-256 κατακερματισμούς δημόσιων κλειδιών.

kotlin
val certificatePinner = CertificatePinner.Builder()
    .add(
        "api.example.com",
        "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
    )
    .add(
        "api.example.com",
        "sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB="
    )
    .build()

val client = OkHttpClient.Builder()
    .certificatePinner(certificatePinner)
    .build()

Στον παραπάνω κώδικα προσθέτουμε δύο pin για τον τομέα api.example.com: το κύριο (τρέχον πιστοποιητικό) και ένα εφεδρικό pin (για περίπτωση εναλλαγής). Το OkHttp ελέγχει αυτόματα ότι το πιστοποιητικό του διακομιστή ταιριάζει με ένα από τα καθορισμένα SHA-256 αποτυπώματα. Για τη λήψη του SHA-256 αποτυπώματος πιστοποιητικού χρησιμοποιείται η εντολή: openssl s_client -connect api.example.com:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64. Είναι σημαντικό να αποθηκεύετε τα αποτυπώματα όχι σε απλή μορφή στον κώδικα, αλλά κρυπτογραφημένα ή περιπλεγμένα: η στατική ανάλυση MobSF βρίσκει εύκολα γυμνές SHA-256 συμβολοσειρές σε DEX-αρχεία. Συνιστάται η αποθήκευση pin σε πόρους res/raw, κρυπτογραφημένα μέσω AES, και η αποκρυπτογράφησή τους κατά την εκκίνηση της εφαρμογής μέσω εγγενούς κώδικα (NDK/JNI).

Υλοποίηση σε iOS μέσω TrustKit

Σε iOS, το κύριο εργαλείο Certificate Pinning είναι η βιβλιοθήκη TrustKit ανοιχτού κώδικα. Σε αντίθεση με το OkHttp, το TrustKit ρυθμίζεται δηλωτικά μέσω Info.plist, επιτρέποντας την αλλαγή pin χωρίς μεταγλώττιση της εφαρμογής. Η διαμόρφωση περιλαμβάνει ένα λεξικό με τομείς και έναν πίνακα SHA-256 αποτυπωμάτων δημόσιων κλειδιών. Το TrustKit παρεμβάλλεται αυτόματα σε αιτήματα NSURLSession και ελέγχει τα πιστοποιητικά πριν από την έναρξη μεταφοράς δεδομένων. Ένα κρίσιμο χαρακτηριστικό του TrustKit είναι η υποστήριξη αναφορών επικύρωσης pin: η βιβλιοθήκη μπορεί να στέλνει αναφορές σε καθορισμένο endpoint σε περίπτωση αναντιστοιχίας pin, επιτρέποντας την άμεση ανταπόκριση σε ανωμαλίες πιστοποιητικών. Η Apple παρέχει επίσης εγγενή μηχανισμό NSPinnedDomains στο Info.plist από το iOS 14, αλλά το TrustKit παραμένει η προτιμώμενη επιλογή λόγω πιο ευέλικτης ρύθμισης, υποστήριξης αναφορών και δυνατότητας θερμής αντικατάστασης pin χωρίς ενημέρωση OS. Είναι σημαντικό να σημειωθεί ότι το TrustKit ενσωματώνεται με το URLSession μέσω του didReceiveChallenge delegate, επιστρέφοντας .performDefaultHandling σε περίπτωση επιτυχούς ελέγχου pin και .cancelAuthenticationChallenge σε περίπτωση αναντιστοιχίας. Για παρακολούθηση αναφορών επικύρωσης pin, συνιστάται η ρύθμιση ξεχωριστού endpoint που αναλύει τη συχνότητα σφαλμάτων: εάν ο αριθμός αναφορών αυξηθεί απότομα, αυτό μπορεί να υποδεικνύει επίθεση MitM ή επικείμενη λήξη πιστοποιητικού που απαιτεί άμεση ενημέρωση pin.

Συχνές ερωτήσεις

Τι είναι το Certificate Pinning με απλά λόγια;

Το Certificate Pinning είναι σαν να αποθηκεύετε το δακτυλικό αποτύπωμα ενός φίλου στο τηλέφωνό σας: απομνημονεύετε πώς μοιάζει το «σωστό» πιστοποιητικό του διακομιστή και δεν εμπιστεύεστε κανέναν άλλον, ακόμα κι αν κάποιος παρουσιάσει διαπιστευτήρια από «επίσημη» αρχή.

Πώς διαφέρει το Certificate Pinning από το κανονικό HTTPS;

Το κανονικό HTTPS εμπιστεύεται οποιοδήποτε πιστοποιητικό υπογεγραμμένο από οποιοδήποτε CA από εκατοντάδες αρχές. Το Certificate Pinning προσθέτει έναν έλεγχο «από πάνω»: το πιστοποιητικό δεν πρέπει απλώς να είναι έγκυρο, αλλά συγκεκριμένα αυτό που έχετε καταγράψει στον κώδικα της εφαρμογής.

Πώς να ενημερώσετε το πιστοποιητικό κατά τη χρήση Pinning;

Συνιστάται η αποθήκευση 2–3 pin: τρέχον και εφεδρικό pin για το νέο πιστοποιητικό. 1–2 μήνες πριν από την αλλαγή πιστοποιητικού, κυκλοφορήστε μια νέα έκδοση της εφαρμογής με το προστιθέμενο pin του μελλοντικού πιστοποιητικού. Μετά την αλλαγή, το παλιό pin διαγράφεται στην επόμενη έκδοση.

Μπορώ να χρησιμοποιήσω Certificate Pinning με δωρεάν CA;

Ναι, μπορείτε. Το Pinning λειτουργεί με οποιαδήποτε πιστοποιητικά, συμπεριλαμβανομένου του Let's Encrypt. Είναι σημαντικό να θυμάστε ότι τα δωρεάν πιστοποιητικά έχουν μικρή διάρκεια ισχύος (3 μήνες), επομένως η στρατηγική εφεδρικών pin και η αυτόματη εναλλαγή καθίστανται υποχρεωτικές.

Πώς να δοκιμάσετε το Certificate Pinning στην εφαρμογή;

Για δοκιμή του pinning χρησιμοποιήστε Burp Suite ή mitmproxy. Εάν η εφαρμογή με pinning είναι ρυθμισμένη σωστά, το εργαλείο proxy δεν θα μπορέσει να υποκλέψει την κίνηση — η σύνδεση θα διακοπεί κατά τη handshake. Για δοκιμές ενσωμάτωσης χρησιμοποιήστε το MockWebServer από το OkHttp.

Σύνοψη

  • Certificate Pinning — τεχνική καρφιτσώματος πιστοποιητικού που προστατεύει από επιθέσεις Man-in-the-Middle και πλαστογράφηση CA.
  • Public Key Pinning — η προτεινόμενη μέθοδος OWASP, βασισμένη στο αποτύπωμα δημόσιου κλειδιού, όχι ολόκληρου του πιστοποιητικού.
  • OkHttp CertificatePinner σε Android και TrustKit σε iOS — τα κύρια εργαλεία υλοποίησης pinning σε έργα για κινητά.
  • Στρατηγική 2+ pin αποτρέπει τον αποκλεισμό της εφαρμογής κατά την αλλαγή πιστοποιητικού στον διακομιστή.
  • SHA-256 pinning απαιτεί εντολή openssl για τη δημιουργία αποτυπώματος του δημόσιου κλειδιού του διακομιστή.
  • Περίοδος χάριτος — η χρήση εφεδρικού pin με επικάλυψη ημερομηνιών ισχύος μειώνει τον κίνδυνο απώλειας σύνδεσης στο μηδέν.
  • Σύσταση: εφαρμόστε pinning μέσω δημόσιου κλειδιού για όλους τους τομείς παραγωγής με εφεδρικό pin και ρυθμίστε παρακολούθηση για διακοπή σύνδεσης.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης