Webpack DevServer -> 代理 HTTPS 资源 -> UNABLE_TO_VERIFY_LEAF_SIGNATURE

问题描述 投票:0回答:2

我正在使用具有以下设置的 Webpack DevServer:

devServer: {
    proxy: {
        '*': {
            target: 'https://localhost:44369',
            secure: true
        }
    },
    port: 8080,
    host: '0.0.0.0',
    hot: true,
    https: false
}

https://webpack.js.org/configuration/dev-server/#devserver-https

它与

HTTP
配合得很好,但是当我现在将代理切换到
HTTPS
时,我开始出现错误。

在命令提示符中收到以下消息:

[HPM] 尝试代理请求/来自时发生错误 本地主机:8080 到 https://localhost:44369 (UNABLE_TO_VERIFY_LEAF_SIGNATURE) (https://nodejs.org/api/errors.html#errors_common_system_errors

我尝试将节点

NODE_TLS_REJECT_UNAUTHORIZED
设置为
0
但这没有帮助。

new webpack.DefinePlugin({
    'process.env.NODE_TLS_REJECT_UNAUTHORIZED': 0
})

有什么方法可以访问生成的证书 CA 并将其添加到受信任的根证书颁发机构吗?这会有帮助吗?还是我还需要改变其他事情?

如果我将

https
切换到
true
我会得到同样的错误。

生成 SSL 证书

...

[HPM] 尝试代理请求/来自时发生错误 本地主机:8080 到 https://localhost:44369 (UNABLE_TO_VERIFY_LEAF_SIGNATURE) (https://nodejs.org/api/errors.html#errors_common_system_errors

当我在 Chrome 中访问所需资源时,我也收到以下错误:

enter image description here

更新:

我现在已将 webpack-dev-server 设置为使用与原始 Web 服务器 (https://localhost:44369) 相同的证书。我已验证两者之间的

Thumbprint
Serial number
是相同的。

https://webpack.js.org/configuration/dev-server/#devserver-pfx

https: true,
pfx: fs.readFileSync(path.resolve(__dirname, "../Client.WebProxy/App_Data/Certificate/") + '\\localhost.pfx'),
pfxPassphrase: 'securePassword'

enter image description here

我也尝试使用

ssl-root-cas
注入证书,但我仍然遇到相同的错误。

var sslRootCAs = require('ssl-root-cas/latest')
sslRootCAs.inject();

也尝试过这个:

target: 'https://[::1]:44369',

https://github.com/saikat/react-apollo-starter-kit/issues/20#issuecomment-316651403

var rootCas = require('ssl-root-cas/latest').create();
rootCas.addFile(path.resolve(__dirname, "../Client.WebProxy/App_Data/Certificate/") + '\\localhost.pem');
require('https').globalAgent.options.ca = rootCas;

https://www.npmjs.com/package/ssl-root-cas

https: {
    key: fs.readFileSync(path.resolve(__dirname, "../Client.WebProxy/App_Data/Certificate/") + '\\localhost.key'),
    cert: fs.readFileSync(path.resolve(__dirname, "../Client.WebProxy/App_Data/Certificate/") + '\\localhost.crt'),
    ca: fs.readFileSync(path.resolve(__dirname, "../Client.WebProxy/App_Data/Certificate/") + '\\localhost.pem'),
}

https://webpack.js.org/configuration/dev-server/#devserver-https

node.js webpack https proxy webpack-dev-server
2个回答
48
投票

为此花费了很多时间,但最终却如此简单。它的工作原理是将

secure
设置为
false
作为代理,然后通过 http 访问 webpack-dev-server。

https://webpack.js.org/configuration/dev-server/#devserverproxy

devServer: {
    proxy: {
        '*': {
            target: 'https://localhost:44369',
            secure: false
        }
    },
    port: 8080,
    host: '0.0.0.0',
    hot: true,
}

2
投票

就我而言,使用

secure: false
不足以使错误消失。如果您使用的是 基于名称的虚拟主机,您可能需要将
changeOrigin
设置为 true,以不保留主机标头的来源。

devServer: {
    proxy: {
        '/path': {
            target: 'https://backend-server',
            secure: true,
            changeOrigin: true // <-
        }
    },
    ...
}

参考:https://webpack.js.org/configuration/dev-server/#devserverproxy

© www.soinside.com 2019 - 2024. All rights reserved.