跳转到主要内容

category

大多数时候,http://localhost出于开发目的,其行为类似HTTPS。然而,也有一些特殊情况,例如自定义主机名或跨浏览器使用安全cookie,在这些情况下,您需要明确设置您的开发网站,使其表现得像HTTPS,以准确地表示您的网站在生产中的工作方式。(如果您的生产网站不使用HTTPS,请优先切换到HTTPS)。

本页介绍如何使用HTTPS在本地运行您的网站。

注意:在本文中,关于localhost的语句也适用于127.0.0.1和[::1],因为它们都描述了本地计算机地址(也称为环回地址)。为了简单起见,这些说明没有指定端口号。所以当你看到http://localhost,读作http://localhost:{PORT}或http://127.0.0.1:{端口}。


有关简要说明,请参阅mkcert快速参考**

使用mkcert使用HTTPS在本地运行您的网站(推荐)


在本地开发站点和访问中使用HTTPShttps://localhost或https://mysite.example(自定义主机名),您需要由设备和浏览器信任的实体(称为可信证书颁发机构(CA))签名的TLS证书。在创建HTTPS连接之前,浏览器会检查开发服务器的证书是否由受信任的CA签名。

我们建议使用跨平台CA mkcert来创建和签署您的证书。有关其他有用的选项,请参阅使用HTTPS在本地运行您的网站:其他选项。

许多操作系统包括用于创建证书的库,例如openssl。然而,它们比mkcert更复杂、更不可靠,而且不一定是跨平台的,这使得大型开发团队更难访问它们。

小心

 

  • 永远不要导出或共享mkcert在运行mkcert-install时自动创建的rootCA-key.pem文件。攻击者获取此文件后,可以对您可能访问的任何网站进行路径攻击。他们可以拦截从你的机器到任何网站的安全请求——你的银行、医疗保健提供商或社交网络。如果您需要知道rootCA-key.pem的位置以确保其安全,请运行mkcert-CAROOT。
  • 仅将mkcert用于开发目的,并且从扩展上讲,永远不要要求最终用户运行mkcert命令。
  • 开发团队:团队的所有成员都应该单独安装和运行mkcert(而不是存储和共享CA和证书)。

安装程序

 

  • 安装mkcert(仅一次)。

按照说明在操作系统上安装mkcert。例如,在macOS上:

brew install mkcert
brew install nss # if you use Firefox

 

  • 将mkcert添加到本地根CA。

在终端中,运行以下命令:

mkcert -install


这将生成一个本地证书颁发机构(CA)。您的mkcert生成的本地CA仅在您的设备上本地受信任。

  • 为您的网站生成一个由mkcert签名的证书。

在您的终端中,导航到站点的根目录或您希望将证书保存在其中的任何目录。

然后,运行:

mkcert localhost


如果您使用的是像mysite.example这样的自定义主机名,请运行:

mkcert mysite.example


此命令执行两件事:

  • 为您指定的主机名生成证书。
  • 让mkcert对证书进行签名。


您的证书现在已准备就绪,并由浏览器在本地信任的证书颁发机构签名。

  • 将您的服务器配置为使用HTTPS-您刚刚创建的TLS证书。

如何执行此操作的详细信息取决于您的服务器。以下是一些示例:

With node:

server.js(替换{PATH/TO/CERTIFICATE…}和{PORT}):

const https = require('https');
const fs = require('fs');
const options = {
  key: fs.readFileSync('{PATH/TO/CERTIFICATE-KEY-FILENAME}.pem'),
  cert: fs.readFileSync('{PATH/TO/CERTIFICATE-FILENAME}.pem'),
};
https
  .createServer(options, function (req, res) {
    // server code
  })
  .listen({PORT});


👩🏻‍💻 使用http服务器:

按如下方式启动服务器(替换{PATH/TO/CERTIFICATE…}):

http-server -S -C {PATH/TO/CERTIFICATE-FILENAME}.pem -K {PATH/TO/CERTIFICATE-KEY-FILENAME}.pem

👩🏻‍💻 使用React开发服务器:

按如下方式编辑您的package.json,并替换{PATH/TO/CERTIFICATE…}:

