web-dev-qa-db-fra.com

La protection des données dans ASP.NET Core 2.1 ne fonctionne que sur une seule machine

J'utilise système de protection des données ASP.NET Core pour chiffrer les données avec l'application A et les déchiffrer avec l'application B.

Le chiffrement et le déchiffrement fonctionnent tous les deux lorsqu'ils sont exécutés sur la machine de développement, mais lorsque l'application B est déplacée vers la machine de production, elle n'est plus en mesure de déchiffrer car la méthode IDataProtector.Unprotect lève une exception:

System.InvalidOperationException: le jeu de clés ne contient pas de clé de protection par défaut valide. Le système de protection des données ne peut pas créer de nouvelle clé car la génération automatique de clés est désactivée.

Voici le code que j'utilise pour configurer le déchiffrement dans l'application B:

sKeysPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Keys");

services.AddDataProtection()
    .SetApplicationName("My Application") // Application A sets this same name
    .PersistKeysToFileSystem(new DirectoryInfo(sKeysPath))
    .ProtectKeysWithCertificate("634D3F23...")
    //.ProtectKeysWithCertificate(x509Certificate2) // I've tried using an X509 certificate parameter but it gives the same result as providing the thumbprint of the one in the certificate store
    .DisableAutomaticKeyGeneration(); // Application A is the master key generator so do not generate keys

La machine de production contient le même dossier Keys (avec les fichiers .pfx et .xml) et les mêmes clés installées dans le magasin de certificats Windows.

Si je comprends bien, en fournissant le fichier de certificat au système de protection des données, il devrait fonctionner sur n'importe quelle machine et ne pas être lié à une machine spécifique ou à un utilisateur Windows. Cette hypothèse est-elle incorrecte ou y a-t-il un problème avec la façon dont j'effectue le déchiffrement?

Voici quelques messages de journalisation plus détaillés:

2018-06-13 16:32:32.6750 | TRACE | Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector | 5 | Performing unprotect operation to key {846541...} with purposes ('My Application', 'My Purpose').

2018-06-13 16:32:32.6750 | DEBUG | Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository | 37 | Reading data from file 'C:\inetpub\wwwroot\My Website\Keys\key-846541....xml'.

2018-06-13 16:32:32.6750 | DEBUG | Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager | 18 | Found key {846541...}.

2018-06-13 16:32:32.6750 | DEBUG | Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver | 13 | Considering key {846541...} with expiration date 2038-01-18 20:54:13Z as default key.

2018-06-13 16:32:32.6750 | DEBUG | Microsoft.AspNetCore.DataProtection.TypeForwardingActivator | Forwarded activator type request from Microsoft.AspNetCore.DataProtection.XmlEncryption.EncryptedXmlDecryptor, Microsoft.AspNetCore.DataProtection, Version=2.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 to Microsoft.AspNetCore.DataProtection.XmlEncryption.EncryptedXmlDecryptor, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60

2018-06-13 16:32:32.7051 | ERROR | Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager | 24 | An exception occurred while processing the key element '<key id="846541..." version="1" />'. Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Keyset does not exist

2018-06-13 16:32:32.7051 | TRACE | Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager | 25 | An exception occurred while processing the key element '<key id="846541..." version="1" />...

2018-06-13 16:32:32.7051 | WARN | Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver | 12 | Key {846541...} is ineligible to be the default key because its CreateEncryptor method failed. Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Keyset does not exist

2018-06-13 16:32:32.7051 | DEBUG | Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver | 14 | Key {846541...} is no longer under consideration as default key because it is expired, revoked, or cannot be deciphered.

2018-06-13 16:32:32.7051 | DEBUG | Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver | 53 | Repository contains no viable default key. Caller should generate a key with immediate activation.

2018-06-13 16:32:32.7051 | DEBUG | Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider | 57 | Policy resolution states that a new key should be added to the key ring.

2018-06-13 16:32:32.7051 | ERROR | Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider | 49 | The key ring does not contain a valid default key, and the key manager is configured with auto-generation of keys disabled.

2018-06-13 16:32:32.7051 | ERROR | Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider | 48 | An error occurred while reading the key ring. System.InvalidOperationException: The key ring does not contain a valid default protection key. The data protection system cannot create a new key because auto-generation of keys is disabled.

10
Coder6841

Grâce à la suggestion de Joe Audette, j'ai vérifié la journalisation détaillée et trouvé une erreur plus spécifique qui m'a montré cette réponse qui avait la solution.

Le problème était que les autorisations pour le certificat dans le magasin de certificats Windows n'avaient pas le groupe IIS_IUSRS défini pour autoriser l'accès en lecture (certificat de clic droit -> Toutes les tâches -> Gérer les clés privées ..). Ce problème n'est pas apparu sur la machine de développement car il s'exécutait à la place dans le contexte utilisateur de Visual Studio.

3
Coder6841

J'ai également rencontré un problème similaire dans une application 2.2 car le certificat était auto-signé. Pour l'instant, je l'ai contourné en implémentant ma propre classe CertificateResolver et ProtectKeysWithCertificate méthode qui ne valide pas le certificat. Cependant, la vraie solution pour moi serait d'utiliser un certificat valide.

Juste quelques informations supplémentaires pour tous ceux qui rencontrent cela.

0
Gup3rSuR4c

J'ai eu un problème similaire, mais c'était entre deux applications ASP.NET Core différentes qui essayaient de partager le même cookie. Un décalage de version mineure dans Microsoft.AspNetCore.Authentication.Cookies (2.1.2 vs 2.2.0) empêchait l'une des applications de trouver les clés créées par l'autre version.

Ajouter cette réponse ici (même si elle ne répond pas à la question ci-dessus), car les messages d'erreur correspondent exactement, et j'espère que cela économisera quelques heures à quelqu'un.

0
tejas