首页 > 解决方案 > Express Web API https 服务器在第一次请求时崩溃

问题描述

我在 Express 环境中的 Node.js 上运行开发 Web API 服务器。服务器使用 Greenlock 模块自动颁发 Let's Encrypt 证书。

当我运行npm start prod时,de 服务器成功启动,从控制台日志中我可以看到服务器正在侦听端口 80 和 443 以进行 https 连接:

在 0.0.0.0:80 监听 ACME 挑战,并重定向到 HTTPS
在 0.0.0.0:443 监听安全流量
准备服务:
web*****.club
ACME 目录 URL:https://acme-v02.api .letsencrypt.org/目录

NameSilo 域 web*****.club 通过 A 记录指向我路由器的公网 ip 地址,在路由器中,443 端口映射到 443 端口并转发到我的局域网上的 API 服务器所在的一台计算机.

一旦我从网页发出 https API 请求,服务器就会崩溃并产生以下输出:

错误证书问题:
读取 ECONNRESET
代码:ECONNRESET
错误:
在 TCP.onStreamRead (internal/stream_base_commons.js:209:20)读取 ECONNRESET

证书颁发似乎没问题,因为在 .config/acme 目录中,让我们在 https 请求之后直接添加带有私钥和公钥的 Let's Encrypt 证书。


(编辑)

服务器在本地通过 https 访问时以及通过 http 在本地访问时都可以工作。

它现在也适用于域名。我为端口 443 制作了一个 https 服务器,没有 Greenlock,在 openssl 的帮助下颁发了证书 cert.key/pem:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout cert.key -out cert.pem -sha256

在 server.ts 中使用了以下代码:

const express = require('express');
var app = require("../dist/app.js");
const https = require('https');
const fs = require('fs');
const port = 443

const httpsOptions = {
    key: fs.readFileSync('./security/cert.key'),
    cert: fs.readFileSync('./security/cert.pem')
}
const server = https.createServer(httpsOptions, app)
    .listen(port, () => {
        console.log('https server running on localhost at ' + port)
    })

感谢你的协助!

标签: node.jsapiexpressserver

解决方案


推荐阅读