我正在开发一种付款方式与 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