首页 > 解决方案 > mTLS 验证和 ngrok

问题描述

我正在开发一种付款方式与 Shopify 的集成,它要求我使用 mTLS 验证他们(作为客户端)的请求。

支付应用程序必须实施 mTLS 以处理它们充当服务器和 Shopify 作为客户端的所有请求。当 Shopify 启动与支付应用程序的会话时就是这种情况。在这些情况下,Shopify 使用自己的客户端证书。支付应用程序必须使用下面提供的自签名 CA 来验证该证书。在这些场景中使用 mTLS 允许支付应用程序验证发起请求的客户端是 Shopify,并且 Shopify 和支付应用程序之间的流量是可信且安全的。

我在与 Shopify 的许多其他集成中使用了 ngrok 隧道,但由于它们不是支付应用程序,Shopify 不需要 mTLS,所以我使用隧道没有问题。

现在我在服务器中进行客户端证书验证:

 https
  .createServer(
    {
      requestCert: true,
      rejectUnauthorized: true,
      ca: fs.readFileSync(path.join(__dirname, 'security', 'ca.pem')),
    },
    app
  )
  .listen(APP_PORT, () => console.log(`Server listening at: ${APP_URL}`));

'ca' 指向 Shopify 在文档中给我的证书:

当我尝试访问我的 ngrok 网址时,我收到以下消息:

ngrok 网关错误

服务器返回无效或不完整的 HTTP 响应。

ERR_NGROK_3004

查看 ngrok文档,我发现可以使用 TLS 隧道。

第一个问题是:如果我使用 TLS 隧道,我不会再收到那个错误了吗?

另一方面,Shopify 还要求:

支付应用程序还需要提供 Shopify 将验证的证书。对于此证书,您需要使用受信任的 CA 签名 SSL 证书,而不是 Shopify 的自签名 CA。

第二个问题是:当我将应用程序放在具有 HTTPS 认证 URL 的服务器中时,我知道我会满足这个要求。但我想知道当我在本地开发应用程序时,是否可以使用生成的证书,例如使用openSSL

我寻求您的帮助并且不尝试使用 mTLS 隧道的原因是您需要一个 ngrok 付费帐户才能访问我没有的那种类型的隧道。

非常感谢。


我使用 Node + Express 作为服务器。

Shopify 文档:https ://shopify.dev/apps/payments/general-transaction-requirements

标签: javascriptexpresssslmtls

解决方案


我最终向 ngrok 支持发送了以下电子邮件:

您好,我的名字是 Juan,我想知道您是否可以帮助我解决以下问题:

我正在开发一种付款方式与 Shopify 的集成,它要求我使用 mTLS 验证他们的请求。

我在与 Shopify 的许多其他集成中使用了 ngrok 隧道,但不需要此特定验证,我对它们没有任何问题。

现在我在服务器中进行了客户端证书验证,当我尝试访问我的 ngrok url 时,我收到以下消息:ngrok gateway error 服务器返回了无效或不完整的 HTTP 响应。

ERR_NGROK_3004

查看 ngrok 文档,我发现可以使用特殊的 TLS 隧道。

问题是:如果我使用 TLS 隧道,我不会再收到该错误了吗?我写信给你是因为如果它确实解决了问题,我会要求我的公司升级我的计划,以便我可以访问 TLS 隧道。但我想确定它会在询问之前解决问题。

非常感谢你。

他们回复了以下电子邮件:

嗨,胡安,

对于 HTTP 隧道,我们确实在我们的边缘支持 mTLS。您将创建双向 TLS 类型的端点配置并将其附加到您的域。

https://dashboard.ngrok.com/endpoints/configs

正如您所说,我们还在代理或您的服务器上为我们的 TLS 隧道支持 mTLS,但这可能设置起来更复杂。

如果它不起作用,我们有 15 天退款保证。

由于我无法支付帐户费用并访问这些功能,因此我最终在舞台服务器上开发了该应用程序,我没有遇到任何问题。我希望这对你有帮助!:)


推荐阅读