带 SSL 的 npm http 服务器

npm http-server with SSL

我正在使用 npm 包 "http-server" (https://www.npmjs.com/package/http-server) 来设置一个简单的网络服务器,但我无法让它使用 SSL。我在 package.json 中的命令是

http-server -p 8000 -o -S

在我的根目录中有一个 cert.pem 和 key.pem(目前)。 “-o”选项将浏览器打开到默认页面,但该页面使用 HTTP 提供,甚至无法通过 HTTPS 访问。我没有收到任何错误或警告。我也试过添加“-C”和“-K”选项,但没有成功。有人用这个包成功了吗?

首先,确保您有 key.pemcert.pem 文件。您可以使用此命令生成它们:

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

输入命令后,系统会提示您几个问题。使用 127.0.0.1 作为 "Common name" 的值,如果您希望能够在 OS 的根证书存储或浏览器中安装证书以使其受信任。

这会生成一个证书密钥对,有效期大约为 10 年(准确地说是 3650 天)。

然后您需要 运行 服务器 -S 启用 SSL 和 -C 您的证书文件:

$ http-server -S -C cert.pem -o
Starting up http-server, serving ./ through https
Available on:
  https:127.0.0.1:8080
  https:192.168.1.101:8080
  https:192.168.1.104:8080
Hit CTRL-C to stop the server

仅供日后参考,我的问题已通过在 package.json 中将软件包更新到最新版本得到解决。我复制粘贴了一个旧的示例文件,但没有更新版本号。

编辑: 自从写下这个答案以来,有一个新工具 mkcert 可以为您完成这项工作。请参阅 。出于历史兴趣,我在下面的原始答案。

Firefox 不接受 self-signed 证书,因此需要付出更多努力。首先创建一个CA:

openssl req -batch -new -newkey ec:(openssl ecparam -name prime256v1|psub) -nodes -keyout ca-key.pem -x509 -out ca.pem -days 3650 -subj "/CN=A localhost CA"

将 ca.pem(本地主机 CA)添加到 OS and/or Firefox(其他浏览器使用系统 CA)的可信证书中。将 ca* 文件保存在安全位置以备将来使用,这样您就不必再这样做了。

然后,对于您是 运行 的任何站点,无论何时您希望更改设置,请创建 cert.pem 和 key.pem:

openssl req -batch -new -newkey ec:(openssl ecparam -name prime256v1|psub) -nodes -keyout key.pem -subj /CN=localhost | openssl x509 -req -CAkey ca-key.pem -CA ca.pem -CAcreateserial -out cert.pem -days 365 -extfile (echo subjectAltName=DNS:localhost|psub)

以上应该适用于大多数系统。如果没有,您可能需要创建临时文件 ecparam.tmp 和 ext.tmp。命令在功能上等同于两个单行代码:

# Output Elliptic Curve parameters to a temporary file
openssl ecparam -name prime256v1 -out ecparam.tmp

# Create CA
openssl req -batch -new -newkey ec:ecparam.tmp -nodes -keyout ca-key.pem \
  -x509 -out ca.pem -days 3650 -subj "/CN=A localhost CA"

# Create a CSR for localhost, then sign it by CA
echo subjectAltName=DNS:localhost > ext.tmp
openssl req -batch -new -newkey ec:ecparam.tmp -nodes -keyout key.pem \
  -subj /CN=localhost | openssl x509 -req -CAkey ca-key.pem -CA ca.pem \
  -CAcreateserial -out cert.pem -days 365 -extfile ext.tmp

我安装了mkcert

brew install mkcert
brew install nss # if you use Firefox
mkcert -install

然后,在你的项目目录中:

mkcert 0.0.0.0 localhost 127.0.0.1 ::1

最后,我重命名了生成的文件:

  • 0.0.0.0+3-key.pem -> key.pem
  • 0.0.0.0+3.pem -> cert.pem

和运行以下命令:

http-server -S -C cert.pem -o

然后我得到:

我引用了这个博客:https://qiita.com/walkers/items/b90a97a99bbb27f6550f (日文)