Докер ERR_SSL_PROTOCOL_ERROR

У меня на сервере работают 2 докер-контейнера:

  1. Приложение Frontend Vue.js (0.0.0.0:6336 - ›443 / tcp)
  2. Express Backend (0.0.0.0:8000 - ›443 / tcp)

Когда интерфейс пытается связаться с сервером, с этим запросом:

https://host:8000/query

Я получаю такую ​​ошибку:

net :: ERR_SSL_PROTOCOL_ERROR

К бэкэнду применен сертификат, например:

app = https.createServer({
    key: fs.readFileSync('private_key.key', 'utf8'),
    cert: fs.readFileSync('cert.crt', 'utf8')
}, app)

Если я запускаю оба этих приложения локально, все работает нормально. Мне кажется, что это простое решение, но я новичок в Docker, поэтому не знаю, с чего начать.

Если я изменю его на http, я получаю такую ​​ошибку:

xhr.js: 178 Смешанное содержимое: страница по адресу https: // host: 6336 / # / search? subject = a была загружена по HTTPS, но запросила небезопасную конечную точку XMLHttpRequest http: // host: 8000 / query. . Этот запрос заблокирован; контент должен обслуживаться по HTTPS.


person Adam Zarn    schedule 17.07.2020    source источник
comment
Экспресс действительно обслуживает https? Если вы попробуете http://host:8000/query, это сработает?   -  person Nick ODell    schedule 18.07.2020
comment
Я обновил вопрос, чтобы показать, что происходит с http.   -  person Adam Zarn    schedule 18.07.2020
comment
Если вы обращаетесь к этой странице напрямую через http, это работает?   -  person Nick ODell    schedule 18.07.2020
comment
Он работает через http. Я обнаружил, что если я храню ключ и сертификат в самом репозитории серверной части, он работает, но если они находятся в каталоге, привязанном к хосту, это не работает. И я проверил, что файлы есть при привязке с хоста. Есть идеи, что не так?   -  person Adam Zarn    schedule 20.07.2020
comment
Это говорит о том, что Express действительно обслуживает http, а не https. Я получал эту ошибку раньше при доступе к ресурсам http с помощью https.   -  person Nick ODell    schedule 20.07.2020


Ответы (1)


Моя проблема заключалась в добавлении оператора listen до создания сервера https, я не понимал, что порядок имеет значение. Раньше было так:

var app = express()

app.listen(PORT, function() {
  console.log(`Listening on port ${PORT}...`)
});

const options = {
  key: fs.readFileSync(keyPath, 'utf8'),
  cert: fs.readFileSync(certPath, 'utf8')
}
app = https.createServer(options, app)

return app

listen должен появиться после создания https сервера:

var app = express()

const options = {
  key: fs.readFileSync(keyPath, 'utf8'),
  cert: fs.readFileSync(certPath, 'utf8')
}
app = https.createServer(options, app)

app.listen(PORT, function() {
  console.log(`Listening on port ${PORT}...`)
});

return app
person Adam Zarn    schedule 20.07.2020