【问题标题】:X509Certificate2 failing in Azure Webjobs calling Google APIX509Certificate2 在调用 Google API 的 Azure Webjobs 中失败
【发布时间】:2014-11-10 12:43:45
【问题描述】:

我有一个使用 Azure WebJobs 计划的控制台应用程序。尝试读取 p12 证书的私钥时,执行总是失败。有趣的是,我无法捕捉到异常,我不得不使用旧的Console.WriteLine 进行调试。

这是我的sn-p代码:

var certificate = new X509Certificate2(data, "notasecret", X509KeyStorageFlags.Exportable);

ServiceAccountCredential credential = new ServiceAccountCredential(
 new ServiceAccountCredential.Initializer(serviceAccountEmail)
 {
     Scopes = new[] { BigqueryService.Scope.Bigquery }
 }.FromCertificate(certificate));

其他帖子提到标志应该是X509KeyStorageFlags.MachineKeySet,但不幸的是,这会导致 Google API 出现错误。它需要设置X509KeyStorageFlags.Exportable 标志。

谁能确认X509KeyStorageFlags.Exportable 可用于 Azure 网站和 WebJobs?

【问题讨论】:

  • 你可能会发现这个帖子很有帮助:stackoverflow.com/questions/23330863/….
  • 是的,我看到了那个帖子和博文。解决方案需要设置X509KeyStorageFlags.MachineKeySet,与Google API SDK不兼容。

标签: azure google-bigquery azure-webjobs


【解决方案1】:

在 IIS 中无法使用 X509KeyStorageFlags.Exportable。我已经在自己的虚拟机上使用 Azure Webjobs、Azure 网站和 IIS 进行了尝试。使用 IISExpress 时,它可以在开发环境中工作,因为该进程是在用户的上下文中运行的。

因此,要使其在 IIS 上下文(包括 Webjobs)中工作,必须将其设置为 MachineKeySet,但 Google API 将失败,因为它需要私钥。

我的问题的解决方案实际上很简单,创建一个控制台应用程序,创建带有 Exportable 标志集的 X509Certificate2 对象,然后调用 ToXmlString()。这是sn-p:

var certificate = new X509Certificate2(data, "notasecret", X509KeyStorageFlags.Exportable); var xml = certificate.PrivateKey.ToXmlString(true);

然后我保存 XML 并使用该 XML 创建一个 RSACryptoServiceProvider,如下所示:

var rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(xmlKey);
ServiceAccountCredential credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(serviceAccountEmail)
 {
  Scopes = new[] { BigqueryService.Scope.Bigquery },
  Key = rsa
 });

希望这对其他人有所帮助。

【讨论】:

  • 我爱你们这些能解决这些问题的聪明人。我无事可做:)谢谢!
  • 您在创建 X509Certificate2 对象时引用了data,您是否以某种方式将其从提供的 .p12 键中提取出来?
  • data 指的是您从 Google Cloud 项目获得的用于 OAuth 凭据的 p12 证书的字节数组。在这里查看文档:https://cloud.google.com/bigquery/authorization#service-accounts-server
  • 干得好!对我也有用:)
  • 这太棒了,但请参阅 jmcnly 的答案,它更容易解决 Azure WebJobs 等的这个特殊问题
【解决方案2】:

此解决方案适用于 Azure 设置。然而,我也找到了一个更简单的满足我的需求。只需添加额外的标志,让每个人都开心...

 var certificate = new X509Certificate2(data,"notasecret",
                       X509KeyStorageFlags.MachineKeySet | 
                       X509KeyStorageFlags.PersistKeySet | 
                       X509KeyStorageFlags.Exportable);

我找到this solution

【讨论】:

  • 嗨,欢迎来到 SO。这实际上应该是评论,而不是答案。一旦您获得足够的声誉,您就可以发表评论。谢谢。
  • 其实就是这样。现在完美运行!干得好。
  • 同意,其他解决方案是天才,但这可以解决问题并且工作量要少得多,这应该是公认的答案
猜你喜欢
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多