首页 > 解决方案 > 使用 TLS 和 PEM 证书从 Axios.js 到 Flask Python HTTPS 服务器的 HTTPS 请求

问题描述

我无法执行从 Axios.js 到 Flask HTTPS 服务器的 HTTPS 请求。

我认为原因可能与 Axios.js 对象的配置方式有关,因为我看到请求使用的是 HTTPS + PEM 证书,但我看不出 Axios.js 实例配置错误的任何原因(请参阅https://github.com/axios/axios#request-config)。

我在运行 Javascript 代码时看到的错误是Error: self signed certificate,这对我来说很奇怪,因为我认为 HTTPS 客户端应该使用PEM自签名证书(例如,像 Web 浏览器)。在此处检查 HTTPS 代理https://nodejs.org/api/https.html#https_https_request_url_options_callback和此处https://nodejs.org/api/tls.html#tls_tls_connect_options_callback似乎我应该设置rejectUnauthorizedfalse. 如果我这样做然后删除这些字段certkey,那么代码可以工作,但这意味着根本不使用 TLS,所以我不确定 TLS 的意义何在。

使用 Axios.js 的 Javascript HTTP(S) 客户端:

const agent = new https.Agent({
  rejectUnauthorized: true,
  cert: fs.readFileSync(`${__dirname}/../../../ssl_cert.crt`),
  key: fs.readFileSync(`${__dirname}/../../../ssl_cert.key`),
})

const myApi = axios.create({
  baseURL: 'https://localhost:5000', // the Flask server
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json'
  },
  httpsAgent: agent,
});

已使用以下命令创建证书:

# generate the 2 files: crt and key
openssl req -newkey rsa:4096 -nodes \
        -keyout ssl_cert.key -x509 -days 365 -out ssl_cert.crt \
        -subj "/C=GB/ST=England/L=London/O=foo/CN=foo"
# inspect the crt file (e.g. check the expiry date)
openssl x509 -text -noout -in ssl_cert.crt

thecrtkeystart with-----BEGIN所以我认为它们应该已经是PEM格式。AFAIK在执行来自 Axios.js 客户端的 HTTPS 请求时,我可以使用该crt文件作为证书。PEM

这是作为后端响应 Javascript 前端的 Python Flask 服务器:

app = Flask(__name__)
ssl_context = (
        "{...}/../ssl_cert.crt",
        "{...}/../ssl_cert.key",
    )

app.run(host='0.0.0.0', debug=True, ssl_context=ssl_context)

标签: sslflaskhttpsaxiospem

解决方案


推荐阅读