IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Problème type de fournisseur X509Certificate2 lors de l'utilisation de l'API Google


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 22
    Points : 20
    Points
    20
    Par défaut Problème type de fournisseur X509Certificate2 lors de l'utilisation de l'API Google
    Bonjour à tous

    Je développe une application asp.Net (je sais qu'il y a un forum dédié mais la question concerne uniquement la partie c# et .net).
    Cette application doit pouvoir se connecter à une imprimante à distance.
    Pour cela, j'ai choisi d'utiliser Google Cloud Print, j'utilise donc une bibliothèque de classes pour me simplifier la vie :
    Bibliothèque de classes

    Elle a bien été intégrée à ma solution en environnement de développement, j'ai pu imprimer, partager mes imprimantes, etc...
    Le problèmes, c'est que lorsque je déploie ma solution sur mon serveur de pré-production distant, cela me génère une erreur dès que j'essaie de lister les imprimantes.
    En bref, dès que l'assembly tente de fabriquer des identifiants Google pour les envoyer à Google par requête POST, cette fonction est utilisée pour toute interraction avec l'API Google donc rien ne fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private async Task<ServiceAccountCredential> Authorize()
            {
                var certificate = new X509Certificate2(_keyFilePath, _keyFileSecret, X509KeyStorageFlags.Exportable);
     
                var credential = new ServiceAccountCredential(
                   new ServiceAccountCredential.Initializer(_serviceAccountEmail)
                   {
                       Scopes = new[] { "https://www.googleapis.com/auth/cloudprint" }
                   }.FromCertificate(certificate));
     
                await credential.RequestAccessTokenAsync(CancellationToken.None);
     
                return credential;
            }
    Et voici le message d'erreur que je reçois lorsque je veux utiliser l'assembly :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    [CryptographicException: Invalid provider type specified.
    ]
       System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer) +5291577
       System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle) +94
       System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair() +136
       System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize) +203
       System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey() +240
       Google.Apis.Auth.OAuth2.Initializer.FromCertificate(X509Certificate2 certificate) +21
       GoogleCloudPrint.<Authorize>d__20.MoveNext() +221
     
    [AggregateException: Une ou plusieurs erreurs se sont produites.]
       System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) +4483420
       System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) +14135741
       GoogleCloudPrint.GoogleCloudPrintService..ctor(String serviceAccountEmail, String keyFilePath, String keyFileSecret, String source) +188
       PecV2.WebApp.CloudPrints.CloudPrint..cctor() +165
     
    [TypeInitializationException: Une exception a été levée par l'initialiseur de type pour 'PecV2.WebApp.CloudPrints.CloudPrint'.]
       PecV2.WebApp.CloudPrints.CloudPrint.listPrinterNames() +50
       PecV2.WebApp.Utilisateur.Parametres.Page_Load(Object sender, EventArgs e) +285
       System.Web.UI.Control.OnLoad(EventArgs e) +109
       System.Web.UI.Control.LoadRecursive() +68
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436
    Je sais que cette erreur est une erreur connue mais les explications que je trouve sur sa cause restent très floues et d'après moi, ne correspondent pas à mon cas.
    Voici le post qui explique le mieux cette erreur : post msdn
    Dès le début, il explique que cette erreur se produit avec le framework .Net 3.5 et supérieures, donc logiquement, cette erreur devrait se produire sur mon environnement de développement puisque j'utilise la même version de .Net sur mon serveur et sur ma machine mais ce n'est pas le cas.
    La seconde chose qui m'étonne beaucoup, c'est que ce problème n'est pas constaté au niveau du serveur de pré-production local (IIS Local) donc l'environnement est très similaire.
    La seule cause que je peux imaginer serait que le provider ne soit pas (correctement) installé sur le serveur mais dans ce cas, je ne sais pas trop vers où m'orienter.
    (Je ne cherche pas forcément une réponse toute cuite mais quelques axes de réflexion m'aideraient grandement)

    En tout cas, merci et bonne journée!
    Nico.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Ok, j'ai trouvé la solution, mes raisonnements étaient bons, c'était une configuration du pool d'application IIS. (car c'est de l'ASP.NET, du coup le problème ne concerne pas que le c#, il vaut peut-etre mieux déplacer ce thread).

    C'est ce post qui m'a permis de trouver la solution :

    La résolution du problème est très simple, il faut aller dans IIS, ouvrir la page de gestion des pools d'application, clic droit sur le pool utilisé par l'application, paramètres avancés.
    Il fallait uniquement changer la variable "load user profiles" ou "Charger le profil utilisateur" en français, elle était sur false sur mon serveur distant, il faut qu'elle soit sur true!
    J'espère que ça aura aidé des gens!

    Bonne soirée/journée!
    Nico.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/04/2015, 10h54
  2. Réponses: 2
    Dernier message: 16/12/2014, 14h03
  3. Erreur lors de l'utilisation de l'API Criteria
    Par mysianne dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 30/01/2012, 16h33
  4. Réponses: 10
    Dernier message: 17/06/2009, 17h05
  5. Réponses: 14
    Dernier message: 03/10/2007, 15h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo