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