使用NodeJS + express在Cloud Foundry应用程序中进行相互身份验证

问题描述 投票:0回答:1

我在IBM Cloud中开发了部署为Cloud Foundry应用程序的NodeJs + express应用程序。我想执行相互身份验证(客户端和服务器证书),以控制传入的流量和对我的应用程序的请求。我的证书由Secure Gateway生成,如here所述,我的应用程序配置为云目标(从本地客户端访问)。

Secure Gateway已生成以下pem文件:服务器的主证书,中间证书和根证书以及目标证书和密钥。在文档中有一个非常清楚的Nodejs example使用tls.createServer。

在我的场景中存在一些差异:首先,我处于相反的情况下(本地客户端通过Secure Gateway连接到云应用程序创建隧道)。其次,这是这篇文章的主要原因,我的应用程序被部署为CF应用程序。

阅读有关HTTP routing的CF文档我发现IBM云只使用端口80和443,然后通过HTTP将请求转发到应用程序正在侦听的端口(例如,如果我的NodeJ在端口6001上运行,我在上面调用云端点在端口443,GoRouter将请求通过HTTP转发到正确的端口,添加X-Forwarded-Proto头以向应用程序传递用于请求的原始协议的信息。

考虑到这一点(假设这是正确的),在我的NodeJs代码中,我不能使用类似https.createServer(opts, app)的东西,因为所有来自App Container的请求都将通过HTTP。

阅读CF docs here我知道可以告诉CF将证书转发到我的应用程序,但有些东西我无法真正理解。

首先,在Load Balancer或GoRouter终止TLS有什么区别?这个选择背后的原因是什么?

我的第二个问题是,一旦将证书作为HTTP头转发到我的应用程序,哪种处理证书是正确的?这是因为我的NodeJs服务器将是一个http服务器,使用标准方式http.createServer(app)以express形式创建。

感谢所有帮助我解决这个问题的人。显然,如果您有任何示例或建议,那将非常有帮助。

node.js express ssl cloudfoundry mutual-authentication
1个回答
0
投票

阅读有关HTTP路由的CF文档我发现IBM云只使用端口80和443,然后通过HTTP将请求转发到应用程序正在侦听的端口(例如,如果我的NodeJ在端口6001上运行,我称之为云端点在端口443上,GoRouter将请求通过HTTP转发到正确的端口,添加X-Forwarded-Proto头以向应用程序传递用于请求的原始协议的信息。

考虑到这一点(假设这是正确的),在我的NodeJs代码中,我不能使用类似https.createServer(opts,app)的东西,因为所有来自App Container的请求都将通过HTTP。

那是正确的。

首先,在Load Balancer或GoRouter终止TLS有什么区别?这个选择背后的原因是什么?

这仅适用于您运营自己的Cloud Foundry平台的情况。如果您要将应用程序部署到由其他人操作的Cloud Foundry平台,他们将做出此决定,并且不会影响您作为用户。

作为操作员,这是您需要做出的选择。根据您的选择,有一些权衡取舍。

  1. 你可以在LB终止。这通常是最快的,因为LB在处理TLS / SSL方面非常有效。然后,LB可以将流量转发到未加密的Gorouter,这对Gorouter的工作量减少了,但是代价是不加密两者之间的流量(可能不行,取决于安全要求)。在这种情况下,LB负责添加x-forwarded-*标头。 浏览器 - > HTTPS - > LB - > HTTP - > Gorouters - > HTTP - >您的应用程序
  2. 您可以使用第4层LB并在Gorouters之间保持平衡。这使Gorouters能够终止TLS / SSL。他们在这方面非常有效率,但不如大多数LB。这也可以让您在请求路径中加密到Gorouter。在这种情况下,Gorouters负责添加x-forwarded-*标头。 浏览器 - > HTTPS - > LB - > HTTPS - > Gorouters - > HTTP - >您的应用程序
  3. 您可以在LB终止,但在LB和Gorouters之间打开一个新的TLS / SSL会话。这是效率最低的选项,因为它需要终止两个TLS / SSL会话,但它在直到Gorouter的请求路径中提供加密。它也是使用非第4层LB的最灵活的工具,它可以让你的LB检查HTTP流量,因为你正在终止LB的会话。在这种情况下,LB负责添加x-forwarded-*标头。 浏览器 - > HTTPS(会话A) - > LB - > HTTPS(会话B) - > Gorouters - > HTTP - >您的应用

同样,如果您没有运行Cloud Foundry平台,那么您可以忽略它。

我的第二个问题是,一旦将证书作为HTTP头转发到我的应用程序,哪种处理证书是正确的?这是因为我的NodeJs服务器将是一个http服务器,使用标准方式http.createServer(app)以express方式创建。

您不需要对创建服务器的方式做任何想象。您需要做的就是查看x-forwarded-*标题并使用它们来做出决定。

  1. 请求是通过HTTPS传入的吗?查看x-forwarded-proto,对于HTTPS请求应该设置为https,或者查看x-forwarded-port,对于HTTPS请求,应该设置为443
  2. 是否提供了客户证书?看看X-Forwarded-Client-Cert。如果它包含证书,则客户端提供证书。
  3. 客户的证书是否有效?如果您的应用获得了请求,则客户端的证书有效。您知道这一点,因为平台会为您处理该部分。由于平台(LB或Gorouter)正在终止TLS / SSL连接,因此它有责任验证证书。如果您的应用收到请求并且设置了x-forwarded-client-cert,则证书有效。
  4. 如何根据客户端证书做出授权决策?这有点棘手,但通常你会从x-forwarded-client-cert中取出证书,读取/解析它并根据证书内容做出决定(我们知道这要归功于该平台)。您很可能会查看主题名称并将其视为用户名。然后查找该用户的角色或权限。但是,您如何处理这一点取决于您作为开发人员。

希望有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.