繁体   English   中英

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

[英]Mutual Authentication in Cloud Foundry Application with NodeJS+express

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

安全网关已生成以下pem文件:服务器的主证书,中间证书和根证书以及目标证书和密钥。 在文档中,有一个使用tls.createServer的非常清晰的Node.js示例

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

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

考虑到这一点(假设这是正确的),在我的NodeJs代码中,我无法使用https.createServer(opts, app)类的东西https.createServer(opts, app)因为所有https.createServer(opts, app) App容器的请求都将通过HTTP进行。

在这里阅读CF文档我知道可以告诉CF将证书转发到我的应用程序,但是有些事情我无法真正理解。

首先,在负载均衡器或GoRouter处终止TLS有什么区别? 这种选择背后的原因是什么?

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

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

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

考虑到这一点(假设这是正确的),在我的NodeJs代码中,我无法使用https.createServer(opts,app)之类的东西,因为所有传入App容器的请求都将通过HTTP进行。

那是对的。

首先,在负载均衡器或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请求应设置为httpsx-forwarded-port (对于HTTPS请求应设置为443

  2. 请求中是否提供了客户证书? 查看X-Forwarded-Client-Cert 如果包含证书,则客户端提供了证书。

  3. 客户的证书有效吗? 如果您的应用收到请求,则客户端的证书有效。 您知道这一点是因为平台可以为您处理该部分。 由于平台(LB或Gorouter)正在终止TLS / SSL连接,因此有责任验证证书。 如果您的应用收到请求并且设置了x-forwarded-client-cert ,则该证书有效。

  4. 如何根据客户证书做出授权决定? 这有点棘手,但是通常您会将证书从x-forwarded-client-cert cert中取出,读取/解析它,然后根据证书内容做出决定(由于平台,我们知道这是有效的)。 您很可能会查看主题名称,并将其视为用户名。 然后查找该用户的角色或权限。 但是,如何处理取决于您作为开发人员的情况。

希望有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM