将Azure网站连接到Xero合作伙伴应用程序

8
我正在将我的应用程序与Xero进行集成,需要两个证书。我按照文章的帮助将它们上传到了Azure,但我仍然无法连接到Xero API。我希望有人能够在Azure Web App上成功地将Xero合作伙伴应用程序与Xero API集成。
我已经上传了两个 pfx文件;一个是自签名证书,另一个是由Xero签发的合作伙伴证书。后者包含两个证书;一个 Entrust 商业私人子 CA1(不知道是什么)和一个为我的应用程序生成的独特的 Entrust Id 证书。
我正在使用以下代码通过其唯一的Thumbprint加载证书:
    static X509Certificate2 GetCertificateFromStore(string thumbprint)
    {
        var store = new X509Store(StoreLocation.CurrentUser);

        try
        {
            thumbprint = Regex.Replace(thumbprint, @"[^\da-zA-z]", string.Empty).ToUpper();
            store.Open(OpenFlags.ReadOnly);

            var certCollection = store.Certificates;
            var currentCerts = certCollection.Find(X509FindType.FindByTimeValid, DateTime.Now, false);
            var signingCert = currentCerts.Find(X509FindType.FindByThumbprint, thumbprint, false);

            if (signingCert.Count == 0)
            {
                throw new Exception($"Could not find Xero SSL certificate. cert_name={thumbprint}");
            }

            return signingCert[0];
        }
        finally
        {
            store.Close();
        }
    }

这在本地可以正常工作,但是在我的Azure网站上出现了403.7错误:

The page you are attempting to access requires your browser to have a Secure Sockets Layer (SSL) client certificate that the Web server recognizes.

我还查看了以下参考资料,试图解决这个问题:

我尚未尝试的方法:

  • 将我的Web应用程序转换为云服务;尽管我不确定涉及哪些步骤,但我正在努力避免这样做。
  • 使用虚拟机;我还没有找到任何详细的操作步骤,但这似乎比上述方法更好。

错误截图: 错误


仅供参考,我们遇到了同样的问题,并且曾经在Microsoft这里开了一个案例 - https://social.msdn.microsoft.com/Forums/azure/en-US/c9e17417-e50d-4eff-9676-7d76db33264c/certificate-chain-not-being-imported-to-azure-website?forum=windowsazurewebsitespreview。 - Matthew Steeples
3个回答

4
一个403错误意味着我们在连接中没有看到Xero Entrust证书。更多细节请参见此处:http://blog.xero.com/developer/api-overview/http-response-codes/#403
基本上,它在您的本地IIS实例上运行,因为它是一个“单租户”机器,您的应用程序不需要与其他应用程序隔离开来。
同时,您的应用程序被用于隔离网站的安全模型所阻止。
总之,要使您的证书在Azure上正常工作,您需要执行以下操作:
1)将证书、私钥和所有中间证书导出为PFX文件。
2)使用Azure门户向您运行的云服务上传证书(它应该会显示为多个条目)。
3)通过代码从机器存储库访问证书。
基于以下数据: https://community.xero.com/developer/discussion/626401 https://social.msdn.microsoft.com/Forums/azure/en-US/29b30f25-eea9-4e8e-8292-5ac8085fd42e/access-to-certificates-in-azure-web-sites 希望能解决您的问题。

1
记录一下,我已经完成了所有这些步骤,但是得到的结果仍然相同。 - tqrecords
1
这可能会对您有所帮助 - http://developer.xero.com/documentation/advanced-docs/using-partner-applications-with-iis/,如果有用的话,请告诉我,我会更新我的答案以包含这些信息。 - DeJaVo
这些步骤是为了在本地运行它,我无法访问Azure上的应用程序池或任何IIS设置。 - tqrecords
1
只是为了获取更多细节-您是否尝试过以下配置之一: https://azure.microsoft.com/zh-cn/blog/using-certificates-in-azure-websites-applications/https://azure.microsoft.com/zh-cn/documentation/articles/cloud-services-configure-ssl-certificate-portal/ - DeJaVo
是的,正如所述,我已使用第一个链接上传了我的证书。我知道它们在Azure上,因为我没有收到异常“找不到Xero SSL证书”(请参见代码)。我的网站也有SSL证书,在其中我已经按照第二个链接中的步骤进行了配置。 - tqrecords
显示剩余2条评论

2

最后终于让这个工作起来了,我将分享我的解决方案,希望能为连接Xero的开发人员节省大量时间和挫折感。

Xero合作伙伴应用程序无法与Azure App Services(Web Sites)一起使用。您必须上传两个附加证书,以及您自签名的证书和Xero合作伙伴证书。这些证书可以在本地计算机上找到,并且可以以cer格式导出(有关这些证书的详细信息,请参见下文)。无法为Azure app services上传这些证书确实是一个难题。它们还必须上传到特定的存储库(Root/CA),而这是您无法在app services中完成的。以下是我连接Xero所采取的步骤。

  1. 将我的网站转换为Azure云服务:我担心更改我们的环境,因为我们已经有了一个现成的网站。事实证明,云服务基本上与应用服务相同;您仍然在某个VM上部署。但是,您可以对后端进行更多控制,而且可以远程桌面连接。阅读更多 here。使用下面的链接创建并将我的网站转换为云服务:

  2. 使用Azure门户上传了4个证书到我的云项目。您需要上传以下内容:

    • 您自签名的证书(在此处创建的那个)
    • Xero颁发的合作伙伴证书(您可能在此处获得)
    • 中间Entrust证书(这个应该包含在您下载的.p12文件中)
    • Entrust根证书(这应该在您的受信任的根存储库**中)
  3. 将证书添加到我的云项目Web角色中。您必须右键单击Web角色的属性,然后转到证书选项卡。使用可在上传后在门户中看到的指纹将所有4个证书添加到您的web角色中。请注意两个entrust证书的存储名称

enter image description here

在进行第一步时,您可能需要采取很多耐心。您将不得不弄清新的部署过程、如何在本地调试项目,以及可能会遇到很多其他令人沮丧的细节!

**这是正确的 Entrust 根证书,您可以使用 certmgr.msc 获得:

进入图像描述


0

请确保您已经从参考文章的第2步中添加了应用程序设置。

添加名为WEBSITE_LOAD_CERTIFICATES的应用程序设置,并将其值设置为证书的指纹,这样它就可以被您的 Web 应用程序访问。您可以有多个逗号分隔的指纹值,或者将此值设置为“*”(不带引号),这样所有证书都将加载到您的 Web 应用程序的个人证书存储中。

我还会更具体地指定证书存储,即使用:

var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);

这是我们在所有 Azure Web 应用程序中加载证书的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接