【问题标题】:Docker ERR_SSL_PROTOCOL_ERRORDocker ERR_SSL_PROTOCOL_ERROR
【发布时间】:2020-07-17 22:15:59
【问题描述】:

我有 2 个 docker 容器在服务器上运行:

  1. 前端 Vue.js 应用程序 (0.0.0.0:6336 -> 443/tcp)
  2. Express 后端 (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” /询问'。此请求已被阻止;内容必须通过 HTTPS 提供。

【问题讨论】:

  • express 真的服务于 https 吗?如果你试试http://host:8000/query,那行得通吗?
  • 我更新了问题以显示http 会发生什么。
  • 如果您直接通过 http 访问该页面,是否有效?
  • 它确实可以在 http 上运行。我发现如果我将密钥和证书存储在后端存储库本身中它可以工作,但如果它们位于从主机绑定的目录中,它就不起作用。而且我已经验证了从主机绑定时文件是否存在。有什么想法吗?
  • 这表明 Express 真正服务于 http,而不是 https。我之前在使用 https 访问 http 资源时遇到过这个错误。

标签: node.js docker express server containers


【解决方案1】:

我的问题是在创建https 服务器之前添加listen 语句,我没有意识到顺序很重要。之前是这样的:

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

【讨论】:

    猜你喜欢
    • 2021-09-15
    • 2017-01-05
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 2018-04-30
    • 2019-09-14
    • 2020-07-20
    相关资源
    最近更新 更多