c# asp.net-mvc-3 google-analytics-api x509certificate2

c# - Certificado X509 que no carga el archivo de clave privada en el servidor



asp.net-mvc-3 google-analytics-api (5)

Como se mencionó anteriormente, necesita configurar IIS, pero, como es nuestro caso, en algún momento debe verificar el permiso de la siguiente carpeta:

C: / ProgramData / Microsoft / Crypto / RSA / MachineKeys

Si configura el parámetro X509KeyStorageFlags , creará un archivo de clave en esta carpeta. En mi caso, hubo una diferencia en el permiso de esta carpeta. La cuenta del grupo no se agregó en la carpeta mencionada.

Estoy usando la API de Google Analytics y seguí esta pregunta para configurar OAuth: https://stackoverflow.com/a/13013265/1299363

Aquí está mi código 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 es la ruta del archivo de clave privada proporcionado por Google API Console. Esto funciona perfectamente en mi máquina local, pero cuando lo empujo a nuestro servidor de prueba me sale

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

con la siguiente traza de pila (se eliminan las partes irrelevantes):

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

Por lo tanto, parece que tiene problemas para cargar el archivo. Revisé el PrivateKeyPath que se transfirió y apunta a la ubicación correcta.

¿Algunas ideas? No sé si esto es un problema con el servidor, el archivo, el código o qué.


Estoy cargando mi archivo p12 con

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

De hecho, recibí una excepción FileNotFoundException a pesar de que File.Exists(filename) devolvió verdadero.

Como @Wiktor Zychla dijo que es tan simple como habilitar Load User Profile

Aquí hay una imagen de la configuración que necesita cambiar

Simplemente haga clic con el botón derecho en el grupo de aplicaciones en ''Grupos de aplicaciones'' en IIS y seleccione ''Configuración avanzada'' y la configuración que necesita está a medio camino de bajada.

Sugerencia: recomendaría comentar su código con esto para evitar el desperdicio de tiempo futuro, ya que es tan oscuro si nunca lo ha visto antes.

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


No, ¿"File.Exists (...)" también está en configuraciones avanzadas? Tenía 3 grupos, todos ellos tenían habilitados para "Cargar perfil de usuario". Estoy pensando que mi problema podría tener algo que ver con las dependencias y los paquetes NuGet ya que el código funcionó bien como una aplicación de consola, pero me da problemas en MVC.


También intente especificar X509KeyStorageFlags

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


Una de las cosas que me viene a la mente es la identidad de su grupo de aplicaciones, asegúrese de que el perfil Cargar usuario esté activado, de lo contrario, el subsistema de cifrado no funcionará.