我在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形式创建。
感谢所有帮助我解决这个问题的人。显然,如果您有任何示例或建议,那将非常有帮助。
阅读有关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平台,他们将做出此决定,并且不会影响您作为用户。
作为操作员,这是您需要做出的选择。根据您的选择,有一些权衡取舍。
x-forwarded-*
标头。
浏览器 - > HTTPS - > LB - > HTTP - > Gorouters - > HTTP - >您的应用程序x-forwarded-*
标头。
浏览器 - > HTTPS - > LB - > HTTPS - > Gorouters - > HTTP - >您的应用程序x-forwarded-*
标头。
浏览器 - > HTTPS(会话A) - > LB - > HTTPS(会话B) - > Gorouters - > HTTP - >您的应用同样,如果您没有运行Cloud Foundry平台,那么您可以忽略它。
我的第二个问题是,一旦将证书作为HTTP头转发到我的应用程序,哪种处理证书是正确的?这是因为我的NodeJs服务器将是一个http服务器,使用标准方式http.createServer(app)以express方式创建。
您不需要对创建服务器的方式做任何想象。您需要做的就是查看x-forwarded-*
标题并使用它们来做出决定。
x-forwarded-proto
,对于HTTPS请求应该设置为https
,或者查看x-forwarded-port
,对于HTTPS请求,应该设置为443
。X-Forwarded-Client-Cert
。如果它包含证书,则客户端提供证书。x-forwarded-client-cert
,则证书有效。x-forwarded-client-cert
中取出证书,读取/解析它并根据证书内容做出决定(我们知道这要归功于该平台)。您很可能会查看主题名称并将其视为用户名。然后查找该用户的角色或权限。但是,您如何处理这一点取决于您作为开发人员。希望有所帮助!