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:
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:
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.