Почему мой код webhook недоступен по HTTPS - PullRequest
0 голосов
/ 04 апреля 2020

Я использую сервер SSL на основе Apache2 с компьютера, на котором установлен RHEL 8 на AWS. Я пытаюсь развернуть webhook на этом сервере. Я вручную проверяю это, используя запросы curl. Когда я помещаю запрос через HTTP, он ведет себя как ожидалось. Однако, когда запрос сделан через HTTPS, я получаю это сообщение об ошибке:

curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number Мне нужно, чтобы он работал на HTTPS, так как Facebook не разрешает только HTTP-соединения.

Любой совет был бы удивительным, спасибо - если я задаю этот вопрос плохо, я прошу прощения, это мой первый вопрос.

Код для веб-крюка следующий:


// Imports dependencies and set up http server
const
  express = require('express'),
  bodyParser = require('body-parser'),
  app = express().use(bodyParser.json()); // creates express http server

// Sets server port and logs message on success
app.listen(process.env.PORT || 1337, () => console.log('webhook is listening'));

// Creates the endpoint for our webhook
app.post('/webhook', (req, res) => {

  let body = req.body;

  // Checks this is an event from a page subscription
  if (body.object === 'page') {

    // Iterates over each entry - there may be multiple if batched
    body.entry.forEach(function(entry) {

      // Gets the message. entry.messaging is an array, but
      // will only ever contain one message, so we get index 0
      let webhook_event = entry.messaging[0];
      console.log(webhook_event);
    });

    // Returns a '200 OK' response to all requests
    res.status(200).send('EVENT_RECEIVED');
  } else {
    // Returns a '404 Not Found' if event is not from a page subscription
    res.sendStatus(404);
  }

});

// Adds support for GET requests to our webhook
app.get('/webhook', (req, res) => {

  // Your verify token. Should be a random string.
  let VERIFY_TOKEN = "duckgoesquack"

  // Parse the query params
  let mode = req.query['hub.mode'];
  let token = req.query['hub.verify_token'];
  let challenge = req.query['hub.challenge'];

  // Checks if a token and mode is in the query string of the request
  if (mode && token) {

    // Checks the mode and token sent is correct
    if (mode === 'subscribe' && token === VERIFY_TOKEN) {

      // Responds with the challenge token from the request
      console.log('WEBHOOK_VERIFIED');
      res.status(200).send(challenge);

    } else {
      // Responds with '403 Forbidden' if verify tokens do not match
      res.sendStatus(403);
    }
  }
});

Я попытался обновить мои apache conf файлы - раздел виртуальных хостов выглядит следующим образом:

NameVirtualHost *:80

<VirtualHost *:443>
ServerName lloydarnoldtestapps.tk
DocumentRoot /var/www/lloydarnoldtestapps.tk
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/lloydarnoldtestapps.tk/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/lloydarnoldtestapps.tk/privkey.pem
</VirtualHost>

<VirtualHost *:80>
ServerName lloydarnoldtestapps.tk
DocumentRoot /var/www/lloydarnoldtestapps.tk
</VirtualHost>

<VirtualHost *:443>
ServerName www.lloydarnoldtestapps.tk
ServerAlias *.lloydarnoldtestaps.tk
DocumentRoot /var/www/lloydarnoldtestapps.tk
SSLCertificateFile /etc/letsencrypt/live/lloydarnoldtestapps.tk/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/lloydarnoldtestapps.tk/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>

<VirtualHost *:1337>
ServerName lloydarnoldtestapps.tk
DocumentRoot /var/www/lloydarnoldtestapps.tk
SSLCertificateFile /etc/letsencrypt/live/lloydarnoldtestapps.tk/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/lloydarnoldtestapps.tk/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>


<VirtualHost *:80>
ServerName www.lloydarnoldtestapps.tk
DocumentRoot /var/www/lloydarnoldtestapps.tk
</VirtualHost>

<VirtualHost *:1337>
ServerName www.lloydarnoldtestapps.tk
DocumentRoot /var/www/lloydarnoldtestapps.tk
SSLCertificateFile /etc/letsencrypt/live/lloydarnoldtestapps.tk/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/lloydarnoldtestapps.tk/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>

1 Ответ

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

Мне кажется, я вижу, что происходит.
curl -vv -X POST https://www.lloydarnoldtestapps.tk ответ от apache Server: Apache/2.4.37

При работе curl -vv -X POST http://www.lloydarnoldtestapps.tk:1337/webhook
Ответ от express X-Powered-By: Express

Я думаю, что когда вы сначала запустили express, и он привязался к port 1337, а когда вы запустили apache, он фактически не смог выполнить привязку, поэтому вы получаете 200 при отправке запроса на port 1337

Невозможно вернуть индекс. js из apache. Вы можете использовать apache в качестве обратного прокси-запроса и прокси-запроса от AWS (HTTPS) -> Apache (HTTP) -> Express. Таким образом, apache прекратит https и сделает запрос через http на express.

Просмотрите Proxy и ProxyPass для apache и руководство по обратному прокси на nodejs сервере.

Проверьте это сообщение ProxyPass apache https на сервер узла

В частности, эти директивы

  ProxyPass / https://example.com:4433/
  ProxyPassReverse / https://example.com:4433 /

Отправьте ответ, если у вас есть какие-либо вопросы.

...