工程

AWS上具有Node.js的客户端新浪体育新闻

2017年8月9日发布
尼克·哈特(Nick Hatt)

在这篇文章中,我’我将分享如何在可接收客户端新浪体育新闻的AWS负载均衡器后面设置Node.js服务器的方法。

背景

对于那些不知道的人,客户新浪体育新闻在整个医疗保健机构中都使用,它们构成了诸如 直接普通人 and 红杉项目。 在大多数使用API​​的地方,只有一对新浪体育新闻-服务器新浪体育新闻。一些魔术叫做“TLS Handshake”发生,并且仅使用一对,所有流量都被加密。

客户端新浪体育新闻添加了第二对新浪体育新闻,您可以想象,它们属于客户端。他们提出了一种较旧的(但仍然相对合理和安全)方法认证。该过程如下所示:

  1. 发生客户端新浪体育新闻公钥的某种手动交换,并将其存储在服务器应用程序中。这通常是在电话/电子邮件对话的上下文中完成的。
  2. 客户端被配置为使用所述公钥和私钥向服务器发出请求。
  3. 需要检查到服务器的传入请求,以查找作为HTTPS请求的一部分发送的客户端新浪体育新闻。
  4. 服务器需要通过已归档的公钥查找发件人。
  5. 服务器通常需要通过签名的形式来验证发送方是否也具有私钥。

长话短说吧’与OAuth风格的API身份验证方案相似,但是要依靠两个拥有预先信任关系的组织来共享公共密钥。

设置测试环境

要使用客户端新浪体育新闻测试https,您需要’需要一个支持它的客户端。

台式机(非镀铬) 版本的邮递员支持他们,或者您可以编写一个像这样的非常基本的节点应用程序进行测试:

Node.js

这部分很简单,但是 安德斯·布朗沃思(Anders Brownworth)撰写了一篇出色的文章,其中列举了许多很好的例子。

要将auth与我们的其他API auth方案集成在一起,我们使用passport.js,我使用了 很棒的护照模块:passport-client-cert。 Passport为我们提供了很好的灵活性,因为我们可以轻松地混合和匹配身份验证要求。例如,如果我们要堆叠需要客户新浪体育新闻和传统的承载令牌,则无需编写任何新代码。’只是配置!

在我们的应用程序内部,我们的客户成功团队能够为Redox源粘贴公共密钥,因此我们将公共密钥和指纹都存储到数据库中。

指纹已编入索引,我们首先对其进行检查以找到尝试进行身份验证的源。指纹有不同的形式,但它’基本上是公共密钥的哈希。它’很难找到指纹的冲突,但并非并非不可能,因此需要进行某种应用程序级验证。我们用 Leandrob的Saml20 验证发送的应用程序也具有私钥。

AWS

我们的常规API服务使用Amazon’的ALB负载平衡器执行SSL终止,因此我从一开始就知道它们将不起作用。负载平衡器是必需的,因为它提供了放置防火墙规则并自动将其分散到可用区的位置,并且在幕后,我们使用容器编排在少数EC2实例上运行Node.js应用程序。

搜寻了一段时间后,我得知 经典负载均衡器 可用于提供TCP直通。负载均衡器的配置非常简单–我们用对流层 对于我们整个基础架构,我能够快速部署和测试新的负载均衡器(以及相应的EC2自动扩展组)。

During testing, I ran into restrictions 上 using ports below 1024 上 MacOS. At the end of the day, I ended up using a port other than 443 和 proxying it between the load balancer 和 the container. This makes developing locally much less cool since I need to use //0.0.0.0:1337 for my postman/test app, but much easier 和 safer than running as root.

实际上获得新浪体育新闻也很有趣。既然我们不 ’在负载均衡器上终止SSL, 我用Digicert 签署此新应用程序的新浪体育新闻。而且由于该应用程序在Docker容器中运行,因此我选择将服务器新浪体育新闻存储在非常紧密锁定的S3存储桶中。

包起来

客户端新浪体育新闻是进行身份验证的一种整洁且稍微复杂的方法。与OAuth相比,服务器如何实现查找尚未建立最佳实践(password-client-cert模块由您自己编写)。

It’重要的是要了解它们的工作原理,并期望对新浪体育新闻有某种签名,如果您’重新实现类似的东西。当然,我们的客户已经从我们的实施中受益