允许 Stripe webhook 访问 AWS EC2 实例

时间:2021-05-28 15:59:37

标签: amazon-web-services amazon-ec2 stripe-payments

我确实有一个 Stripe webhook,它在 Stripe 的 TEST MODE 中被成功捕获并在 http 本地主机服务器上处理。

但是,当切换到 Stripe 的实时模式数据时,webhook 返回状态代码 500,而 EC2 实例未受影响,不会生成任何日志。

签名密钥或条带密钥没有问题,事件永远不会到达使用负载均衡器创建的 EC2 的 HTTPS 端点。

Stripe 的支持无法说明这一点,因此非常欢迎任何有关为什么会发生这种情况或如何处理的建议。

Stripe 上显示的错误是:

HTTP status code 500 (Internal Server Error)
Response Failed to connect to remote host

我向运行在 EC2 上的 express 服务器添加了一个白名单中间件:

app.use((req, res, next) => {
  console.log('Always inside ', req.originalUrl);
  next();
});

在处理条带 webhook URL 之前

app.use('/afterpayment', bodyParser.raw({ type: 'application/json' }), afterPaymentRoutes);

为了查看 Stripe 事件是否到达服务器,但未发生。

但是,如果我手动在浏览器中输入 Stripe Webhook URL,域/后付款,结果是预期的:白名单中间件打印消息并且 Webhook 处理程序接管。

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,正在看这个帖子。就我而言,问题是一些不同的事情。我强制使用 https 到我的网站(elb 正在将任何流量从 80 重定向到 443)。我的 ec2 上的应用程序正在接受端口 80 上的连接。对该站点的访问正常。我想可能由于重定向,将 webhook 数据发送到 elb 的条纹可能会中断。事实并非如此。但是,我有一个只允许从我的 IP 地址访问的安全组(用于测试)。从互联网(实际生产访问)将其更改为 0.0.0.0/0 并没有完全解决问题,但我想让事情设置得尽可能接近真实世界。在 Stripe 仪表板中,我创建了一个新的 webhook,指向我公开用于测试的应用程序端点。在 Stripe 仪表板中,我点击了“发送测试 webhook”按钮。这次错误不是超时,而是无效签名。所以,我知道将站点暴露给 Internet 是问题的一部分。,(是的,我可以创建一个安全组,只允许从 Webhook 数据来源的 IP 地址进行访问,但同样 - 我想保留这尽可能接近生产,感谢@justin-michael 在正确方向上的推动)。我的应用程序仍在使用我为开发设置的测试 webhook。当我创建新的 webhook 时,它也创建了一个新的签名密钥。我将这个新的 webhook 签名密钥提取到我的应用程序中,然后再次运行“发送测试 webhook”,它成功了。因此,允许从 Stripe 正确访问并确保签名密码正确为我解决了问题。

答案 1 :(得分:0)

问题是域名没有正确地暴露在互联网上。

所以我有 Elastic Beanstalk 环境运行 node.js 服务器应用程序,我在上面设置了 负载均衡器 并通过 <强>HTTPS。

虽然我可以成功模拟对域端点的 POST 请求,但在尝试捕获由 3rd 方应用程序(如 Stripe)发送的 webhook 时,nothing arrived on the server。该域也可以通过浏览器访问(或者看起来如此)。

问题是链接到负载均衡器的域名无法在互联网上公开解析。这里有 2 个有用的链接:

对它们运行测试揭示了与我的域的 DNSSEC 配置相关的问题,该配置在我的域中未启用。

在遵循此 instructions 时,我做到了:

  • 在托管区域,DNSSEC 签名 -> 启用 DNSSEC 签名
  • 创建KSK客户管理的CMK
  • DNSSEC签名下,从查看信息以创建DS记录
  • 复制信息
  • Route 53注册域 -> 域上 -> DNSSEC 状态,使用上一步中的信息创建了一个新密钥

在此之后,所有测试都通过了,并且成功处理了 webhook。