从用于Google API的Azure网站中的p12证书生成X509Certificate2时出现502错误

我正在使用此GoogleJsonWebToken类生成一个访问令牌,用于对Google Calendar API的json调用。 当我使用以下内容(使用我的实际服务帐户电子邮件)时,它在我的开发机器上的IIS Express中运行得非常好:

 string p12Path = HttpContext.Current.Server.MapPath("~/App_Data/certificate.p12"); var auth = GoogleJsonWebToken.GetAccessToken("uniquestring@developer.gserviceaccount.com", p12Path, "https://www.googleapis.com/auth/calendar"); string Token = auth["access_token"]; 

为了测试这个,我只是在我的cshtml razor视图中调用@Token 。 当我将其发布到我的Azure网站时,它不起作用。 如果我保持GoogleJsonWebToken类未经修改,我会得到一个非常无益的502 - Web server received an invalid response while acting as a gateway or proxy server. 没有其他信息。

在一些谷歌搜索后 ,我发现这个SOpost是一个类似的问题。 所以我尝试了他们的解决方案我得到System.Security.Cryptography.CryptographicException: The system cannot find the file specified. 何时从我的Azure网站运行。 从我的开发机器运行时,我得到System.Net.WebException: The remote server returned an error: (400) Bad Request. 我认为是因为使用该解决方案, CspKeyContainerInfo.KeyContainerNamenull而在我的开发机器上运行的原始未修改类给出了类似{C0E26DC5-5D2C-4C77-8E40-79560F519588} ,每次都是随机生成的,这个值是用于签名签名的过程中。

然后我找到了这个SOpost,但该解决方案产生的结果与上一个解决方案相同。

我也试过X509KeyStorageFlags大部分不同组合都无济于事。

如何自己生成CspKeyContainerInfo.KeyContainerName或以其他方式成功生成X509Certificate2

我在这个MSDN论坛post上找到了解决方案。 基本上我需要设置X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet正如我在上面提到的第一篇SOpost中读到的那样,然后我需要在我的CspParamaters中使用Flags = CspProviderFlags.UseMachineKeyStore CspProviderFlags.UseMachineKeyStore。

我已经在GitHub上发布了我的完整解决方案

首先,您应该将p12文件添加到资源:

右键单击项目 – 属性 – 资源 – 添加资源,然后使用此行代码作为证书

 var certificate = new X509Certificate2((byte[])Properties.Resources.ResourceManager.GetObject(ResourceName), "!password!", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);