繁体   English   中英

如何配置 axios 使用 SSL 证书?

[英]How to configure axios to use SSL certificate?

我正在尝试使用 axios 向 api 端点发出请求,但出现以下错误: Error: unable to verify the first certificate

axios 使用的 https 模块似乎无法验证服务器上使用的 SSL 证书。

用我的浏览器访问服务器时,证书是有效的,我可以看到/下载它。 我也可以通过 https 向浏览器上的 api 发出请求。

我可以通过关闭验证来解决它。 此代码有效。

const result = await axios.post(
    `https://${url}/login`,
    body,
    {
      httpsAgent: new https.Agent({
        rejectUnauthorized: false
      })
    }
  )

问题是,这不会验证 SSL 证书,因此会打开安全漏洞。

如何配置 axios 以信任证书并正确验证它?

老问题,但对那些登陆这里的人来说很重要。 没有专家。 请咨询您当地的安全专家,什么不是。

Axios 是一个 http(s) 客户端,http 客户端通常匿名参与 TLS。 换句话说,服务器接受他们的连接而不识别谁正在尝试连接。 这与说相互 TLS 不同,其中服务器和客户端在完成握手之前相互验证。

互联网是一个可怕的地方,我们希望保护我们的客户免于连接到欺骗性的公共端点。 我们通过确保我们的客户在发送任何私人数据之前识别服务器来做到这一点。

// DO NOT DO THIS IF SHARING PRIVATE DATA WITH SERVICE
const httpsAgent = new https.Agent({ rejectUnauthorized: false });

这通常作为 StackOverflow 上关于任何语言的 https 客户端连接失败的答案发布(并且受到更多人的反对)。 更糟糕的是,它通常可以正常工作,解除对开发者的阻碍,然后他们继续愉快地前进。 然而,虽然他们肯定进了门,但那是谁的门呢? 由于他们选择不验证服务器的身份,他们可怜的客户无法知道他们刚刚与公司内部网建立的连接是否有不良行为者在线监听。

如果服务具有公共 SSL 证书,则通常不需要进一步配置https.Agent ,因为您的操作系统提供了一组公共受信任的 CA 证书。 这通常是您的浏览器配置使用的同一组 CA 证书,这就是为什么默认 axios 客户端可以轻松访问https://google.com的原因。

如果服务具有私有 SSL 证书(自签名用于测试目的或由您公司的私有 CA 签名以保护其内部机密),则必须将 https 代理配置为信任用于签署服务器证书的私有 CA:

const httpsAgent = new https.Agent({ ca: MY_CA_BUNDLE });

其中MY_CA_BUNDLE是一个 CA 证书数组,其中包含您要访问的端点的服务器证书和.pem格式的该证书的完整证书链。 您必须将链中的所有证书包括到信任根。


这些选项记录在哪里?

HTTPS 是基于 TLS/SSL 的 HTTP 协议。 在 Node.js 中,这是作为一个单独的模块实现的。

因此传递给https.Agent的选项是传递给tls.connect()tls.createSecureContext()的选项的合并。

使用 SSL 证书创建自定义代理:

const httpsAgent = new https.Agent({
  rejectUnauthorized: false, // (NOTE: this will disable client verification)
  cert: fs.readFileSync("./usercert.pem"),
  key: fs.readFileSync("./key.pem"),
  passphrase: "YYY"
})

axios.get(url, { httpsAgent })

// or

const instance = axios.create({ httpsAgent })

来自https://github.com/axios/axios/issues/284

对我来说,当我的应用程序在开发模式下运行时,我直接在axios.defaults.options rejectUnauthorized 这很好用。 小心并仅在开发人员模式下使用它。

import https from 'https'
import axios from 'axios'
import config from '~/config'

/**
 * Axios default settings
 */
axios.defaults.baseURL = config.apiURL

/**
 * Disable only in development mode
 */
if (process.env.NODE_ENV === 'development') {
  const httpsAgent = new https.Agent({
    rejectUnauthorized: false,
  })
  axios.defaults.httpsAgent = httpsAgent
  // eslint-disable-next-line no-console
  console.log(process.env.NODE_ENV, `RejectUnauthorized is disabled.`)
}

这些配置对我有用(在相互身份验证场景中)。

const httpsAgent = new https.Agent({
  ca: fs.readFileSync("./resource/bundle.crt"),        
  cert: fs.readFileSync("./resrouce/thirdparty.crt"),
  key: fs.readFileSync("./resource/key.pem"), 
})

注意:bundle.crt 是根据提供的证书(根证书、中间证书、最终入口证书)准备的。 不幸的是,在这方面没有找到明确的文件。

这很脏,但是在脚本的顶部,只需输入:

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';

这基本上告诉节点不要检查 SSL 证书,当您在开发中遇到自签名证书被拒绝时,这非常方便。

请不要在生产中使用它。

这对我有用,将axios与nodejs + express一起使用

exports.test_ssl = async (req,res) => { 
   
let cert_file = fs.readFileSync("./ssl/my_self_signed_certificate.crt")
let ca_file = fs.readFileSync("./ssl/my_self_signed_certificate_ca.crt")
const agent = new https.Agent({
    requestCert: true,
    rejectUnauthorized: true,
    cert: cert_file,
    ca: ca_file
});
const options = {
    url: `https://51.195.45.154/test`,  // <---this is  a fake ip do not bother
    method: "POST",
    httpsAgent : agent,
    headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/txt;charset=UTF-8'
    },
    data: {}
};


console.log(cert_file.toString())

axios(options)
.then(response => {
    payload = response.data ;
    return res.status(200).send({"status":1});
}).catch(err => {
    console.log(err);
    return false
});

}

这对我有用:

import axios from 'axios'
import https from 'https'

const headers = {};

const httpsAgent = new https.Agent({
  ca: fs.readFileSync('./certs/cert.pem'),
  cert: fs.readFileSync('./certs/cert.pem'),
})

const data = await axios.get(url, { httpsAgent, headers })

const https = require('https');
const axios = require('axios')

const CA = "-----BEGIN CERTIFICATE-----$$$$$-----END CERTIFICATE-----"
const url = "bla"
const httpsAgent = new https.Agent({
  ca: CA
});

const response = await axios.get(url, { httpsAgent });

这对我有用。

下午好,

我遇到了同样的问题,我设法使用以下代码解决了这个问题:

const https = require('https');
var axios = require("axios").default;

const Agent = new https.Agent({
rejectUnauthorized: false
})

async function ABC(text) {
var detect = {
method: 'POST',
url: URL + '/Detect',
params: {'api-version': '3.0'},
httpsAgent: Agent,
headers: headers,
data: [{Text: text}]
};

await axios.request(ABC).then(function (response) { CODE HERE })
.catch((er)=>{
console.log(er)
 }
});

早上好亲爱的。

我的问题如下:

“启用验证第一个证书”,错误代码为“ENABLE_TO_VERIFY_LEAF_SIGNATURE”。

他们向我发送了带有 .pfx 扩展名的证书,并使用以下命令生成了 .pem 证书和带有 .pem 扩展名的密钥。

我附上命令。

  • openssl pkcs12 -in certificate.pfx -nocerts -out key.pem -nodes
  • openssl pkcs12 -in certificate.pfx -nokeys -out certificate.pem

需要注意的是,我是使用 axios 来发出请求的。

我在 axios 中附加了我的代理配置。

常量 httpsAgent = 新的 https.Agent ({
pfx: fs.readFileSync ("path.pfx"), passphrase: 'password', requestCert: true, rejectUnauthorized: true });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM