从用于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.KeyContainerName
为null
而在我的开发机器上运行的原始未修改类给出了类似{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);