X509Certificate2 - the system cannot find the path specified
Möchte ich die Daten von Google analytics über service-Konto.
Wenn ich starten ersten Zeit der Anwendung, funktioniert alles einwandfrei und ich habe Zugriff auf die Daten. Aber Wenn ich starte zweite Zeit der Anwendung habe ich die folgende Fehlermeldung erscheint: "the system cannot find the path specified ". Haben Sie eine Idee? Ich dachte, es kann eine Sperre.
Dies ist mein Quellcode:
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;
}
- Und dies ist der Stapel:
à 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()
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mit IIS müssen Sie die "Benutzerprofil Laden" auf "True" in der Anwendungspool-erweiterte Einstellungen", um in der Lage sein zu laden, cert, indem Sie mit dem Namen & password.
So, ich hatte gerade das exakt gleiche problem. Ich habe versucht, es zu lösen, für fast 4 Stunden.
Problem war in den vergangen Weg zu drücken. Weil ich den code von Google Konsolenanwendung, wo der Pfad war nur " - Taste.p12" und der Schlüssel war in das gleiche Verzeichnis wie die exe-Datei.
Und wenn ich wollte MVC-Anwendung, mir war nicht klar, dass die Wurzel des virtuellen server-Pfad kann nicht aufgerufen werden, genauso wie " - Taste.p12".
LÖSUNG
Überprüfen Sie den Pfad zu dem Schlüssel. Wenn es MVC-Anwendung (oder einen anderen ASP-web), dann fügen Sie die key-Datei in den root und in den code nennen Sie den Schlüssel mithilfe von Server.MapPath("Taste.p12").
Ich hatte gerade das gleiche Problem, in meinem Fall war es ein Leerzeichen im Pfad ist. Ich habe keine Ahnung warum, aber wenn ich mir die p12-Datei auf c:\ root funktioniert...