SSL ломает socket.io - PullRequest
       3

SSL ломает socket.io

0 голосов
/ 04 октября 2018

Я использовал socket.io для запуска службы обмена сообщениями, и все работало нормально, вплоть до того момента, пока я не зашифровал доменное имя, на котором размещен сервер socket.io, теперь я получаю «CORS заблокировал ту же политику происхожденияпричина: CORS-запрос не выполнен "

URL работает в незашифрованном виде (с использованием http) и прерывается при шифровании и использует https.

Сервер размещен на сервере Ubuntu с использованием NGINX для запросов прокси.

Любая помощь будет принята с благодарностью

код сервера:

const fs = require("fs")
const https = require('https')

const options =    {
    key: fs.readFileSync(
        "/etc/letsencrypt/live/talk.liven.online/privkey.pem"
    ),
    cert: fs.readFileSync(
        "/etc/letsencrypt/live/talk.liven.online/cert.pem"
    ),
    ca: fs.readFileSync(
        "/etc/letsencrypt/live/talk.liven.online/chain.pem"
    )
}


const http = https.createServer(options)

const io = require('socket.io')(http, { transports:['websocket', 'htmlfile', 'xhr-polling', 'jsonp-polling', 'polling']})

io.origins(["https://navigator.liven.online"])
io.on("connection", socket => {
    console.log("a user connected!")
    socket.on('disconnect', () => console.log('user disconnected'))
    socket.on('chat message', msg => io.emit("chat message", msg))
}
const port = process.env.PORT || 2001;
http.listen(port, port => console.log("listening on ${port}"))

код клиента:

// heavily redacted but i think this is all thats relevant
io.connect("https://talk.liven.online", {secure: true, rejectUnauthorized: false})

nginx block config

server {
    listen 80;
    listen [::]:80;

    root /var/www/talk.liven.online/html;
    index index.html index.htm index.nginx-debian.html;

    server_name talk.liven.online www.talk.liven.online;

    location / {
        proxy_pass https://localhost:2001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot

    ssl_certificate /etc/letsencrypt/live/talk.liven.online/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/talk.liven.online/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = talk.liven.online) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    listen [::]:80;

    server_name talk.liven.online www.talk.liven.online;
    return 404; # managed by Certbot


}

1 Ответ

0 голосов
/ 04 октября 2018

Конфигурация NGINX, которую вы показываете, предназначена для простого HTTP, а не HTTPS.Он также передает запросы с использованием HTTP, а не HTTPS:

proxy_pass http://localhost:2001
           ^^^^

Вы должны разрешить NGINX обрабатывать часть SSL, если вы хотите разрешить клиенту подключаться к https://....

.socket.io сервер работает на той же машине, что и NGINX, вы, вероятно, можете выполнять фактическое проксирование по обычному HTTP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...