web-dev-qa-db-fra.com

Le certificat X509 ne charge pas le fichier de clé privée sur le serveur

J'utilise l'API Google Analytics et j'ai suivi cette SO question pour configurer OAuth: https://stackoverflow.com/a/13013265/129936

Voici mon OAuth:

public void SetupOAuth ()
{
    var Cert = new X509Certificate2(
        PrivateKeyPath, 
        "notasecret", 
        X509KeyStorageFlags.Exportable);
    var Provider = new AssertionFlowClient(GoogleAuthenticationServer.Description, Cert)
    {
        ServiceAccountId = ServiceAccountUser,
        Scope = ApiUrl + "analytics.readonly"
    };
    var Auth = new OAuth2Authenticator<AssertionFlowClient>(Provider, AssertionFlowClient.GetState);
    Service = new AnalyticsService(Auth);
}

PrivateKeyPath est le chemin du fichier de clé privée fourni par Google API Console. Cela fonctionne parfaitement sur ma machine locale, mais quand je la pousse vers notre serveur de test, je reçois

System.Security.Cryptography.CryptographicException: An internal error occurred.

avec la trace de pile suivante (parties non pertinentes supprimées):

System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) +33
System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx) +0
System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags) +237
System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags) +140
Metrics.APIs.GoogleAnalytics.SetupOAuth() in <removed>\Metrics\APIs\GoogleAnalytics.cs:36
Metrics.APIs.GoogleAnalytics..ctor(String PrivateKeyPath) in <removed>\Metrics\APIs\GoogleAnalytics.cs:31

Il semble donc qu'il ait du mal à charger le fichier. J'ai vérifié le PrivateKeyPath qui est transmis et il pointe vers l'emplacement correct.

Des idées? Je ne sais pas si c'est un problème avec le serveur, le fichier, le code ou quoi.

41
gwely

Une des choses qui me vient à l'esprit est l'identité de votre pool d'applications, assurez-vous que Charger le profil utilisateur est activé sinon le sous-système de cryptographie ne fonctionne pas.

83
Wiktor Zychla

Je charge mon fichier p12 Avec

new X509Certificate2(
HostingEnvironment.MapPath(@"~/App_Data/GoogleAnalytics-privatekey.p12"), ....

J'ai en fait obtenu une FileNotFoundException même si File.Exists(filename) a renvoyé true.

Comme l'a dit @Wiktor Zychla, c'est aussi simple que d'activer Load User Profile

Voici une image du paramètre qui doit être modifié

Faites un clic droit sur le pool d'applications sous "Pools d'applications" dans IIS et sélectionnez "Paramètres avancés" et le paramètre dont vous avez besoin est à mi-chemin environ.

enter image description here

Astuce: je recommanderais de commenter votre code avec cela pour éviter de perdre du temps car il est si obscur si vous ne l'avez jamais rencontré auparavant.

  // If this gives FileNotFoundException see 
  // http://stackoverflow.com/questions/14263457/
30
Simon_Weaver

Essayez également de spécifier X509KeyStorageFlags

    var certificate = new X509Certificate2(KeyFilePath, KeyFilePassword, 
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | 
X509KeyStorageFlags.Exportable);
10
VahidN

Comme mentionné ci-dessus, vous devez configurer IIS mais comme dans notre cas, vous devez parfois vérifier l'autorisation du dossier suivant:

C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys

Si vous définissez le paramètre X509KeyStorageFlags, il créera un fichier de clé dans ce dossier. Dans mon cas, il y avait une différence dans l'autorisation de ce dossier. Le compte de pool n'a pas été ajouté dans le dossier mentionné.

2
Shani