Автоматическое получение сертификатов сервера с https / ws сервера - PullRequest
0 голосов
/ 07 мая 2020

Я размещаю веб-сайт на git страницах, который открывает видеопоток при определенных щелчках мыши через безопасный веб-узел (wss) с использованием этой библиотеки: github.com/websockets/ws. При подключении видео со страницы http через простой веб-сокет (ws) все было в порядке, но я понял, что страница github будет размещена через https, а firefox не разрешает незащищенные подключения через веб-сокет через https, требуется wss.

Для этого я выполнил шаги на странице ws websockets, и сервер websocket как бы «прячется» за https-сервером, который выполняет рукопожатие сертификата. Проблема в следующем: если я обычно использую свою веб-страницу и открываю ссылку, которая запускает wss-соединение с видео, оно не работает, сервер не знает о его существовании. Если я сначала захожу на сервер напрямую через IP и порт, используя ссылку https://IP: 999 , он извлекает сертификаты, и с этого момента веб-сайт работает бесконечно.

Есть ли способ сделать это естественно, что не требует, чтобы я пытался посетить безголовый сервер, чтобы выполнить рукопожатие сертификата? Я просто хочу открыть wss-соединение, но накладные расходы, связанные с необходимостью прямого посещения сервера для получения сертификатов, кажутся немного странными.

Настройка сервера выглядит так:

  const server = https.createServer({
    cert: fs.readFileSync('./cert/cert.pem'),
    key: fs.readFileSync('./cert/key.pem'),
}, function (req, res) {
    console.log(new Date() + ' ' +
    req.connection.remoteAddress + ' ' +
    req.method + ' ' + req.url);
    res.writeHead(200);
    res.end("hello foobarbackend\n");
    });
  this.wsServer = new ws.Server({
    server
  })
  this.wsServer.on("connection", (socket, request) => {
    return this.onSocketConnect(socket, request)
  })
  server.listen(9999, '0.0.0.0');

После получения сертификатов через https: //: 9999 я могу без проблем воспроизводить видео в этом браузере по адресу wss: //: 9999, я что-то упускаю.

1 Ответ

0 голосов
/ 07 мая 2020

На этот вопрос здесь отвечает целиком мир SSL / TLS. Проблема заключалась в том, что безопасные браузеры практически незаметно отклоняли подключения WSS: // к серверам с самоподписанными сертификатами. Мои сертификаты были самоподписаны.

Вот почему пользователю придется сначала перейти к IP-адресу сервера напрямую через HTTP, а затем принять предупреждения. Оттуда все как обычно.

Что нужно было сделать, так это зарегистрировать доменное имя для IP, на котором был расположен сервер (Droplet). Затем certbot был использован для генерации реальных сертификатов (ключа, сертификата) для домена. Я заменил cert.pem и key.pem выше на истинно сгенерированные. Имя домена может быть любым, например mywebsitewhatever.app.

Теперь на стороне клиента вы можете открыть соединение с wss: //mywebsitewhatever.app: 9999, и браузер примет его автоматически, и все заработает. Нет предупреждений или перехода на страницу предупреждения, которую нужно принять.

...