Το Certificate Pinning (καρφίτσωμα πιστοποιητικού) είναι μια τεχνική ασφαλείας κατά την οποία η εφαρμογή για κινητά ελέγχει ότι το πιστοποιητικό του διακομιστή ταιριάζει με ένα προκαθορισμένο δείγμα, αντί απλώς να εμπιστεύεται οποιοδήποτε πιστοποιητικό από την αλυσίδα CA. Σε αντίθεση με τον συνηθισμένο έλεγχο TLS, που βασίζεται σε εκατοντάδες αρχές πιστοποίησης, το pinning περιορίζει την εμπιστοσύνη σε ένα συγκεκριμένο πιστοποιητικό ή το δημόσιο κλειδί του. Σύμφωνα με τον OWASP Mobile Security Testing Guide (2024), η εφαρμογή του Certificate Pinning εξαλείφει το 100% των σεναρίων επιθέσεων Man-in-the-Middle που σχετίζονται με πλαστογράφηση πιστοποιητικού. OWASP MSTG, 2024
Κύρια σημεία
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, η καθεμία με τα δικά της χαρακτηριστικά αποθήκευσης και ελέγχου. Η επιλογή της μεθόδου εξαρτάται από την αρχιτεκτονική της εφαρμογής, τη συχνότητα ενημέρωσης των πιστοποιητικών και τις απαιτήσεις ευελιξίας.
| Τύπος 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 εξαρτάται από την αρχιτεκτονική και τις απαιτήσεις της εφαρμογής. Για δημόσιες εφαρμογές κινητών που λειτουργούν με 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 αυξάνει σημαντικά την ασφάλεια της εφαρμογής για κινητά, αλλά επιβάλλει 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 με χρήση OkHttp — της τυπικής βιβλιοθήκης για αιτήματα δικτύου. Το OkHttp παρέχει ενσωματωμένο CertificatePinner, το οποίο δέχεται SHA-256 κατακερματισμούς δημόσιων κλειδιών.
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, το κύριο εργαλείο 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 είναι σαν να αποθηκεύετε το δακτυλικό αποτύπωμα ενός φίλου στο τηλέφωνό σας: απομνημονεύετε πώς μοιάζει το «σωστό» πιστοποιητικό του διακομιστή και δεν εμπιστεύεστε κανέναν άλλον, ακόμα κι αν κάποιος παρουσιάσει διαπιστευτήρια από «επίσημη» αρχή.
Το κανονικό HTTPS εμπιστεύεται οποιοδήποτε πιστοποιητικό υπογεγραμμένο από οποιοδήποτε CA από εκατοντάδες αρχές. Το Certificate Pinning προσθέτει έναν έλεγχο «από πάνω»: το πιστοποιητικό δεν πρέπει απλώς να είναι έγκυρο, αλλά συγκεκριμένα αυτό που έχετε καταγράψει στον κώδικα της εφαρμογής.
Συνιστάται η αποθήκευση 2–3 pin: τρέχον και εφεδρικό pin για το νέο πιστοποιητικό. 1–2 μήνες πριν από την αλλαγή πιστοποιητικού, κυκλοφορήστε μια νέα έκδοση της εφαρμογής με το προστιθέμενο pin του μελλοντικού πιστοποιητικού. Μετά την αλλαγή, το παλιό pin διαγράφεται στην επόμενη έκδοση.
Ναι, μπορείτε. Το Pinning λειτουργεί με οποιαδήποτε πιστοποιητικά, συμπεριλαμβανομένου του Let's Encrypt. Είναι σημαντικό να θυμάστε ότι τα δωρεάν πιστοποιητικά έχουν μικρή διάρκεια ισχύος (3 μήνες), επομένως η στρατηγική εφεδρικών pin και η αυτόματη εναλλαγή καθίστανται υποχρεωτικές.
Για δοκιμή του pinning χρησιμοποιήστε Burp Suite ή mitmproxy. Εάν η εφαρμογή με pinning είναι ρυθμισμένη σωστά, το εργαλείο proxy δεν θα μπορέσει να υποκλέψει την κίνηση — η σύνδεση θα διακοπεί κατά τη handshake. Για δοκιμές ενσωμάτωσης χρησιμοποιήστε το MockWebServer από το OkHttp.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.