在本地主机上访问 https

hyp*_*hen 104 ssl https vite

我正在尝试让 https 在我的 Vite 本地主机环境中工作。Chrome 显示无效证书错误。

我已经像这样设置了 vite.config.js 文件:

import { defineConfig  } from 'vite'
import vue from '@vitejs/plugin-vue'
import fs from 'fs';

export default defineConfig({
  resolve: { alias: { '@': '/src' } },
  plugins: [vue()],
  https: {
    key: fs.readFileSync('RootCA-key.pem'),
    cert: fs.readFileSync('RootCA.pem')
  }
})
Run Code Online (Sandbox Code Playgroud)

当我运行它时npm run dev -- --https,它按预期工作,我没有从 Vite 收到任何问题。但是,Chrome 显示无效证书。

我使用 openssl 创建证书文件,这给了我 .crt、.pem 和 .key 文件。它们都不是二进制的,因此我将 .key 文件重命名为 RootCA-key.pem。我尝试使用 RootCA.pem 文件作为证书,并将 RootCA.crt 文件重命名为 RootCA-cert.pem 并将其用作证书。

作为临时解决方法,我在 Chrome 中启用了不安全的本地主机 (chrome://flags/#allow-insecure-localhost),这至少消除了警告。

Dan*_*ton 161

最简单的方法是使用vite-plugin-mkcert包。

npm i vite-plugin-mkcert -D
Run Code Online (Sandbox Code Playgroud)

vite.config.js

import { defineConfig } from 'vite'
import mkcert from 'vite-plugin-mkcert'

export default defineConfig({
  server: { https: true }, // Not needed for Vite 5+
  plugins: [ mkcert() ]
})
Run Code Online (Sandbox Code Playgroud)

当您运行本地 vite 开发服务器时,系统可能会第一次提示您输入密码。然后它会将本地证书安装到您的系统和许多已安装的浏览器上。

简单的!

  • 谢谢,解决了我的问题。在遇到这个问题之前,我花了 12 个小时以上尝试解决“ERR_SSL_PROTOCOL_ERROR”错误。 (2认同)

Her*_*ine 136

Vite 文档建议使用他们的官方包:@vitejs/plugin-basic-ssl

\n

文档: https: //vitejs.dev/config/server-options.html#server-https

\n

你需要安装它

\n
npm install -D @vitejs/plugin-basic-ssl\n
Run Code Online (Sandbox Code Playgroud)\n

然后在你的vite.config.ts

\n
npm install -D @vitejs/plugin-basic-ssl\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x9a\xa0\xef\xb8\x8f 这是用于您的开发环境,请勿在生产中使用它。您在生产中需要自己的证书(例如使用 nginx 和 let's encrypt)。

\n

  • 他们实际上不建议这样做。根据链接页面,他们建议使用您自己的证书。 (6认同)
  • @JulienReszka这是一个本地证书,所以是的,chrome无法验证它,你需要手动批准它。单击错误页面上的“高级参数”,然后单击“继续访问 127.0.0.1”。 (4认同)
  • Chrome 表示使用此证书时证书无效 (3认同)
  • 这应该是公认的答案,因为它非常适合开发环境,并且实际上是文档建议的。生产方面,那就是另一个故事了。 (2认同)
  • 我添加了这个,所以它只在开发上运行: ...(process.env.NODE_ENV === "development" ? [basicSsl()] : []), (2认同)

Mun*_*shi 55

也许问题在于密钥和证书文件。我正在使用具有相同选项的mkcert库,它对我来说效果很好。此外,无需手动信任证书。

您可以按照以下步骤操作:

# Step: 1
# Install mkcert tool - macOS; you can see the mkcert repo for details
brew install mkcert

# Step: 2
# Install nss (only needed if you use Firefox)
brew install nss

# Step: 3
# Setup mkcert on your machine (creates a CA)
mkcert -install

# Step: 4 (Final)
# at the project root directory run the following command
mkdir -p .cert && mkcert -key-file ./.cert/key.pem -cert-file ./.cert/cert.pem 'localhost'
Run Code Online (Sandbox Code Playgroud)

并更新你vite.config.js

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import fs from 'fs';

// https://vitejs.dev/config/
export default defineConfig({
  server: {
    https: {
      key: fs.readFileSync('./.cert/key.pem'),
      cert: fs.readFileSync('./.cert/cert.pem'),
    },
  },
  plugins: [react()],
});

Run Code Online (Sandbox Code Playgroud)

yarn dev上述步骤应该可以解决运行启动开发服务器时的 HTTPS 问题。

另外:我使用 npm 脚本来让我的团队成员轻松创建证书。

// in package.json
"scripts": {
    "dev": "vite",
    "build": "tsc && vite build",
    "serve": "vite preview",

    "cert": "rm -rf .cert && mkdir -p .cert && mkcert -key-file ./.cert/key.pem -cert-file ./.cert/cert.pem 'localhost'"

  },

Run Code Online (Sandbox Code Playgroud)

  • 因为我很长一段时间都忽略了这一点:确保你不会不小心同时使用 vite 的 basicSsl() 。在这种情况下,vite 将永远不会提供您自己的证书,并且始终生成临时证书。在我摆脱它之后,我的 openssl 3.x 证书在 vite 上工作得很好。 (3认同)
  • 截至 2023 年 6 月 8 日,这对我有效:) 即使在勇敢中 (2认同)

Fab*_*ert 5

Daniel Elkington 的上述回答在 macOS 上对我来说就像一个魅力。然而,对于 Docker 容器内的 Vue/Vite,它对我不起作用。

下面的这种方法对我有用(在 macOS 上和 Docker 容器内):

让事情正常工作(通过重新)使用我使用 mkcert 为本地主机生成的密钥和证书文件,例如:

// vite.config.js
import { fileURLToPath, URL } from "node:url";

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";

// https://vitejs.dev/config/
export default defineConfig({
  server: {
    https: {
      key: '/path/to/some_folder/ssl/SSLforMyHosts-key.pem',
      cert: '/path/to/some_folder/ssl/SSLforMyHosts-certificate.pem',
    }
  },
  plugins: [
    vue(),
  ],
  resolve: {
    alias: {
      "@": fileURLToPath(new URL("./src", import.meta.url)),
    },
  },
});
Run Code Online (Sandbox Code Playgroud)

mkcert使用以下命令为 localhost(以及用于本地开发的更多测试域)生成密钥和证书文件:

cd /Users/your_name/some_folder/ssl
mkcert \
  -cert-file SSLforMyHosts-certificate.pem -key-file SSLforMyHosts-key.pem \
  localhost 127.0.0.1 ::1 \
  some-other-local-dev-site.localhost \
  example.localhost
Run Code Online (Sandbox Code Playgroud)

另请参阅:有关安装自签名证书的回答