X509Certificate2 - le système ne peut pas trouver le chemin d'accès spécifié
Je souhaite obtenir les données de Google analytics via le compte de service.
Lorsque je lance une première fois l'application, tout fonctionne correctement et j'ai accès aux données. Mais Lorsque je le lance second moment de la demande, j'ai l'erreur suivante qui s'affiche: "le système ne peut pas trouver le chemin d'accès spécifié ". Avez-vous une idée? J'ai pensé qu'il peut être une serrure.
C'est mon code source:
public static String GetAccessToken(string clientIdEMail, string keyFilePath, String scope)
{
//certificate
var certificate = new X509Certificate2(keyFilePath, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
//header
var header = new { typ = "JWT", alg = "RS256" };
//claimset
var times = GetExpiryAndIssueDate();
var claimset = new
{
iss = clientIdEMail,
scope = scope,
aud = "https://accounts.google.com/o/oauth2/token",
iat = times[0],
exp = times[1],
};
JavaScriptSerializer ser = new JavaScriptSerializer();
//encoded header
var headerSerialized = ser.Serialize(header);
var headerBytes = Encoding.UTF8.GetBytes(headerSerialized);
var headerEncoded = Convert.ToBase64String(headerBytes);
//encoded claimset
var claimsetSerialized = ser.Serialize(claimset);
var claimsetBytes = Encoding.UTF8.GetBytes(claimsetSerialized);
var claimsetEncoded = Convert.ToBase64String(claimsetBytes);
//input
var input = headerEncoded + "." + claimsetEncoded;
var inputBytes = Encoding.UTF8.GetBytes(input);
//signiture
var rsa = certificate.PrivateKey as RSACryptoServiceProvider;
var cspParam = new CspParameters
{
KeyContainerName = rsa.CspKeyContainerInfo.KeyContainerName,
KeyNumber = rsa.CspKeyContainerInfo.KeyNumber == KeyNumber.Exchange ? 1 : 2,
Flags = CspProviderFlags.UseMachineKeyStore
};
var aescsp = new RSACryptoServiceProvider(1024,cspParam) { PersistKeyInCsp = false };
var signatureBytes = aescsp.SignData(inputBytes, "SHA256");
var signatureEncoded = Convert.ToBase64String(signatureBytes);
//jwt
var jwt = headerEncoded + "." + claimsetEncoded + "." + signatureEncoded;
var client = new WebClient();
client.Encoding = Encoding.UTF8;
var uri = "https://accounts.google.com/o/oauth2/token";
var content = new NameValueCollection();
content["assertion"] = jwt;
content["grant_type"] = "urn:ietf:params:oauth:grant-type:jwt-bearer";
string response = Encoding.UTF8.GetString(client.UploadValues(uri, "POST", content));
JsonGoogleResponse result = (ser.Deserialize<JsonGoogleResponse>(response));
return result.access_token;
}
Et c'est la pile:
à System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
à System.Security.Cryptography.SafeProvHandle._FreeCSP(IntPtr pProvCtx)
à System.Security.Cryptography.SafeProvHandle.ReleaseHandle()
à System.Runtime.InteropServices.SafeHandle.InternalFinalize()
à System.Runtime.InteropServices.SafeHandle.Dispose(Boolean disposing)
à System.Runtime.InteropServices.SafeHandle.Finalize()
Vous devez vous connecter pour publier un commentaire.
Si vous êtes en cours d'exécution dans IIS, vous devez régler "de Charger le Profil Utilisateur" pour de Vrai dans l'application de la piscine, les paramètres avancés pour être en mesure de charger un cert par nom de fichier & mot de passe.
Donc, je viens d'avoir exactement le même problème. J'ai essayé de le résoudre pour près de 4 heures.
Problème était dans le passé le chemin de clé. Parce que j'ai utilisé le code de Google exemple de l'application de la console, où le chemin était juste "de la clé.p12" et la clé était dans le même répertoire que le fichier exe.
Et quand j'ai voulu créer l'application MVC, je ne savais pas, que la racine de serveur virtuel chemin d'accès ne peut pas être appelé comme "clé.p12".
SOLUTION
Vérifiez le chemin d'accès à la clé. Si c'est le MVC de l'application (ou un autre web ASP), puis ajouter le fichier de clé à la racine et dans le code d'appel de la clé à l'aide de Serveur.MapPath("la touche.p12").
J'ai juste eu le même problème, dans mon cas, c'était un espace dans le chemin d'accès. Je n'ai aucune idée pourquoi, mais quand j'ai mis le fichier p12 sur la racine c:\, il travaille...