Η Προεπισκόπηση συγκεντρωτικής ενημέρωσης Νοεμβρίου 2020 για Windows 10 έκδοση 2004 και νεότερες εκδόσεις, καθώς και η έκδοση συνάθροισης ενημερώσεων ασφαλείας και ποιότητας ιανουαρίου 2021 για .NET Framework 4.8 κυκλοφόρησαν μια αλλαγή για τη βελτίωση της διαδικασίας εκκαθάρισης για τα πιστοποιητικά X509Certificate2. Παρακάτω, παρέχουμε πρόσθετες διευκρινίσεις σχετικά με τη διάρκεια ζωής ενός ιδιωτικού κλειδιού στα Windows.

Από .NET Framework 2.0 υπάρχουν δύο διαφορετικοί τρόποι για τη φόρτωση ενός πιστοποιητικού και του συσχετισμένου ιδιωτικού κλειδιού του από ένα αρχείο PKCS#12 PFX: ως ένα αντικείμενο πιστοποιητικού μέσω μελών της κλάσης X509Certificate2 ή ως όλα τα πιστοποιητικά που υπάρχουν στο PFX μέσω των μεθόδων X509Certificate2Collection.Import.

Η προεπιλεγμένη συμπεριφορά είναι ότι το ιδιωτικό κλειδί φορτώνεται σε ένα μόνιμο (επώνυμο) κλειδί μέσω μίας από τις βιβλιοθήκες κρυπτογράφησης συστήματος, η οποία κάνει έμμεσα εγγραφή ενός αρχείου στο δίσκο.  Οι περισσότεροι καλούντες που φορτώνουν ένα PFX χρησιμοποιούν προσωρινά μόνο το αντικείμενο πιστοποιητικού, επομένως, όταν το .NET αποδεσμεύει τους εγγενείς πόρους που σχετίζονται με το πιστοποιητικό, διαγράφει επίσης το ιδιωτικό κλειδί.  Οι κύριες εξαιρέσεις σε αυτήν τη συμπεριφορά είναι

  1. Η σημαία X509KeyStorageFlags.PersistKeySet, η οποία έχει ως αποτέλεσμα τη σύνταξη αλλά τη διαγραφή του αρχείου,

  2. Η σημαία X509KeyStorageFlags.EphemeralKetSet, η οποία έχει ως αποτέλεσμα τη φόρτωση του ιδιωτικού κλειδιού στη μνήμη χωρίς αρχείο υποστήριξης,

  3. Ανώμαλος τερματισμός διεργασίας, που μπορεί να συμβεί όταν εκκρεμεί διαγραφή κλειδιού.

Αντίθετα, οι δύο διαφορετικοί τρόποι φόρτωσης των πιστοποιητικών χρησιμοποιούσαν πάντα διαφορετικούς μηχανισμούς για την παρακολούθηση, όταν είναι η κατάλληλη στιγμή για να διαγράψετε το ιδιωτικό κλειδί.  Η φόρτωση ενός μόνο πιστοποιητικού μέσω της κλάσης X509Certificate2 χρησιμοποιεί ένα δείκτη που είναι ορατός μόνο στο χρόνο εκτέλεσης .NET και ισχύει μόνο για τη συγκεκριμένη αναφορά αντικειμένου.  Η φόρτωση ενός PFX μέσω X509Certificate2Collection.Import χρησιμοποιεί ένα δείκτη στο εγγενές αντικείμενο πιστοποιητικού, το οποίο έχει ως αποτέλεσμα την κοινή χρήση "λογοδοσίας διαγραφής" σε όλα τα διαχειριζόμενα αντικείμενα που αντιπροσωπεύουν το ίδιο εγγενές πιστοποιητικό.  Αυτό σημαίνει ότι το νέο X509Certificate2(otherCert.Handle). Το Dispose() θα προκαλέσει τη διαγραφή του αρχείου ιδιωτικού κλειδιού κατά τη διάρκεια της κλήσης προς Dispose() εάν έγινε φόρτωση άλλουCert από ένα PFX μέσω X509Certificate2Collection.Import, αλλά όχι εάν φορτώθηκε από PFX μέσω οποιουδήποτε προγράμματος-μελών της κλάσης X509Certificate2.  Ορισμένα τμήματα του .NET δημιουργούν εσωτερικά νέα διαχειριζόμενα αντικείμενα X509Certificate2 από εγγενείς λαβές πιστοποιητικού, όπως η κλάση X509Chain και η μέθοδος X509Certificate2Collection.Find.  Αυτά τα τμήματα του πλαισίου εργασίας, καθώς και οποιαδήποτε τμήματα τα χρησιμοποιούν άμεσα ή έμμεσα, μπορεί να οδηγήσουν σε πρόωρη διαγραφή κλειδιών, καθώς τα αντικείμενα που δημιουργούν συλλέγουν σκουπίδια.

Παρουσιάστηκε σφάλμα στην αρχική έκδοση του .NET Framework 4.8, το οποίο είχε ως αποτέλεσμα το X509Certificate2Collection.Import να μην εφαρμόσει το δείκτη διαγραφής, ακόμα και αν δεν έχουν καθοριστεί ούτε το PersistKeySet ούτε το EphemeralKeySet. Το .NET κυκλοφόρησε μια επιδιόρθωση για αυτό το σφάλμα κατά τη συνάθροιση ενημερώσεων ασφαλείας και ποιότητας του Ιανουαρίου 2021 , για να αποφευχθεί η ακούσια συσσώρευση εγκαταλελειμμένων αρχείων ιδιωτικών κλειδιών.  Οι καλούντες που επηρεάζονται από αυτή την επιδιόρθωση μπορούν να καθορίσουν τη σημαία PersistKeySet για να επιστρέψουν στη συμπεριφορά (ακούσια διαφορετική) .NET Framework 4,8 RTM, ωστόσο αυτό θα έχει ως αποτέλεσμα τη συσσώρευση αρχείων που πρέπει να αντιμετωπιστεί με προσαρμοσμένη λογική εκκαθάρισης.

X509Certificate2Collection.Η εισαγωγή στο .NET Core για Windows και το .NET 5+ για Windows συμπεριφέρονται με τον ίδιο τρόπο όπως .NET Framework 2.0-4.7.2 (και .NET Framework 4.8 με όλες τις ενημερώσεις να εφαρμόζονται).  Η ομάδα του .NET εξετάζει το ενδεχόμενο να προχωρήσει σε μια βελτιωμένη σχεδίαση στο .NET 6 (ή σε μελλοντικές εκδόσεις), αλλά αυτή η ενημέρωση σχεδίασης δεν θα ισχύει για .NET Framework, .NET Core ή .NET 5.

Χρειάζεστε περισσότερη βοήθεια;

Θέλετε περισσότερες επιλογές;

Εξερευνήστε τα πλεονεκτήματα της συνδρομής, περιηγηθείτε σε εκπαιδευτικά σεμινάρια, μάθετε πώς μπορείτε να προστατεύσετε τη συσκευή σας και πολλά άλλα.