Estoy desarrollando la integración de un método de pago a Shopify que me pide que valide sus solicitudes (como cliente) usando mTLS.
Las aplicaciones de pago deben implementar mTLS para manejar todas* las solicitudes en las que actúan como servidor y Shopify como cliente. Este es el caso cuando Shopify inicia sesiones con aplicaciones de pago. En esos casos, Shopify usa su propio certificado de cliente. Las aplicaciones de pago deben usar la CA autofirmada que se proporciona a continuación para validar ese certificado. El uso de mTLS en estos escenarios permite que las aplicaciones de pagos verifiquen que el cliente que inicia la solicitud es Shopify y que el tráfico entre Shopify y la aplicación de pagos es confiable y seguro.
Usé túneles ngrok en muchas otras integraciones con Shopify, pero dado que no eran una aplicación de pago, Shopify no requería mTLS, por lo que no tuve problemas para usar los túneles.
Ahora que realizo la validación del certificado del cliente en el servidor:
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}`));Donde 'ca' apunta al certificado que Shopify me da en la documentación:
Cuando intento acceder a mi URL de ngrok, aparece este mensaje:
error de puerta de enlace ngrok
El servidor devolvió una respuesta HTTP no válida o incompleta.
ERR_NGROK_3004
Al buscar en la documentación de ngrok, descubrí que es posible usar túneles TLS.
La primera pregunta es : si uso un túnel TLS, ¿ya no obtendré ese error?
Por otro lado, Shopify también exige que:
La aplicación de pagos también debe proporcionar un certificado que Shopify validará. Para este certificado, debe usar un certificado SSL firmado por una CA de confianza y no una CA autofirmada de Shopify.
La segunda pregunta es : cuando coloco la aplicación en un servidor con una URL certificada HTTPS, entiendo que cumpliré con este requisito. Pero me gustaría saber si mientras estoy desarrollando la aplicación localmente, está bien usar un certificado generado, por ejemplo, con openSSL
La razón por la que pido su ayuda y no intento usar un túnel mTLS es que necesita una cuenta paga de ngrok para acceder a ese tipo de túnel, que no tengo.
Muchísimas gracias.
Estoy usando Node + Express para el servidor.
Documentación de Shopify: https://shopify.dev/apps/payments/general-transaction-requirements
Terminé enviando el siguiente correo electrónico al soporte de ngrok:
Hola mi nombre es Juan y quisiera saber si me pueden ayudar con lo siguiente:
Estoy desarrollando la integración de un Método de Pago a Shopify el cual me pide validar sus solicitudes usando mTLS.
Usé túneles ngrok en muchas otras integraciones con Shopify, pero no requería esta validación en particular y no tuve problemas con ellos.
Ahora que realizo la validación del certificado del cliente en el servidor, cuando intento acceder a mi url ngrok recibo este mensaje: error de puerta de enlace ngrok El servidor devolvió una respuesta HTTP inválida o incompleta.
ERR_NGROK_3004
Al buscar en la documentación de ngrok, descubrí que es posible usar túneles TLS especiales.
La pregunta es: si uso un túnel TLS, ¿ya no obtendré ese error? Le escribo porque si resuelve el problema, le pediré a mi empresa que actualice mi plan para poder tener acceso al túnel TLS. Pero quería estar seguro de que solucionará el problema antes de preguntar.
Muchas gracias.
Y te contestan con el siguiente email:
Hola, Juan,
Admitimos mTLS en nuestro perímetro para túneles HTTP. Crearía una configuración de punto final del tipo TLS mutuo y la adjuntaría a su dominio.
https://dashboard.ngrok.com/endpoints/configs
También admitimos mTLS en el agente o en su servidor para nuestros túneles TLS como dice, pero esto puede ser más complicado de configurar.
Si no funciona, tenemos una garantía de devolución de dinero de 15 días.
ben
Como no me era posible pagar la cuenta y acceder a estas funciones, terminé desarrollando la aplicación en un servidor de etapa, donde no tuve problemas. ¡Espero que esto te ayude! :)