Node.js HTTPS服务器 ERR_EMPTY_RESPONSE

14

我使用openssl req -nodes -newkey rsa:2048 -keyout server.key -out server.csr命令创建了server.key和server.csr文件。我在startssl.com上创建了SSL证书并得到了一个证书文件。然后在我的node.js应用程序中,我读取了密钥和证书文件:

var app = module.exports = express.createServer({
  key: fs.readFileSync('server.key'),
  cert: fs.readFileSync('server.cert')
});

但是,现在我的应用程序返回空响应,显示“未收到数据”的消息。这可能是什么原因?我对SSL及其工作原理非常陌生,所以非常感谢任何帮助。

更多信息:我在我的VPS服务器(生产服务器)上生成了两个文件,密钥和csr文件,现在我正在尝试让它们在我的本地主机上运行(首先,在提交我的代码到生产环境之前;我必须测试它是否可以工作,然后才能进行git提交)。因此,这可能是由于我的本地主机(开发环境)与我的VPS服务器(生产环境)位于不同的域中。如果是这样,我该怎么做才能让本地主机和生产环境使用相同的证书?

或者,您建议我为我的开发环境创建另一个证书吗?唯一的问题是,因为它是本地完成的,所以我没有开发环境的域名。出于简单起见,我宁愿使用相同的证书(即使这意味着在本地主机上会出现损坏的锁定图标或其他问题)。

2个回答

43

我知道这是一个老问题,但今天我也遇到了相同的情况。我从 express 返回相同的结果 (ERR_EMPTY_RESPONSE)。

解决方法是确保在测试浏览器中指定https而不是http(例如:https://localhost:8443)。

如果之前使用过中间件将所有的http请求转发到https,则以前不会出现这个问题。此外,请注意你的浏览器可能会抱怨证书,但仍应继续操作(在Chrome中需要多次点击)。


5
谢谢!这解决了我的问题。 - David Calhoun
2
你,互联网的老用户,从我三个小时的咒骂和自杀意愿中拯救了我。 - Zerquix18
1
谢谢。我的情况也是同样的愚蠢问题。 - Dror Bar

3

您可以使用curl --insecure --verbose连接到应用程序来解决错误。一般情况下,不应在多个主机上使用SSL证书。您可以创建自签名的证书进行本地测试,并在生产环境中使用startssl证书。但无论如何,证书中的CN需要与用于连接站点的主机名匹配,以避免烦人的浏览器警告。您总是可以为您的计算机编写一个类似于sam.local的域名,并将其放入您的/etc/hosts文件中,并在自签名证书以及浏览器地址栏中使用该域名。


是的,这正是我通过研究得出的结论。不过还是谢谢你的回答!:) 但是,自签名证书不会有CA,或者它需要一个吗?如果是本地机器,那么我该如何让浏览器将本地机器识别为CA呢? - Sam
自签名证书会有一个 CA,但它将是您生成的 CA,浏览器内置了许多被识别的 CA。您可以将生成的 CA 证书导入浏览器以消除安全警告。 - Peter Lyons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接