Stripe TLS 1.2 Webhook проблема - PullRequest
0 голосов
/ 22 марта 2019

Я разрабатываю API, связанный с Stripe, используя Node.js и Express Framework.Мой API работает в контейнере (FROM node:10.1.0), и я запускаю контейнер на виртуальной машине Ubuntu 16 с помощью docker-compose:

version: '2.2'

services:
  api:
    image: my-image:latest
    expose:
      - 80

  nginx:
    image: nginx
    ports:
      - "80:80"
      - "443:443"
    links:
      - api
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf

и с файлом nginx.conf:

events {
    worker_connections 1024;
}

http {
  server {
    listen 80;

    location / {
      return 301 https://$host$request_uri;
    }
  }

  server {
    listen 443 ssl;

    ssl_certificate     /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1;
    ssl_ciphers TLS_CHACHA20_POLY1305_SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-CCM:ECDHE-ECDSA-AES256-CCM8:ECDHE-ECDSA-ARIA256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-CCM:ECDHE-ECDSA-AES128-CCM8:ECDHE-ECDSA-ARIA128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ARIA256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ARIA128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-CCM:DHE-RSA-AES256-CCM8:DHE-RSA-ARIA256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-CCM:DHE-RSA-AES128-CCM8:DHE-RSA-ARIA128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384;
    ssl_ecdh_curve X25519:secp521r1:secp384r1;
    ssl_prefer_server_ciphers on;

    try_files   $uri $uri/ =404;

    location /api/ {
      proxy_pass        http://api:80/;
      proxy_buffering   off;
      proxy_set_header  Host $host;
      proxy_set_header  X-Real-IP $remote_addr;
    }
  }
}

При запуске curl -XPOST https://my.server.com/api/webhook --tlsv1.2 --verbose я получаю хороший ответ, который выглядит так, как будто работает TLS 1.2:

*   Trying 23.100.121.74...
* TCP_NODELAY set
* Connected to my.server.com (23.100.121.74) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-CHACHA20-POLY1305
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: OU=Domain Control Validated; CN=*.server.com
*  start date: Sep  7 16:29:45 2018 GMT
*  expire date: Sep  7 16:29:45 2019 GMT
*  subjectAltName: host "my.server.com" matched cert's "*.server.com"
*  issuer: C=US; ST=Arizona; L=Scottsdale; O=GoDaddy.com, Inc.; OU=http://certs.godaddy.com/repository/; CN=Go Daddy Secure Certificate Authority - G2
*  SSL certificate verify ok.
> POST /api/webhook HTTP/1.1
> Host: my.server.com
> User-Agent: curl/7.54.0
> Accept: */*
> 
< HTTP/1.1 400 Bad Request
< Server: nginx/1.15.7
< Date: Fri, 22 Mar 2019 17:50:33 GMT
< Content-Type: application/json; charset=utf-8
< Content-Length: 68
< Connection: keep-alive
< X-Powered-By: Express
< Vary: Origin
< ETag: W/"44-HsiDCuzDBw0t2vb7UevWXjyvmIo"
< 
* Connection #0 to host api.server.com left intact
{"message":"Unable to extract timestamp and signatures from header"}

Однако я не получаю никаких веб-хуков на своем сервере (локально работает ngrok)и при проверке веб-крюка на платформе Stripe я вижу эту ошибку для моих испытаний веб-крючка на сервере:

Status Pending (2 tries)
Next retry around 2019/03/22 18:38 (1 attempt left)
Retry history
[2019/03/22 17:08 to https://my.server.com/api/webhook]: (TLS error) ERR
[2019/03/22 17:38 to https://my.server.com/api/webhook]: (TLS error) ERR

Я пробовал https://support.stripe.com/questions/how-do-i-upgrade-my-openssl-to-support-tls-1-2 на виртуальной машине Linux, но ничего не изменилось.Также https://support.stripe.com/questions/upgrade-your-node-integration-from-tls-1-0-to-tls-1-2 говорит мне TLS 1.2 is supported, поэтому не уверен, где он идет не так

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Мне удалось решить проблему с помощью https://whatsmychaincert.com/, чтобы создать недостающую «цепочку», а затем использовать следующую команду для добавления к сертификату, взятому из службы сертификации приложений Azure:

cat fullchain.pem example.com.chain.crt> example.com.chained.crt

и использовал example.com.chained.crt в nginx вместо ssl_certificate. Теперь ssllab говорит мне, что цепь завершена, и Stripe дает мне 200 успехов

0 голосов
/ 23 марта 2019

Для Stripe требуются действительные сертификаты TLS для конечных точек веб-подключения HTTPS, и чаще всего эти проблемы возникают, когда на вашем сайте отсутствует промежуточный сертификат SSL. В частности, в результатах SSL Labs вы увидите один из элементов в разделе «Путь к сертификату», помеченный как «Дополнительная загрузка». Вы можете подтвердить это здесь: https://www.ssllabs.com/ssltest/analyze.html

Если вы видите эту проблему, я рекомендую посетить ваш эмитент сертификата (или реселлера, у которого вы приобрели ваш сертификат), и переустановить ваш сертификат SSL, включая любой «пакет» сертификатов CA, который поставляется с ним. Если у вас возникли проблемы с этим, я бы посоветовал поделиться результатами ваших SSL Labs напрямую с эмитентом и вашим веб-хостом, который поможет вам найти этот промежуточный сертификат и решить его.

...