带 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.pem
和 cert.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
(日文)
我正在使用 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.pem
和 cert.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 (日文)