"scripts": {
"start": "HTTPS=true SSL_CRT_FILE={PATH/TO/CERTIFICATE-FILENAME}.pem 
SSL_KEY_FILE={PATH/TO/CERTIFICATE-KEY-FILENAME}.pem react-scripts start"


例如,如果您已经在站点的根目录中为localhost创建了证书:

|-- my-react-app
    |-- package.json
    |-- localhost.pem
    |-- localhost-key.pem
    |--...


那么你的开始脚本应该是这样的:

"scripts": {
    "start": "HTTPS=true SSL_CRT_FILE=localhost.pem 
SSL_KEY_FILE=localhost-key.pem react-scripts start"


👩🏻‍💻 其他示例:


打开https://localhost或https://mysite.example在浏览器中仔细检查您是否使用HTTPS在本地运行您的网站。您不会看到任何浏览器警告,因为您的浏览器信任mkcert作为本地证书颁发机构。

mkcert快速参考


要使用HTTPS运行本地开发站点,请执行以下操作:

  • 设置mkcert。

如果您还没有,请安装mkcert,例如在macOS上:

brew install mkcert


检查Windows和Linux的install mkcert说明。

然后,创建一个本地证书颁发机构:

mkcert -install

 

  • 创建一个受信任的证书。
mkcert {YOUR HOSTNAME e.g. localhost or mysite.example}


这将创建mkcert自动签名的有效证书。

将开发服务器配置为使用HTTPS和您在步骤2中创建的证书。

您现在可以在浏览器中访问https://{YOUR HOSTNAME},而不会发出警告

注意:这样做仅用于开发目的,切勿导出或共享文件rootCA-key.pem。如果您需要知道该文件的位置以确保其安全,请运行mkcert-CAROOT。

</div>


使用HTTPS在本地运行您的网站:其他选项


以下是设置证书的其他方法。这些通常比使用mkcert更复杂或风险更大。

自签名证书


您也可以决定不使用像mkcert这样的本地证书颁发机构,而是自己签署证书。这种方法有几个陷阱:

  • 浏览器不信任您作为证书颁发机构,因此会显示需要手动绕过的警告。在Chrome中,您可以使用#allow unsecurity localhost标志在localhost上自动绕过此警告。
  • 如果你在一个不安全的网络中工作,这是不安全的。
  • 这并不一定比使用像mkcert这样的本地CA更容易或更快。
  • 自签名证书的行为与受信任证书的行为不完全相同。
  • 如果您没有在浏览器上下文中使用此技术,则需要禁用服务器的证书验证。忘记在生产中重新启用它会导致安全问题。

警告浏览器的屏幕截图显示何时使用自签名证书。
当使用自签名证书时,浏览器会显示警告。
如果您没有指定证书,React和Vue的开发服务器HTTPS选项会在后台创建一个自签名证书。这很快,但它也带有相同的浏览器警告和自签名证书的其他陷阱。幸运的是,您可以使用前端框架的内置HTTPS选项,并指定使用mkcert或类似方法创建的本地可信证书。有关更多信息,请参阅带有React的mkcert示例。

为什么浏览器不信任自签名证书?


如果您使用HTTPS在浏览器中打开本地运行的网站,浏览器会检查本地开发服务器的证书。当它看到你自己签署了证书时,它会检查你是否注册为受信任的证书颁发机构。因为你不是,所以你的浏览器无法信任该证书,并且它会显示一条警告,告诉你你的连接不安全。如果继续,它仍然会创建HTTPS连接,但这样做的风险自负。

为什么浏览器不信任自签名证书:一个图表。
为什么浏览器不信任自签名证书。


由正规证书颁发机构签署的证书


您也可以使用由官方CA签署的证书。这会带来以下复杂情况:

与使用mkcert这样的本地CA技术相比,您还有更多的设置工作要做。
您需要使用您控制的有效域名。这意味着您不能将官方CA用于以下用途:

  • localhost和其他保留域名,如example或test。
  • 任何你无法控制的域名。
  • 无效的顶级域。有关详细信息,请参阅有效顶级域的列表。


反向代理


使用HTTPS访问本地运行的站点的另一个选项是使用反向代理(如ngrok)。这会带来以下风险:

  • 与您共享反向代理URL的任何人都可以访问您的本地开发网站。这有助于将您的项目演示给客户,但也会让未经授权的人共享敏感信息。
  • 一些反向代理服务会收取使用费,因此定价可能是您选择服务的一个因素。
  • 浏览器中的新安全措施可能会影响这些工具的工作方式。


Flag (not recommended)


如果你在Chrome中使用自定义主机名,比如mysite.example,你可以使用一个标志来强制浏览器考虑mysite.exexample的安全性。由于以下原因避免这样做:

  • 您需要100%确保mysite.example始终解析为本地地址。否则,就有泄露生产凭据的风险。
  • 此标志仅适用于Chrome,因此无法跨浏览器进行调试。

非常感谢所有评论家和贡献者的贡献和反馈,尤其是Ryan Slevi、Filippo Valsorda、Milica Mihajlija和Rowan Merewood。🙌

文章链接

标签