如何在Node.js/TypeScript中配置带自签名证书的OTLPMetricExporter
问题解答
1. OTLP gRPC Metric Exporter 是否支持跳过TLS验证?
是的支持,但绝对不推荐在生产环境使用。你使用的是基于gRPC的指标导出器,它底层依赖@grpc/grpc-js库,可以通过专属配置项禁用证书验证。
2. 跳过TLS验证的配置方案
修改导出器初始化代码,通过grpcOptions传入gRPC专属配置,直接使用不安全凭证:
import { MeterProvider } from "@opentelemetry/sdk-metrics"; import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-grpc"; import * as grpc from "@grpc/grpc-js"; import { PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics"; const exporter = new OTLPMetricExporter({ url: "https://otel-collector.mycompany.local:4317", grpcOptions: { // 禁用TLS证书验证 credentials: grpc.credentials.createInsecure(), // 针对自签名证书常见的域名匹配问题,覆盖目标名称 "grpc.ssl_target_name_override": "otel-collector.mycompany.local", "grpc.default_authority": "otel-collector.mycompany.local" } }); const meterProvider = new MeterProvider({ exporters: [exporter], }); // 注意:你之前的代码存在错误,不能直接将exporter传入addMetricReader // 必须使用PeriodicExportingMetricReader这类标准读取器 meterProvider.addMetricReader(new PeriodicExportingMetricReader({ exporter: exporter, exportIntervalMillis: 60000, // 配置1分钟导出一次指标 }));
3. 生产环境推荐的安全配置
跳过验证会引入中间人攻击风险,正确做法是将自签名CA证书纳入信任体系:
方法一:在代码中指定自定义CA证书
将自签名CA证书保存为ca.crt,然后配置gRPC使用该证书验证:
import { readFileSync } from "fs"; import { MeterProvider } from "@opentelemetry/sdk-metrics"; import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-grpc"; import * as grpc from "@grpc/grpc-js"; import { PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics"; // 读取本地CA证书文件 const caCert = readFileSync("./ca.crt"); // 创建基于自定义CA的安全凭证 const credentials = grpc.credentials.createSsl(caCert); const exporter = new OTLPMetricExporter({ url: "https://otel-collector.mycompany.local:4317", grpcOptions: { credentials: credentials, // 如果证书CN与请求域名一致,可省略该配置 "grpc.ssl_target_name_override": "otel-collector.mycompany.local" } }); const meterProvider = new MeterProvider({ exporters: [exporter], }); meterProvider.addMetricReader(new PeriodicExportingMetricReader({ exporter: exporter, exportIntervalMillis: 60000, }));
方法二:通过环境变量全局信任CA证书
启动服务时指定自签名证书路径,Node.js会自动将其加入信任列表,无需修改代码:
NODE_EXTRA_CA_CERTS=./ca.crt node your-app.js
关于UNABLE_TO_VERIFY_LEAF_SIGNATURE错误的说明
这个错误是因为gRPC请求不遵循NODE_TLS_REJECT_UNAUTHORIZED环境变量(gRPC有独立的TLS配置逻辑),且自签名证书的信任链不完整。使用上述gRPC专属凭证配置即可解决该问题。
内容的提问来源于stack exchange,提问作者Amit Yaari
相关产品推荐
相关产品推荐

