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给我的问题。
- EF Code First:如何从nuget包控制台中看到“EntityValidationErrors”属性?
- 在一个视图中的多个模型
- MVC3不显眼的validation组input
- WebActivator做什么?
- 在ASP.NET MVC Razor中使用通用模型
- “System.Web.Mvc.MvcWebRazorHostFactory”types的expression式不能用于返回types“System.Web.WebPages.Razor.WebRazorHostFactory”
- MVC 3布局页面,剃刀模板和DropdownList
- EF LINQ包含多个嵌套实体
- 不显眼的客户端validation使用fluentvalidation和asp.net mvc LessThanOrEqualTo不发射