我有在 aks 上运行的 Nodejs 应用程序。该应用程序的 6 个 Pod 正在运行。应用程序洞察在 aks 中配置。我在应用程序洞察中遇到异常,说
FetchError:对 https://www.xxxxxxx.com/WebAPI/api/OJJ/Appointments/1 的请求失败,原因:在建立安全 TLS 连接之前,客户端网络套接字已断开连接
我们只是间歇性地收到此异常。 2-3天不会出现错误,然后就会出现这个异常。
为了调试问题,我在aks节点进行了数据包捕获。
LB 中禁用 TLS v1.0 和 v1.1,仅启用 TLS v1.2 和 v1.3。
当我们变得频繁时在aks节点捕获的数据包
无异常情况下aks节点捕获的数据包
成功的通信发生在 TLS v1.3 上,所有失败的通信发生在 v1.0 或 v1.1 上。
问题:我们如何确保应用程序仅通过 TLS v1.2 或 v1.3 与服务器进行通信? 是否需要从应用程序代码、容器映像或 aks 节点配置中完成某些操作。
为了解决间歇性 TLS 问题,您遇到在 AKS 中运行的 Node.js 应用程序,其中使用 TLS v1.3 成功通信,但尝试使用较旧的 TLS 版本时会发生故障,您可以查看以下内容例子-
您的问题 - 是否需要通过应用程序代码完成某些操作? 是的,请确保 Node.js 应用程序发起的每个 HTTPS 请求都指定 TLS v1.2 或 v1.3。这可以使用 Node.js 中的 https 模块,配置
minVersion
和 maxVersion
选项来完成。
const https = require('https');
const fs = require('fs');
const options = {
hostname: 'www.example.com',
port: 443,
path: '/api/data',
method: 'GET',
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem'),
ca: fs.readFileSync('ca.pem'),
minVersion: 'TLSv1.2', // Minimum version of TLS
maxVersion: 'TLSv1.3' // Maximum version of TLS
};
const req = https.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`);
res.on('data', (d) => {
process.stdout.write(d);
});
});
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
});
req.end();
或者,您可以通过将
NODE_OPTIONS
环境变量分别设置为 --tls-min-v1.2
或 --tls-min-v1.3
,将容器映像配置为仅使用 TLS v1.2 或 v1.3。最后,您可以通过修改 Schannel 特定的注册表项将 AKS 节点配置为仅允许 TLS v1.2 和 v1.3,如TLS 1.2 升级工作流程文章中所述
ENV NODE_OPTIONS="--tls-min-v1.2"
参考资料: