对于具有自签名证书(
fetch('https://localhost:8888')
来自undici)的本地运行的HTTP服务器,我该如何做fetch
?
如果您使用 Node.js 内置的
fetch
,您可以在 init 选项中指定 dispatcher
。
您仍然需要安装
undici
(npm install undici
) 才能使用自定义 Agent
。
import { Agent } from 'undici';
await fetch('https://localhost:8888', {
dispatcher: new Agent({
connect: {
rejectUnauthorized: false,
},
}),
});
诀窍是使用
setGlobalDispatcher
(getGlobalDispatcher
可以用来抓取原始的以便以后恢复)。
import {
fetch,
setGlobalDispatcher,
Agent,
} from 'undici'
setGlobalDispatcher(new Agent({
connect: {
rejectUnauthorized: false
}
}))
fetch('https://localhost:8888').then(...)
您还可以使用ProxyAgent类。 ProxyAgent类有一个options.requestTls和options.proxyTls,文档中没有描述。为了使用rejectUnauthorized: false选项,只需像下面这样的代码:
import { ProxyAgent, request } from 'undici'
const proxyAgent = new ProxyAgent('my.proxy.server',{
requestTls: { // this is the key point
rejectUnauthorized: false,
}
})
const { statusCode, body } = await request('http://localhost:3000/foo', { dispatcher: proxyAgent })
for await (const data of body) {
console.log('data', data.toString('utf8'))
}
另请检查测试用例 通过 HTTP 代理到 HTTPS 端点 和代理代理 源代码。这是 固定pr
建议使用
rejectUnauthorized: false
的答案的问题在于,这会使请求不安全。
我建议您从您尝试访问的服务器/站点获取 PEM base64 证书,并在提出请求时通过代理将其包含在内:
const { Agent } = require('undici');
const PEM_CERTS = `{base64 certificate for https://localhost:8888}`;
/*
The certificate content should look like:
-----BEGIN CERTIFICATE-----
base64string
-----END CERTIFICATE-----
*/
fetch('https://localhost:8888', {
headers: {
accept: 'application/json'
},
dispatcher: new Agent({
connect: {
ca: PEM_CERTS
}
})
}).then(response => {
return response.text();
}).then(text => {
console.log(text);
});
您可以通过浏览器访问 https://localhost:8888 来获取 Base64 证书,单击 URL 旁边的“安全”/锁定图标,然后按照浏览器的步骤将证书下载为 CRT 或 PEM。以纯文本形式打开以检索 Base64 内容。
或者通过命令行导出它,但您必须自己将其从 CER 转换为 base64 格式。
或者,您也可以在您的计算机上安装证书,您可能完全不必担心这一点。