X509证书不在服务器上加载私钥文件

我正在使用Google AnalyticsAPI,并按照此问题设置了OAuth: https : //stackoverflow.com/a/13013265/1299363

这是我的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是Google API控制台提供的私钥文件的path。 这在我的本地机器上完美工作,但是当我把它推到我们的testing服务器上时,

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

与下面的堆栈跟踪(不相关的部分删除):

 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 

所以它看起来好像加载文件时遇到了问题。 我已经检查了传入的PrivateKeyPath,它指向正确的位置。

有任何想法吗? 我不知道这是服务器,文件,代码还是什么问题。

我想到的一件事是你的应用程序池的身份,确保加载用户configuration文件打开,否则encryptionsusbsystem不起作用。

我正在加载我的p12文件

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

即使File.Exists(filename)返回true,我实际上也得到了FileNotFoundException。

正如@Wiktor Zychla所说的那样,就像启用Load User Profile一样简单

这是一个需要改变的设置的图像

只需右键单击IIS中“应用程序池”下的应用程序池,然后select“高级设置”,您需要的设置大约是一半。

在这里输入图像说明

提示:我build议用这个代码来评论你的代码,以防止将来浪费时间,因为如果你以前从来没有遇到过这样的代码,那么这个代码就太晦涩了。

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

也请尝试指定X509KeyStorageFlags

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

如上所述,您需要configurationIIS,但作为我们的情况,有时您需要检查以下文件夹的权限:

C:\ ProgramData \微软\encryption\ RSA \ MachineKeys的

如果你设置了X509KeyStorageFlags参数,它将在这个文件夹中创build一个密钥文件。 在我的情况下,这个文件夹的权限有所不同。 池帐户没有被添加在提到的文件夹中。

不,在高级设置中也是“File.Exists(…)”? 我有3个池,他们都真正启用“加载用户configuration文件”。 我想我的问题可能与依赖和NuGet软件包有关,因为代码工作正常,作为控制台应用程序,但在MVC给我的问题。