@nastyskafomka

Как подключить к node js ssl от cloudflare?

Здравствуйте, делаю сервер для уведомлений в реальном времени на socket.io.

Данный сервер находится в домене domain.ru

Подключаюсь к данному серверу на поддомене tech.domain.ru (для теста)

Код клиентского html
<!doctype html>
<html>
<head>
    <title>Socket.IO chat</title>
    <script src="//domain.ru/socket.io/socket.io.js"></script>
    <script src="https://code.jquery.com/jquery-1.11.1.js"></script>
    <script>
        $(function () {
            var socket = io.connect('https://VPSip:2096', {rejectUnauthorized: false, secure: true});
            $('form').submit(function (e) {
                e.preventDefault(); // prevents page reloading
                socket.emit('chat message', $('#m').val());
                $('#m').val('');
                return false;
            });
            socket.on('chat message', function (msg) {
                $('#messages').append($('<li>').text(msg));
            });
            socket.on('connect', () => {
                console.log(socket.id);
            });
        });
    </script>
</head>
<body>
<ul id="messages"></ul>
<form action="">
    <input id="m" autocomplete="off"/>
    <button>Send</button>
</form>
</body>
</html>


Серверная часть:
var fs = require('fs');
var app = require('express')();

var http = require('https').createServer(app);

var io = require('socket.io').listen(http)

app.get('/', function (req, res) {
    res.sendFile(__dirname + '/index.html');
});
io.on('connection', function (socket) {
    console.log('a user connected');
    console.log('User id: '+socket.id);
    socket.on('disconnect', function () {
        console.log('user disconnected');
    });
    socket.on('chat message', function(msg){
        console.log("message: "+msg);
        io.emit('chat message', msg);
    });
});
app.post('/send',function (req, res) {
    console.log(res.data);
});
io.emit('some event', { for: 'everyone' });

http.listen(2096, function () {
    console.log('listening on *:2096');
});


При открытии консоли разработчика вижу:
GET https://VPSip:2096/socket.io/?EIO=3&transport=poll... net::ERR_SSL_VERSION_OR_CIPHER_MISMATCH

Где VPSip - ip адрес моего vps сервера.

ssl от cloudflare

Что делать, помогите пожалуйста. Два дня ищу, не могу найти решения.
  • Вопрос задан
  • 1596 просмотров
Решения вопроса 1
@nastyskafomka Автор вопроса
Проблема решена.

Как всегда виновата невнимательность, и желание "все и сразу".

Для того, чтобы подключить к node сертификат от Cloudflare нужно выполнить следующие действия:

1) Сгенерировать TLS сертификат от Cloudflare. Для этого переходим в панель управления доменом, далее Crypto и там находим пункт Origin Certificates
5cae399254f58892146189.png
2) Создать TLS сертификат, выбрав следующие параметры:
5cae3a04086c4580548489.png
(Срок можно выбрать другой)
3) Теперь на сервере создать папку где будут лежать наши сертификаты и создать в ней файлы:
your-domain.ltd.pem и your-domain.ltd.key
Где your-domain.ltd - ваш домен.
4) В your-domain.ltd.pem вставить первый ключ
Пример первого ключа
5cae3ac918b0d339617028.png

5) В your-domain.ltd.key вставить второй ключ
Пример второго ключа
5cae3b0c2d009139184631.png

6) Далее на сервере подключить их:
var app = require('express')();

var options = {
    key: fs.readFileSync('ssl/your-domain.ltd.key'), // PRIVATE KEY
    cert: fs.readFileSync('ssl/your-domain.ltd.pem') // CERTIFICATE
};

var http = require('https').createServer(options,app);


Далее, нужно чтобы сервер работал на SSL порте, который использует Cloudflare (ссылка)

spoiler

Может это не обязательно, но мы сделали именно так
5cae3c320abd0767586155.png
spoiler

На http не обращайте внимания, просто так получилось.


Вот и все, теперь можно запустить node.js сервер и перейти по адресу your-domain.ltd:port
spoiler
По идее...

И мы успешно попадем на сервер.

Надеюсь это кому-нибудь поможет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@BorisKorobkov
Web developer
var fs = require('fs');

var options = {
  key: fs.readFileSync('ssl/privkey.pem'),
  cert: fs.readFileSync('ssl/fullchain.pem')
};

var httpServer = require('http').createServer();
var httpsServer = require('https').createServer(options);
...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы