我无法执行从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://nodejs.org/api/https.html#https_https_request_url_options_callback和这里https://nodejs.org/api/tls.html#tls_tls_connect_options_callback检查HTTPS代理,看来我应该将rejectUnauthorized
设置为false
。如果我这样做,然后删除那些字段cert
和key
,则代码可以正常工作,但是那将意味着根本不使用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
crt
和key
都以-----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)